@hanzo/booker 8.3.0 → 8.3.2

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 (166) hide show
  1. package/README.md +6 -6
  2. package/dist/cjs/Booker.js +23 -0
  3. package/dist/cjs/Booker.js.map +1 -0
  4. package/dist/cjs/BookingForm.js +32 -0
  5. package/dist/cjs/BookingForm.js.map +1 -0
  6. package/dist/cjs/CalendarEmbed.js +20 -0
  7. package/dist/cjs/CalendarEmbed.js.map +1 -0
  8. package/dist/cjs/Confirmation.js +34 -0
  9. package/dist/cjs/Confirmation.js.map +1 -0
  10. package/dist/cjs/EventHeader.js +31 -0
  11. package/dist/cjs/EventHeader.js.map +1 -0
  12. package/dist/cjs/MonthCalendar.js +24 -0
  13. package/dist/cjs/MonthCalendar.js.map +1 -0
  14. package/dist/cjs/TimeSlots.js +21 -0
  15. package/dist/cjs/TimeSlots.js.map +1 -0
  16. package/dist/cjs/client.js +113 -0
  17. package/dist/cjs/client.js.map +1 -0
  18. package/dist/cjs/hooks.js +121 -0
  19. package/dist/cjs/hooks.js.map +1 -0
  20. package/dist/cjs/index.js +55 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/package.json +1 -0
  23. package/dist/cjs/time.js +129 -0
  24. package/dist/cjs/time.js.map +1 -0
  25. package/dist/cjs/useBooker.js +135 -0
  26. package/dist/cjs/useBooker.js.map +1 -0
  27. package/dist/esm/Booker.js +20 -0
  28. package/dist/esm/Booker.js.map +1 -0
  29. package/dist/esm/BookingForm.js +29 -0
  30. package/dist/esm/BookingForm.js.map +1 -0
  31. package/dist/esm/CalendarEmbed.js +17 -0
  32. package/dist/esm/CalendarEmbed.js.map +1 -0
  33. package/dist/esm/Confirmation.js +31 -0
  34. package/dist/esm/Confirmation.js.map +1 -0
  35. package/dist/esm/EventHeader.js +28 -0
  36. package/dist/esm/EventHeader.js.map +1 -0
  37. package/dist/esm/MonthCalendar.js +21 -0
  38. package/dist/esm/MonthCalendar.js.map +1 -0
  39. package/dist/esm/TimeSlots.js +18 -0
  40. package/dist/esm/TimeSlots.js.map +1 -0
  41. package/dist/esm/client.js +104 -0
  42. package/dist/esm/client.js.map +1 -0
  43. package/dist/esm/hooks.js +115 -0
  44. package/dist/esm/hooks.js.map +1 -0
  45. package/dist/esm/index.js +18 -13
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/time.js +113 -0
  48. package/dist/esm/time.js.map +1 -0
  49. package/dist/esm/useBooker.js +132 -0
  50. package/dist/esm/useBooker.js.map +1 -0
  51. package/package.json +28 -28
  52. package/src/Booker.tsx +7 -7
  53. package/src/BookingForm.tsx +2 -2
  54. package/src/CalendarEmbed.tsx +7 -7
  55. package/src/Confirmation.tsx +4 -4
  56. package/src/EventHeader.tsx +1 -1
  57. package/src/MonthCalendar.tsx +1 -1
  58. package/src/TimeSlots.tsx +2 -2
  59. package/src/hooks.ts +1 -1
  60. package/src/index.ts +11 -11
  61. package/src/useBooker.ts +9 -4
  62. package/types/Booker.d.ts +2 -2
  63. package/types/Booker.d.ts.map +1 -1
  64. package/types/BookingForm.d.ts +2 -2
  65. package/types/BookingForm.d.ts.map +1 -1
  66. package/types/CalendarEmbed.d.ts +2 -2
  67. package/types/CalendarEmbed.d.ts.map +1 -1
  68. package/types/Confirmation.d.ts +2 -2
  69. package/types/Confirmation.d.ts.map +1 -1
  70. package/types/EventHeader.d.ts +2 -2
  71. package/types/EventHeader.d.ts.map +1 -1
  72. package/types/MonthCalendar.d.ts +1 -1
  73. package/types/MonthCalendar.d.ts.map +1 -1
  74. package/types/TimeSlots.d.ts +2 -2
  75. package/types/TimeSlots.d.ts.map +1 -1
  76. package/types/client.d.ts.map +1 -1
  77. package/types/hooks.d.ts +1 -1
  78. package/types/hooks.d.ts.map +1 -1
  79. package/types/index.d.ts +11 -11
  80. package/types/index.d.ts.map +1 -1
  81. package/types/useBooker.d.ts +3 -3
  82. package/types/useBooker.d.ts.map +1 -1
  83. package/dist/cjs/Booker.cjs +0 -153
  84. package/dist/cjs/Booker.native.js +0 -158
  85. package/dist/cjs/Booker.native.js.map +0 -1
  86. package/dist/cjs/BookingForm.cjs +0 -197
  87. package/dist/cjs/BookingForm.native.js +0 -203
  88. package/dist/cjs/BookingForm.native.js.map +0 -1
  89. package/dist/cjs/CalendarEmbed.cjs +0 -121
  90. package/dist/cjs/CalendarEmbed.native.js +0 -125
  91. package/dist/cjs/CalendarEmbed.native.js.map +0 -1
  92. package/dist/cjs/Confirmation.cjs +0 -177
  93. package/dist/cjs/Confirmation.native.js +0 -185
  94. package/dist/cjs/Confirmation.native.js.map +0 -1
  95. package/dist/cjs/EventHeader.cjs +0 -112
  96. package/dist/cjs/EventHeader.native.js +0 -118
  97. package/dist/cjs/EventHeader.native.js.map +0 -1
  98. package/dist/cjs/MonthCalendar.cjs +0 -177
  99. package/dist/cjs/MonthCalendar.native.js +0 -191
  100. package/dist/cjs/MonthCalendar.native.js.map +0 -1
  101. package/dist/cjs/TimeSlots.cjs +0 -119
  102. package/dist/cjs/TimeSlots.native.js +0 -126
  103. package/dist/cjs/TimeSlots.native.js.map +0 -1
  104. package/dist/cjs/client.cjs +0 -136
  105. package/dist/cjs/client.native.js +0 -267
  106. package/dist/cjs/client.native.js.map +0 -1
  107. package/dist/cjs/hooks.cjs +0 -193
  108. package/dist/cjs/hooks.native.js +0 -221
  109. package/dist/cjs/hooks.native.js.map +0 -1
  110. package/dist/cjs/index.cjs +0 -71
  111. package/dist/cjs/index.native.js +0 -74
  112. package/dist/cjs/index.native.js.map +0 -1
  113. package/dist/cjs/time.cjs +0 -145
  114. package/dist/cjs/time.native.js +0 -150
  115. package/dist/cjs/time.native.js.map +0 -1
  116. package/dist/cjs/useBooker.cjs +0 -151
  117. package/dist/cjs/useBooker.native.js +0 -173
  118. package/dist/cjs/useBooker.native.js.map +0 -1
  119. package/dist/esm/Booker.mjs +0 -128
  120. package/dist/esm/Booker.mjs.map +0 -1
  121. package/dist/esm/Booker.native.js +0 -130
  122. package/dist/esm/Booker.native.js.map +0 -1
  123. package/dist/esm/BookingForm.mjs +0 -172
  124. package/dist/esm/BookingForm.mjs.map +0 -1
  125. package/dist/esm/BookingForm.native.js +0 -175
  126. package/dist/esm/BookingForm.native.js.map +0 -1
  127. package/dist/esm/CalendarEmbed.mjs +0 -96
  128. package/dist/esm/CalendarEmbed.mjs.map +0 -1
  129. package/dist/esm/CalendarEmbed.native.js +0 -97
  130. package/dist/esm/CalendarEmbed.native.js.map +0 -1
  131. package/dist/esm/Confirmation.mjs +0 -152
  132. package/dist/esm/Confirmation.mjs.map +0 -1
  133. package/dist/esm/Confirmation.native.js +0 -157
  134. package/dist/esm/Confirmation.native.js.map +0 -1
  135. package/dist/esm/EventHeader.mjs +0 -87
  136. package/dist/esm/EventHeader.mjs.map +0 -1
  137. package/dist/esm/EventHeader.native.js +0 -90
  138. package/dist/esm/EventHeader.native.js.map +0 -1
  139. package/dist/esm/MonthCalendar.mjs +0 -152
  140. package/dist/esm/MonthCalendar.mjs.map +0 -1
  141. package/dist/esm/MonthCalendar.native.js +0 -163
  142. package/dist/esm/MonthCalendar.native.js.map +0 -1
  143. package/dist/esm/TimeSlots.mjs +0 -94
  144. package/dist/esm/TimeSlots.mjs.map +0 -1
  145. package/dist/esm/TimeSlots.native.js +0 -98
  146. package/dist/esm/TimeSlots.native.js.map +0 -1
  147. package/dist/esm/client.mjs +0 -104
  148. package/dist/esm/client.mjs.map +0 -1
  149. package/dist/esm/client.native.js +0 -232
  150. package/dist/esm/client.native.js.map +0 -1
  151. package/dist/esm/hooks.mjs +0 -165
  152. package/dist/esm/hooks.mjs.map +0 -1
  153. package/dist/esm/hooks.native.js +0 -190
  154. package/dist/esm/hooks.native.js.map +0 -1
  155. package/dist/esm/index.mjs +0 -13
  156. package/dist/esm/index.mjs.map +0 -1
  157. package/dist/esm/index.native.js +0 -13
  158. package/dist/esm/index.native.js.map +0 -1
  159. package/dist/esm/time.mjs +0 -107
  160. package/dist/esm/time.mjs.map +0 -1
  161. package/dist/esm/time.native.js +0 -109
  162. package/dist/esm/time.native.js.map +0 -1
  163. package/dist/esm/useBooker.mjs +0 -126
  164. package/dist/esm/useBooker.mjs.map +0 -1
  165. package/dist/esm/useBooker.native.js +0 -145
  166. package/dist/esm/useBooker.native.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ // Data plane for the Hanzo Calendar (Cal API-v2 shapes).
2
+ // Pure fetch layer — no React, no DOM. Runs on web and React Native.
3
+ export const DEFAULT_API_URL = 'https://api.hanzo.ai/v1/calendar';
4
+ export const CAL_API_VERSION = '2024-08-13';
5
+ /** Error carrying the HTTP status; `conflict` marks a 409 (slot just taken). */
6
+ export class CalendarError extends Error {
7
+ constructor(message, status) {
8
+ super(message);
9
+ this.name = 'CalendarError';
10
+ this.status = status;
11
+ this.conflict = status === 409;
12
+ }
13
+ }
14
+ function messageOf(body, status) {
15
+ const b = body;
16
+ return b?.error?.message || b?.message || `Request failed (${status})`;
17
+ }
18
+ async function readJson(res) {
19
+ return res.json().catch(() => null);
20
+ }
21
+ async function getJson(url, signal) {
22
+ const res = await fetch(url, { headers: { Accept: 'application/json' }, signal });
23
+ const body = await readJson(res);
24
+ if (!res.ok)
25
+ throw new CalendarError(messageOf(body, res.status), res.status);
26
+ return body.data;
27
+ }
28
+ function normalizeEventType(raw) {
29
+ const length = raw.length ??
30
+ raw.lengthInMinutes ??
31
+ raw.durationMinutes ??
32
+ 30;
33
+ return {
34
+ id: Number(raw.id ?? 0),
35
+ slug: String(raw.slug ?? ''),
36
+ title: String(raw.title ?? ''),
37
+ description: String(raw.description ?? ''),
38
+ length,
39
+ locations: raw.locations ?? [],
40
+ price: Number(raw.price ?? 0),
41
+ currency: String(raw.currency ?? 'usd'),
42
+ profile: raw.profile,
43
+ };
44
+ }
45
+ export async function fetchEventType(api, eventSlug, username, signal) {
46
+ const url = `${api}/atoms/event-types/${encodeURIComponent(eventSlug)}/public?username=${encodeURIComponent(username)}`;
47
+ const raw = await getJson(url, signal);
48
+ return normalizeEventType(raw);
49
+ }
50
+ export async function fetchSlots(api, input, signal) {
51
+ const q = new URLSearchParams({
52
+ eventTypeSlug: input.eventTypeSlug,
53
+ usernameList: input.username,
54
+ startTime: input.startTime,
55
+ endTime: input.endTime,
56
+ timeZone: input.timeZone,
57
+ });
58
+ const data = await getJson(`${api}/slots/available?${q.toString()}`, signal);
59
+ // API returns { data: { slots: {...} } }; tolerate a bare map too.
60
+ const slots = data.slots ?? data;
61
+ return slots ?? {};
62
+ }
63
+ export async function createBooking(api, input, signal) {
64
+ const res = await fetch(`${api}/bookings`, {
65
+ method: 'POST',
66
+ headers: {
67
+ 'Content-Type': 'application/json',
68
+ Accept: 'application/json',
69
+ 'cal-api-version': CAL_API_VERSION,
70
+ },
71
+ body: JSON.stringify({
72
+ eventTypeSlug: input.eventTypeSlug,
73
+ user: input.username,
74
+ start: input.start,
75
+ timeZone: input.timeZone,
76
+ responses: input.responses,
77
+ }),
78
+ signal,
79
+ });
80
+ const body = await readJson(res);
81
+ if (!res.ok)
82
+ throw new CalendarError(messageOf(body, res.status), res.status);
83
+ return body.data;
84
+ }
85
+ export async function fetchBooking(api, uid, signal) {
86
+ return getJson(`${api}/bookings/${encodeURIComponent(uid)}`, signal);
87
+ }
88
+ export async function cancelBooking(api, uid, reason, signal) {
89
+ const res = await fetch(`${api}/bookings/${encodeURIComponent(uid)}/cancel`, {
90
+ method: 'POST',
91
+ headers: {
92
+ 'Content-Type': 'application/json',
93
+ Accept: 'application/json',
94
+ 'cal-api-version': CAL_API_VERSION,
95
+ },
96
+ body: JSON.stringify({ reason: reason ?? '' }),
97
+ signal,
98
+ });
99
+ const body = await readJson(res);
100
+ if (!res.ok)
101
+ throw new CalendarError(messageOf(body, res.status), res.status);
102
+ return body.data;
103
+ }
104
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ // React data hooks over the client. useState/useEffect only — no query lib.
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { createBooking, fetchBooking, fetchEventType, fetchSlots, CalendarError, } from './client.js';
4
+ export function useEventType(api, eventSlug, username) {
5
+ const [state, setState] = useState({
6
+ data: null,
7
+ loading: true,
8
+ error: null,
9
+ });
10
+ useEffect(() => {
11
+ const ctrl = new AbortController();
12
+ setState({ data: null, loading: true, error: null });
13
+ fetchEventType(api, eventSlug, username, ctrl.signal)
14
+ .then((data) => setState({ data, loading: false, error: null }))
15
+ .catch((err) => {
16
+ if (ctrl.signal.aborted)
17
+ return;
18
+ setState({ data: null, loading: false, error: errorText(err) });
19
+ });
20
+ return () => ctrl.abort();
21
+ }, [api, eventSlug, username]);
22
+ return state;
23
+ }
24
+ export function useAvailableSlots(api, query) {
25
+ const { eventTypeSlug, username, startTime, endTime, timeZone, enabled = true } = query;
26
+ const [state, setState] = useState({
27
+ data: null,
28
+ loading: enabled,
29
+ error: null,
30
+ });
31
+ const [nonce, setNonce] = useState(0);
32
+ const refetch = useCallback(() => setNonce((n) => n + 1), []);
33
+ useEffect(() => {
34
+ if (!enabled)
35
+ return;
36
+ const ctrl = new AbortController();
37
+ setState((s) => ({ data: s.data, loading: true, error: null }));
38
+ fetchSlots(api, { eventTypeSlug, username, startTime, endTime, timeZone }, ctrl.signal)
39
+ .then((data) => setState({ data, loading: false, error: null }))
40
+ .catch((err) => {
41
+ if (ctrl.signal.aborted)
42
+ return;
43
+ setState({ data: null, loading: false, error: errorText(err) });
44
+ });
45
+ return () => ctrl.abort();
46
+ }, [api, eventTypeSlug, username, startTime, endTime, timeZone, enabled, nonce]);
47
+ return { ...state, refetch };
48
+ }
49
+ export function useCreateBooking(api) {
50
+ const [submitting, setSubmitting] = useState(false);
51
+ const [error, setError] = useState(null);
52
+ const [conflict, setConflict] = useState(false);
53
+ const mounted = useRef(true);
54
+ useEffect(() => {
55
+ mounted.current = true;
56
+ return () => {
57
+ mounted.current = false;
58
+ };
59
+ }, []);
60
+ const reset = useCallback(() => {
61
+ setError(null);
62
+ setConflict(false);
63
+ }, []);
64
+ const submit = useCallback(async (input) => {
65
+ setSubmitting(true);
66
+ setError(null);
67
+ setConflict(false);
68
+ try {
69
+ const booking = await createBooking(api, input);
70
+ return { ok: true, booking };
71
+ }
72
+ catch (err) {
73
+ const isConflict = err instanceof CalendarError && err.conflict;
74
+ const message = errorText(err);
75
+ if (mounted.current) {
76
+ setError(message);
77
+ setConflict(isConflict);
78
+ }
79
+ return { ok: false, conflict: isConflict, message };
80
+ }
81
+ finally {
82
+ if (mounted.current)
83
+ setSubmitting(false);
84
+ }
85
+ }, [api]);
86
+ return { submit, submitting, error, conflict, reset };
87
+ }
88
+ export function useBooking(api, uid) {
89
+ const [state, setState] = useState({
90
+ data: null,
91
+ loading: !!uid,
92
+ error: null,
93
+ });
94
+ useEffect(() => {
95
+ if (!uid)
96
+ return;
97
+ const ctrl = new AbortController();
98
+ setState({ data: null, loading: true, error: null });
99
+ fetchBooking(api, uid, ctrl.signal)
100
+ .then((data) => setState({ data, loading: false, error: null }))
101
+ .catch((err) => {
102
+ if (ctrl.signal.aborted)
103
+ return;
104
+ setState({ data: null, loading: false, error: errorText(err) });
105
+ });
106
+ return () => ctrl.abort();
107
+ }, [api, uid]);
108
+ return state;
109
+ }
110
+ function errorText(err) {
111
+ if (err instanceof Error)
112
+ return err.message;
113
+ return 'Something went wrong';
114
+ }
115
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -1,13 +1,18 @@
1
- import { Booker } from "./Booker.mjs";
2
- import { CalendarEmbed } from "./CalendarEmbed.mjs";
3
- import { Confirmation } from "./Confirmation.mjs";
4
- import { EventHeader } from "./EventHeader.mjs";
5
- import { MonthCalendar } from "./MonthCalendar.mjs";
6
- import { TimeSlots } from "./TimeSlots.mjs";
7
- import { BookingForm } from "./BookingForm.mjs";
8
- import { useBooker } from "./useBooker.mjs";
9
- import { useEventType, useAvailableSlots, useCreateBooking, useBooking } from "./hooks.mjs";
10
- import { DEFAULT_API_URL, CAL_API_VERSION, CalendarError, fetchEventType, fetchSlots, createBooking, fetchBooking, cancelBooking } from "./client.mjs";
11
- import { visitorTimeZone, ymd, monthMatrix, monthRange, weekdayLabels, formatMonthLabel, formatDayLong, formatSlotTime, formatBookingWhen, dateFromKey, startOfMonth, addMonths, sameMonth, isBeforeToday } from "./time.mjs";
12
- export { Booker, BookingForm, CAL_API_VERSION, CalendarEmbed, CalendarError, Confirmation, DEFAULT_API_URL, EventHeader, MonthCalendar, TimeSlots, addMonths, cancelBooking, createBooking, dateFromKey, fetchBooking, fetchEventType, fetchSlots, formatBookingWhen, formatDayLong, formatMonthLabel, formatSlotTime, isBeforeToday, monthMatrix, monthRange, sameMonth, startOfMonth, useAvailableSlots, useBooker, useBooking, useCreateBooking, useEventType, visitorTimeZone, weekdayLabels, ymd };
13
- //# sourceMappingURL=index.js.map
1
+ // @hanzo/calendar universal (web + native) booking UI on the Hanzo Calendar
2
+ // backend, built with hanzogui primitives.
3
+ export { Booker } from './Booker.js';
4
+ export { CalendarEmbed } from './CalendarEmbed.js';
5
+ export { Confirmation } from './Confirmation.js';
6
+ // Composable sub-views (use these to build a custom flow).
7
+ export { EventHeader } from './EventHeader.js';
8
+ export { MonthCalendar } from './MonthCalendar.js';
9
+ export { TimeSlots } from './TimeSlots.js';
10
+ export { BookingForm } from './BookingForm.js';
11
+ // Orchestration hook + data hooks.
12
+ export { useBooker, } from './useBooker.js';
13
+ export { useEventType, useAvailableSlots, useCreateBooking, useBooking, } from './hooks.js';
14
+ // Data plane.
15
+ export { DEFAULT_API_URL, CAL_API_VERSION, CalendarError, fetchEventType, fetchSlots, createBooking, fetchBooking, cancelBooking, } from './client.js';
16
+ // Time plane (Intl/Date helpers).
17
+ export { visitorTimeZone, ymd, monthMatrix, monthRange, weekdayLabels, formatMonthLabel, formatDayLong, formatSlotTime, formatBookingWhen, dateFromKey, startOfMonth, addMonths, sameMonth, isBeforeToday, } from './time.js';
18
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Booker","CalendarEmbed","Confirmation","EventHeader","MonthCalendar","TimeSlots","BookingForm","useBooker","useEventType","useAvailableSlots","useCreateBooking","useBooking","DEFAULT_API_URL","CAL_API_VERSION","CalendarError","fetchEventType","fetchSlots","createBooking","fetchBooking","cancelBooking","visitorTimeZone","ymd","monthMatrix","monthRange","weekdayLabels","formatMonthLabel","formatDayLong","formatSlotTime","formatBookingWhen","dateFromKey","startOfMonth","addMonths","sameMonth","isBeforeToday"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAGA,SAASA,MAAA,QAAgC;AACzC,SAASC,aAAA,QAA8C;AACvD,SAASC,YAAA,QAA4C;AAGrD,SAASC,WAAA,QAA0C;AACnD,SAASC,aAAA,QAA8C;AACvD,SAASC,SAAA,QAAsC;AAC/C,SAASC,WAAA,QAA0C;AAGnD,SACEC,SAAA,QAIK;AACP,SACEC,YAAA,EACAC,iBAAA,EACAC,gBAAA,EACAC,UAAA,QAMK;AAGP,SACEC,eAAA,EACAC,eAAA,EACAC,aAAA,EACAC,cAAA,EACAC,UAAA,EACAC,aAAA,EACAC,YAAA,EACAC,aAAA,QAWK;AAGP,SACEC,eAAA,EACAC,GAAA,EACAC,WAAA,EACAC,UAAA,EACAC,aAAA,EACAC,gBAAA,EACAC,aAAA,EACAC,cAAA,EACAC,iBAAA,EACAC,WAAA,EACAC,YAAA,EACAC,SAAA,EACAC,SAAA,EACAC,aAAA,QAEK","ignoreList":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2CAA2C;AAE3C,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAc,CAAA;AACvD,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAqB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAoB,CAAA;AAEzE,2DAA2D;AAC3D,OAAO,EAAE,WAAW,EAAyB,MAAM,kBAAmB,CAAA;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAqB,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAiB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAyB,MAAM,kBAAmB,CAAA;AAEtE,mCAAmC;AACnC,OAAO,EACL,SAAS,GAIV,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GAMX,MAAM,YAAY,CAAA;AAEnB,cAAc;AACd,OAAO,EACL,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,aAAa,GAWd,MAAM,aAAa,CAAA;AAEpB,kCAAkC;AAClC,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,GAEd,MAAM,WAAW,CAAA"}
@@ -0,0 +1,113 @@
1
+ // Time plane — pure date/timezone helpers via Intl + Date only.
2
+ // No external date library. Web and React Native safe.
3
+ /** The visitor's IANA time zone, e.g. "America/New_York". */
4
+ export function visitorTimeZone() {
5
+ try {
6
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
7
+ }
8
+ catch {
9
+ return 'UTC';
10
+ }
11
+ }
12
+ /** Calendar date "YYYY-MM-DD" from a Date's local components. */
13
+ export function ymd(d) {
14
+ const y = d.getFullYear();
15
+ const m = String(d.getMonth() + 1).padStart(2, '0');
16
+ const day = String(d.getDate()).padStart(2, '0');
17
+ return `${y}-${m}-${day}`;
18
+ }
19
+ export function startOfMonth(d) {
20
+ return new Date(d.getFullYear(), d.getMonth(), 1);
21
+ }
22
+ export function addMonths(d, n) {
23
+ return new Date(d.getFullYear(), d.getMonth() + n, 1);
24
+ }
25
+ export function sameMonth(a, b) {
26
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
27
+ }
28
+ /** True if the day key is strictly before today (lexicographic works on YYYY-MM-DD). */
29
+ export function isBeforeToday(key) {
30
+ return key < ymd(new Date());
31
+ }
32
+ /**
33
+ * A 6×7 grid of days covering the month of `viewDate`, including the leading
34
+ * and trailing days needed to fill whole weeks.
35
+ */
36
+ export function monthMatrix(viewDate, weekStartsOn = 0) {
37
+ const year = viewDate.getFullYear();
38
+ const month = viewDate.getMonth();
39
+ const firstWeekday = new Date(year, month, 1).getDay();
40
+ const startOffset = (firstWeekday - weekStartsOn + 7) % 7;
41
+ const cells = [];
42
+ for (let i = 0; i < 42; i++) {
43
+ const date = new Date(year, month, 1 - startOffset + i);
44
+ cells.push({ date, key: ymd(date), inMonth: date.getMonth() === month });
45
+ }
46
+ return cells;
47
+ }
48
+ /**
49
+ * ISO start/end covering the visible month, clamped so the start is never in
50
+ * the past (the backend rejects past ranges anyway).
51
+ */
52
+ export function monthRange(viewDate) {
53
+ const year = viewDate.getFullYear();
54
+ const month = viewDate.getMonth();
55
+ const startOfView = new Date(year, month, 1, 0, 0, 0, 0);
56
+ const now = new Date();
57
+ const start = startOfView.getTime() > now.getTime() ? startOfView : now;
58
+ const endOfView = new Date(year, month + 1, 0, 23, 59, 59, 999);
59
+ return { startTime: start.toISOString(), endTime: endOfView.toISOString() };
60
+ }
61
+ /** Short weekday headers ordered from `weekStartsOn` (0 = Sunday). */
62
+ export function weekdayLabels(weekStartsOn = 0) {
63
+ const fmt = new Intl.DateTimeFormat(undefined, { weekday: 'short' });
64
+ const out = [];
65
+ for (let i = 0; i < 7; i++) {
66
+ // 2023-01-01 is a Sunday; offset from there.
67
+ const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));
68
+ out.push(fmt.format(d));
69
+ }
70
+ return out;
71
+ }
72
+ export function formatMonthLabel(d) {
73
+ return new Intl.DateTimeFormat(undefined, { month: 'long', year: 'numeric' }).format(d);
74
+ }
75
+ export function formatDayLong(d) {
76
+ return new Intl.DateTimeFormat(undefined, {
77
+ weekday: 'long',
78
+ month: 'long',
79
+ day: 'numeric',
80
+ }).format(d);
81
+ }
82
+ /** Slot time in the visitor's zone, e.g. "9:00 AM". */
83
+ export function formatSlotTime(iso, timeZone) {
84
+ return new Intl.DateTimeFormat(undefined, {
85
+ hour: 'numeric',
86
+ minute: '2-digit',
87
+ timeZone,
88
+ }).format(new Date(iso));
89
+ }
90
+ /** Full human "when" for a confirmation, e.g. "Monday, July 27, 2026 at 9:00 AM PDT". */
91
+ export function formatBookingWhen(iso, timeZone) {
92
+ const at = new Date(iso);
93
+ const date = new Intl.DateTimeFormat(undefined, {
94
+ weekday: 'long',
95
+ month: 'long',
96
+ day: 'numeric',
97
+ year: 'numeric',
98
+ timeZone,
99
+ }).format(at);
100
+ const time = new Intl.DateTimeFormat(undefined, {
101
+ hour: 'numeric',
102
+ minute: '2-digit',
103
+ timeZoneName: 'short',
104
+ timeZone,
105
+ }).format(at);
106
+ return `${date} at ${time}`;
107
+ }
108
+ /** A parsed local Date from a "YYYY-MM-DD" key (noon avoids DST edge slips). */
109
+ export function dateFromKey(key) {
110
+ const [y, m, d] = key.split('-').map(Number);
111
+ return new Date(y, (m ?? 1) - 1, d ?? 1, 12, 0, 0, 0);
112
+ }
113
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ // Orchestration hook — the one booking state machine both shells consume.
2
+ import { useEffect, useMemo, useState } from 'react';
3
+ import { DEFAULT_API_URL, } from './client.js';
4
+ import { useAvailableSlots, useCreateBooking, useEventType, } from './hooks.js';
5
+ import { addMonths, monthRange, startOfMonth, visitorTimeZone } from './time.js';
6
+ export function useBooker(opts) {
7
+ const api = opts.apiUrl ?? DEFAULT_API_URL;
8
+ const timeZone = opts.timeZone ?? visitorTimeZone();
9
+ const weekStartsOn = opts.weekStartsOn ?? 0;
10
+ const event = useEventType(api, opts.eventSlug, opts.host);
11
+ const [viewDate, setViewDate] = useState(() => startOfMonth(new Date()));
12
+ const { startTime, endTime } = useMemo(() => monthRange(viewDate), [viewDate]);
13
+ const slots = useAvailableSlots(api, {
14
+ eventTypeSlug: opts.eventSlug,
15
+ username: opts.host,
16
+ startTime,
17
+ endTime,
18
+ timeZone,
19
+ enabled: !!event.data,
20
+ });
21
+ const [selectedDay, setSelectedDay] = useState(null);
22
+ const [selectedSlot, setSelectedSlot] = useState(null);
23
+ const [phase, setPhase] = useState('pick');
24
+ const [booking, setBooking] = useState(null);
25
+ const create = useCreateBooking(api);
26
+ const availableKeys = useMemo(() => {
27
+ const map = slots.data ?? {};
28
+ return new Set(Object.keys(map).filter((k) => (map[k]?.length ?? 0) > 0));
29
+ }, [slots.data]);
30
+ const daySlots = useMemo(() => {
31
+ if (!selectedDay)
32
+ return [];
33
+ return slots.data?.[selectedDay] ?? [];
34
+ }, [slots.data, selectedDay]);
35
+ // Optionally auto-select the soonest available day once slots arrive.
36
+ useEffect(() => {
37
+ if (!opts.autoSelectFirst)
38
+ return;
39
+ if (selectedDay && availableKeys.has(selectedDay))
40
+ return;
41
+ const first = [...availableKeys].sort()[0];
42
+ if (first) {
43
+ setSelectedDay(first);
44
+ setSelectedSlot(null);
45
+ }
46
+ }, [opts.autoSelectFirst, availableKeys, selectedDay]);
47
+ const now = startOfMonth(new Date());
48
+ const atFirstMonth = viewDate.getFullYear() === now.getFullYear() && viewDate.getMonth() === now.getMonth();
49
+ const goPrevMonth = () => {
50
+ if (atFirstMonth)
51
+ return;
52
+ setViewDate((d) => addMonths(d, -1));
53
+ setSelectedDay(null);
54
+ setSelectedSlot(null);
55
+ };
56
+ const goNextMonth = () => {
57
+ setViewDate((d) => addMonths(d, 1));
58
+ setSelectedDay(null);
59
+ setSelectedSlot(null);
60
+ };
61
+ const selectDay = (key) => {
62
+ setSelectedDay(key);
63
+ setSelectedSlot(null);
64
+ };
65
+ const selectSlot = (iso) => {
66
+ setSelectedSlot(iso);
67
+ setPhase('form');
68
+ create.reset();
69
+ };
70
+ const back = () => {
71
+ setPhase('pick');
72
+ setSelectedSlot(null);
73
+ create.reset();
74
+ };
75
+ const reset = () => {
76
+ setBooking(null);
77
+ setSelectedSlot(null);
78
+ setSelectedDay(null);
79
+ setPhase('pick');
80
+ create.reset();
81
+ slots.refetch();
82
+ };
83
+ const submit = async (responses) => {
84
+ if (!selectedSlot)
85
+ return;
86
+ const result = await create.submit({
87
+ eventTypeSlug: opts.eventSlug,
88
+ username: opts.host,
89
+ start: selectedSlot,
90
+ timeZone,
91
+ responses,
92
+ });
93
+ if (result.ok) {
94
+ setBooking(result.booking);
95
+ setPhase('done');
96
+ opts.onBooked?.(result.booking);
97
+ }
98
+ else if (result.conflict) {
99
+ // Slot was just taken — refresh availability and return to picking.
100
+ slots.refetch();
101
+ setSelectedSlot(null);
102
+ setPhase('pick');
103
+ }
104
+ // non-conflict errors stay visible in the form via `error`.
105
+ };
106
+ return {
107
+ api,
108
+ timeZone,
109
+ weekStartsOn,
110
+ event,
111
+ slots,
112
+ viewDate,
113
+ availableKeys,
114
+ selectedDay,
115
+ daySlots,
116
+ selectedSlot,
117
+ phase,
118
+ booking,
119
+ submitting: create.submitting,
120
+ error: create.error,
121
+ conflict: create.conflict,
122
+ goPrevMonth,
123
+ goNextMonth,
124
+ atFirstMonth,
125
+ selectDay,
126
+ selectSlot,
127
+ submit,
128
+ back,
129
+ reset,
130
+ };
131
+ }
132
+ //# sourceMappingURL=useBooker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBooker.js","sourceRoot":"","sources":["../../src/useBooker.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EACL,eAAe,GAIhB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GAGb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAyChF,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,EAAE,CAAA;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAA;IAE3C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAE1D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE9E,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACnC,aAAa,EAAE,IAAI,CAAC,SAAS;QAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,SAAS;QACT,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;KACtB,CAAC,CAAA;IAEF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACnE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,MAAM,CAAC,CAAA;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAA;IAE5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAEhB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAA;QAC3B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7B,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAM;QACjC,IAAI,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAM;QACzD,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,CAAC,KAAK,CAAC,CAAA;YACrB,eAAe,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;IAEtD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IACpC,MAAM,YAAY,GAChB,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAA;IAExF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,YAAY;YAAE,OAAM;QACxB,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnC,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;QAChC,cAAc,CAAC,GAAG,CAAC,CAAA;QACnB,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;IACD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,eAAe,CAAC,GAAG,CAAC,CAAA;QACpB,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,MAAM,CAAC,KAAK,EAAE,CAAA;QACd,KAAK,CAAC,OAAO,EAAE,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,KAAK,EAAE,SAA2B,EAAE,EAAE;QACnD,IAAI,CAAC,YAAY;YAAE,OAAM;QACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,SAAS;YAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,YAAY;YACnB,QAAQ;YACR,SAAS;SACV,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC1B,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChB,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3B,oEAAoE;YACpE,KAAK,CAAC,OAAO,EAAE,CAAA;YACf,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,QAAQ,CAAC,MAAM,CAAC,CAAA;QAClB,CAAC;QACD,4DAA4D;IAC9D,CAAC,CAAA;IAED,OAAO;QACL,GAAG;QACH,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,KAAK;QACL,QAAQ;QACR,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW;QACX,WAAW;QACX,YAAY;QACZ,SAAS;QACT,UAAU;QACV,MAAM;QACN,IAAI;QACJ,KAAK;KACN,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzo/booker",
3
- "version": "8.3.0",
3
+ "version": "8.3.2",
4
4
  "description": "Universal (web + native) scheduling UI for the Hanzo Calendar — a Booker, Confirmation, and compact CalendarEmbed built with hanzogui primitives.",
5
5
  "license": "MIT",
6
6
  "author": "Hanzo AI <dev@hanzo.ai>",
@@ -10,52 +10,52 @@
10
10
  "directory": "pkgs/calendar"
11
11
  },
12
12
  "source": "src/index.ts",
13
+ "files": [
14
+ "src",
15
+ "types",
16
+ "dist",
17
+ "README.md"
18
+ ],
13
19
  "type": "module",
14
20
  "sideEffects": false,
15
- "main": "dist/cjs",
16
- "module": "dist/esm",
21
+ "main": "./dist/cjs/index.js",
22
+ "module": "./dist/esm/index.js",
17
23
  "types": "./types/index.d.ts",
18
24
  "exports": {
19
25
  "./package.json": "./package.json",
20
26
  ".": {
21
27
  "types": "./types/index.d.ts",
22
- "react-native": "./dist/esm/index.native.js",
23
- "browser": "./dist/esm/index.mjs",
24
- "module": "./dist/esm/index.mjs",
25
- "import": "./dist/esm/index.mjs",
26
- "require": "./dist/cjs/index.cjs",
27
- "default": "./dist/esm/index.mjs"
28
+ "react-native": "./dist/esm/index.js",
29
+ "browser": "./dist/esm/index.js",
30
+ "module": "./dist/esm/index.js",
31
+ "import": "./dist/esm/index.js",
32
+ "require": "./dist/cjs/index.js",
33
+ "default": "./dist/esm/index.js"
28
34
  }
29
35
  },
30
- "files": [
31
- "src",
32
- "types",
33
- "dist",
34
- "README.md"
35
- ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
36
39
  "scripts": {
37
- "build": "hanzogui-build",
40
+ "build": "hanzogui-build --skip-native",
38
41
  "watch": "hanzogui-build --watch",
39
42
  "clean": "hanzogui-build clean",
40
43
  "clean:build": "hanzogui-build clean:build"
41
44
  },
45
+ "devDependencies": {
46
+ "@hanzo/gui": "8.3.2",
47
+ "@hanzogui/build": "8.3.2",
48
+ "react": "19.2.8",
49
+ "react-native": "^0.87.1"
50
+ },
42
51
  "peerDependencies": {
43
- "@hanzo/gui": ">=8.0.0",
44
- "react": ">=18",
45
- "react-native": "*"
52
+ "@hanzo/gui": ">=8.3.1",
53
+ "react": ">=19.2.8",
54
+ "react-native": ">=0"
46
55
  },
47
56
  "peerDependenciesMeta": {
48
57
  "react-native": {
49
58
  "optional": true
50
59
  }
51
- },
52
- "devDependencies": {
53
- "@hanzogui/build": "8.3.0",
54
- "@hanzo/gui": "8.3.0",
55
- "react": ">=19",
56
- "react-native": "0.83.2"
57
- },
58
- "publishConfig": {
59
- "access": "public"
60
60
  }
61
61
  }