@idkwebsites/components 0.1.15 → 0.1.17

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/dist/index.d.cts CHANGED
@@ -201,6 +201,141 @@ declare function useCancelBooking(): _tanstack_react_query.UseMutationResult<{
201
201
  }, Error, BookingCancelInput, unknown>;
202
202
  declare function useBookingLookup(uid?: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<BookingLookup, Error>;
203
203
 
204
+ type Step = "service" | "staff" | "time" | "details" | "done";
205
+ interface UseBookingWidgetOptions {
206
+ /** Pre-fetched services — skips the API call when provided. */
207
+ services?: Service[];
208
+ /** Query params forwarded to `useServices` when services are not pre-fetched. */
209
+ servicesQuery?: ServicesQueryParams;
210
+ /** Query params forwarded to `useTeam`. */
211
+ teamQuery?: TeamQueryParams;
212
+ /** Client-side filter applied to the services list. */
213
+ serviceFilter?: (service: Service) => boolean;
214
+ /** Client-side filter applied to the staff list. */
215
+ teamFilter?: (member: StaffMember) => boolean;
216
+ /** Enable the staff-selection step. Default `true`. */
217
+ showStaffSelection?: boolean;
218
+ /** Automatically advance when user selects a card. Default `false`. */
219
+ autoAdvanceOnSelect?: boolean;
220
+ /** Scroll the widget container into view on step change. Default `true`. */
221
+ scrollToStep?: boolean;
222
+ /** Pixel offset for scroll-into-view. Default `96`. */
223
+ scrollOffset?: number;
224
+ /** Ref to the widget container element. Used for scroll-to-top. */
225
+ widgetRef?: React.RefObject<HTMLElement | null>;
226
+ /** Called after a booking is created successfully. */
227
+ onSuccess?: (booking: unknown) => void;
228
+ /** Number of days to fetch at a time in list date picker. Default `7`. */
229
+ availabilityDays?: number;
230
+ /** Enable prev/next date paging. Default `true`. */
231
+ enableDatePaging?: boolean;
232
+ /** Date picker mode: `"list"` or `"calendar"`. Default `"list"`. */
233
+ datePickerMode?: "list" | "calendar";
234
+ /** Calendar variant. Default `"default"`. */
235
+ calendarVariant?: "default" | "compact";
236
+ /** Max months in advance. Default `3`. */
237
+ maxAdvanceMonths?: number;
238
+ /** Weekday numbers (0-6) to disable. Default `[]`. */
239
+ disabledWeekdays?: number[];
240
+ /** Show "Fully booked" labels on calendar days. Default `true`. */
241
+ showFullyBookedLabel?: boolean;
242
+ /** Enable search input for service filtering. Default `true`. */
243
+ enableServiceSearch?: boolean;
244
+ /** Enable category filter dropdown. Default `false`. */
245
+ enableCategoryFilter?: boolean;
246
+ /** Max items per page for services before "show more". Default `10`. */
247
+ servicePageSize?: number;
248
+ /** Max items per page for staff before "show more". Default `8`. */
249
+ staffPageSize?: number;
250
+ /** Show "Any Available" option for staff. Default `true`. */
251
+ showAnyStaffOption?: boolean;
252
+ }
253
+ interface UseBookingWidgetReturn {
254
+ step: Step;
255
+ /** 1-based step number for progress display. */
256
+ stepNumber: number;
257
+ totalSteps: number;
258
+ selectedService: Service | null;
259
+ selectedStaff: StaffMember | null;
260
+ selectedDate: string | null;
261
+ selectedTime: string | null;
262
+ selectedEndTime: string | null;
263
+ details: {
264
+ name: string;
265
+ email: string;
266
+ phone: string;
267
+ notes: string;
268
+ };
269
+ servicesList: Service[];
270
+ filteredServices: Service[];
271
+ pagedServices: Service[];
272
+ hasMoreServices: boolean;
273
+ categories: string[];
274
+ staffOptions: StaffMember[];
275
+ pagedStaff: StaffMember[];
276
+ hasMoreStaff: boolean;
277
+ availabilityDates: AvailabilityDate[];
278
+ availabilityByDate: Map<string, AvailabilityDate>;
279
+ timeZone: string;
280
+ timeZoneLabel: string;
281
+ calendarMonth: Date;
282
+ calendarDays: Array<{
283
+ date: string;
284
+ isCurrentMonth: boolean;
285
+ }>;
286
+ hasBlockedInCalendarView: boolean;
287
+ maxAdvanceDate: Date | null;
288
+ maxAdvanceMonthStart: Date | null;
289
+ monthOptions: Array<{
290
+ value: string;
291
+ label: string;
292
+ date: Date;
293
+ }>;
294
+ isServicesLoading: boolean;
295
+ isAvailabilityLoading: boolean;
296
+ isSubmitting: boolean;
297
+ bookingError: string | null;
298
+ requiresStaff: boolean;
299
+ canSkipStaff: boolean;
300
+ serviceSearch: string;
301
+ categoryFilter: string;
302
+ servicePage: number;
303
+ staffPage: number;
304
+ availabilityStartDate: string;
305
+ formatDateLabel: (date: string) => string;
306
+ formatDateHeading: (date: string) => string;
307
+ formatTimeLabel: (iso: string) => string;
308
+ formatDuration: (minutes: number) => string;
309
+ setServiceSearch: (value: string) => void;
310
+ setCategoryFilter: (value: string) => void;
311
+ loadMoreServices: () => void;
312
+ loadMoreStaff: () => void;
313
+ selectService: (service: Service) => void;
314
+ selectStaff: (staff: StaffMember | null) => void;
315
+ selectDate: (date: string) => void;
316
+ selectTime: (time: string, endTime: string) => void;
317
+ setDetails: React.Dispatch<React.SetStateAction<{
318
+ name: string;
319
+ email: string;
320
+ phone: string;
321
+ notes: string;
322
+ }>>;
323
+ goToServiceStep: () => void;
324
+ continueFromService: () => void;
325
+ continueFromStaff: () => void;
326
+ continueFromTime: () => void;
327
+ submitBooking: (event?: React.FormEvent) => Promise<void>;
328
+ goBack: () => void;
329
+ reset: () => void;
330
+ scrollToTop: () => void;
331
+ handlePrevDates: () => void;
332
+ handleNextDates: () => void;
333
+ handlePrevMonth: () => void;
334
+ handleNextMonth: () => void;
335
+ handleMonthSelect: (value: string) => void;
336
+ }
337
+ declare function useBookingWidget(options?: UseBookingWidgetOptions): UseBookingWidgetReturn;
338
+
204
339
  interface ServicesListProps {
205
340
  layout?: 'grid' | 'list';
206
341
  columns?: number;
@@ -304,7 +439,7 @@ interface BookingWidgetProps {
304
439
  disabledWeekdays?: number[];
305
440
  showFullyBookedLabel?: boolean;
306
441
  }
307
- declare function BookingWidget({ className, showStaffSelection, onSuccess, services, servicesQuery, teamQuery, serviceFilter, teamFilter, title, subtitle, autoAdvanceOnSelect, scrollToStep, scrollOffset, enableServiceSearch, serviceSearchPlaceholder, enableCategoryFilter, categoryLabel, serviceListMaxHeight, serviceLayout, serviceColumns, servicePageSize, showServicePagination, staffLayout, staffColumns, showAnyStaffOption, staffPageSize, showStaffPagination, timeLayout, availabilityDays: availabilityDaysProp, enableDatePaging, datePickerMode, calendarVariant, maxAdvanceMonths, disabledWeekdays, showFullyBookedLabel, }: BookingWidgetProps): react_jsx_runtime.JSX.Element;
442
+ declare function BookingWidget({ className, title, subtitle, serviceSearchPlaceholder, categoryLabel, serviceListMaxHeight, serviceLayout, serviceColumns, showServicePagination, staffLayout, staffColumns, showStaffPagination, timeLayout, showFullyBookedLabel, calendarVariant, enableServiceSearch, enableCategoryFilter, enableDatePaging, disabledWeekdays, ...hookProps }: BookingWidgetProps): react_jsx_runtime.JSX.Element;
308
443
 
309
444
  interface AvailabilityPickerProps {
310
445
  serviceId: string;
@@ -352,4 +487,4 @@ interface TimePickerProps {
352
487
  }
353
488
  declare function TimePicker({ slots, selectedTime, onSelect, className, }: TimePickerProps): react_jsx_runtime.JSX.Element;
354
489
 
355
- export { AvailabilityPicker, type AvailabilityResult, type BookingCancelInput, type BookingCreateInput, type BookingLookup, BookingWidget, ContactForm, type ContactSubmissionInput, DatePicker, PlatformProvider, type Service, ServiceCard, ServicePicker, ServicesList, type ServicesQueryParams, type StaffMember, StaffPicker, TeamGrid, TeamMember, type TeamQueryParams, type TenantInfo, TimePicker, useAvailability, useBookingLookup, useCancelBooking, useCreateBooking, useServices, useTeam, useTenant };
490
+ export { AvailabilityPicker, type AvailabilityResult, type BookingCancelInput, type BookingCreateInput, type BookingLookup, BookingWidget, ContactForm, type ContactSubmissionInput, DatePicker, PlatformProvider, type Service, ServiceCard, ServicePicker, ServicesList, type ServicesQueryParams, type StaffMember, StaffPicker, TeamGrid, TeamMember, type TeamQueryParams, type TenantInfo, TimePicker, type UseBookingWidgetOptions, type UseBookingWidgetReturn, useAvailability, useBookingLookup, useBookingWidget, useCancelBooking, useCreateBooking, useServices, useTeam, useTenant };
package/dist/index.d.ts CHANGED
@@ -201,6 +201,141 @@ declare function useCancelBooking(): _tanstack_react_query.UseMutationResult<{
201
201
  }, Error, BookingCancelInput, unknown>;
202
202
  declare function useBookingLookup(uid?: string, enabled?: boolean): _tanstack_react_query.UseQueryResult<BookingLookup, Error>;
203
203
 
204
+ type Step = "service" | "staff" | "time" | "details" | "done";
205
+ interface UseBookingWidgetOptions {
206
+ /** Pre-fetched services — skips the API call when provided. */
207
+ services?: Service[];
208
+ /** Query params forwarded to `useServices` when services are not pre-fetched. */
209
+ servicesQuery?: ServicesQueryParams;
210
+ /** Query params forwarded to `useTeam`. */
211
+ teamQuery?: TeamQueryParams;
212
+ /** Client-side filter applied to the services list. */
213
+ serviceFilter?: (service: Service) => boolean;
214
+ /** Client-side filter applied to the staff list. */
215
+ teamFilter?: (member: StaffMember) => boolean;
216
+ /** Enable the staff-selection step. Default `true`. */
217
+ showStaffSelection?: boolean;
218
+ /** Automatically advance when user selects a card. Default `false`. */
219
+ autoAdvanceOnSelect?: boolean;
220
+ /** Scroll the widget container into view on step change. Default `true`. */
221
+ scrollToStep?: boolean;
222
+ /** Pixel offset for scroll-into-view. Default `96`. */
223
+ scrollOffset?: number;
224
+ /** Ref to the widget container element. Used for scroll-to-top. */
225
+ widgetRef?: React.RefObject<HTMLElement | null>;
226
+ /** Called after a booking is created successfully. */
227
+ onSuccess?: (booking: unknown) => void;
228
+ /** Number of days to fetch at a time in list date picker. Default `7`. */
229
+ availabilityDays?: number;
230
+ /** Enable prev/next date paging. Default `true`. */
231
+ enableDatePaging?: boolean;
232
+ /** Date picker mode: `"list"` or `"calendar"`. Default `"list"`. */
233
+ datePickerMode?: "list" | "calendar";
234
+ /** Calendar variant. Default `"default"`. */
235
+ calendarVariant?: "default" | "compact";
236
+ /** Max months in advance. Default `3`. */
237
+ maxAdvanceMonths?: number;
238
+ /** Weekday numbers (0-6) to disable. Default `[]`. */
239
+ disabledWeekdays?: number[];
240
+ /** Show "Fully booked" labels on calendar days. Default `true`. */
241
+ showFullyBookedLabel?: boolean;
242
+ /** Enable search input for service filtering. Default `true`. */
243
+ enableServiceSearch?: boolean;
244
+ /** Enable category filter dropdown. Default `false`. */
245
+ enableCategoryFilter?: boolean;
246
+ /** Max items per page for services before "show more". Default `10`. */
247
+ servicePageSize?: number;
248
+ /** Max items per page for staff before "show more". Default `8`. */
249
+ staffPageSize?: number;
250
+ /** Show "Any Available" option for staff. Default `true`. */
251
+ showAnyStaffOption?: boolean;
252
+ }
253
+ interface UseBookingWidgetReturn {
254
+ step: Step;
255
+ /** 1-based step number for progress display. */
256
+ stepNumber: number;
257
+ totalSteps: number;
258
+ selectedService: Service | null;
259
+ selectedStaff: StaffMember | null;
260
+ selectedDate: string | null;
261
+ selectedTime: string | null;
262
+ selectedEndTime: string | null;
263
+ details: {
264
+ name: string;
265
+ email: string;
266
+ phone: string;
267
+ notes: string;
268
+ };
269
+ servicesList: Service[];
270
+ filteredServices: Service[];
271
+ pagedServices: Service[];
272
+ hasMoreServices: boolean;
273
+ categories: string[];
274
+ staffOptions: StaffMember[];
275
+ pagedStaff: StaffMember[];
276
+ hasMoreStaff: boolean;
277
+ availabilityDates: AvailabilityDate[];
278
+ availabilityByDate: Map<string, AvailabilityDate>;
279
+ timeZone: string;
280
+ timeZoneLabel: string;
281
+ calendarMonth: Date;
282
+ calendarDays: Array<{
283
+ date: string;
284
+ isCurrentMonth: boolean;
285
+ }>;
286
+ hasBlockedInCalendarView: boolean;
287
+ maxAdvanceDate: Date | null;
288
+ maxAdvanceMonthStart: Date | null;
289
+ monthOptions: Array<{
290
+ value: string;
291
+ label: string;
292
+ date: Date;
293
+ }>;
294
+ isServicesLoading: boolean;
295
+ isAvailabilityLoading: boolean;
296
+ isSubmitting: boolean;
297
+ bookingError: string | null;
298
+ requiresStaff: boolean;
299
+ canSkipStaff: boolean;
300
+ serviceSearch: string;
301
+ categoryFilter: string;
302
+ servicePage: number;
303
+ staffPage: number;
304
+ availabilityStartDate: string;
305
+ formatDateLabel: (date: string) => string;
306
+ formatDateHeading: (date: string) => string;
307
+ formatTimeLabel: (iso: string) => string;
308
+ formatDuration: (minutes: number) => string;
309
+ setServiceSearch: (value: string) => void;
310
+ setCategoryFilter: (value: string) => void;
311
+ loadMoreServices: () => void;
312
+ loadMoreStaff: () => void;
313
+ selectService: (service: Service) => void;
314
+ selectStaff: (staff: StaffMember | null) => void;
315
+ selectDate: (date: string) => void;
316
+ selectTime: (time: string, endTime: string) => void;
317
+ setDetails: React.Dispatch<React.SetStateAction<{
318
+ name: string;
319
+ email: string;
320
+ phone: string;
321
+ notes: string;
322
+ }>>;
323
+ goToServiceStep: () => void;
324
+ continueFromService: () => void;
325
+ continueFromStaff: () => void;
326
+ continueFromTime: () => void;
327
+ submitBooking: (event?: React.FormEvent) => Promise<void>;
328
+ goBack: () => void;
329
+ reset: () => void;
330
+ scrollToTop: () => void;
331
+ handlePrevDates: () => void;
332
+ handleNextDates: () => void;
333
+ handlePrevMonth: () => void;
334
+ handleNextMonth: () => void;
335
+ handleMonthSelect: (value: string) => void;
336
+ }
337
+ declare function useBookingWidget(options?: UseBookingWidgetOptions): UseBookingWidgetReturn;
338
+
204
339
  interface ServicesListProps {
205
340
  layout?: 'grid' | 'list';
206
341
  columns?: number;
@@ -304,7 +439,7 @@ interface BookingWidgetProps {
304
439
  disabledWeekdays?: number[];
305
440
  showFullyBookedLabel?: boolean;
306
441
  }
307
- declare function BookingWidget({ className, showStaffSelection, onSuccess, services, servicesQuery, teamQuery, serviceFilter, teamFilter, title, subtitle, autoAdvanceOnSelect, scrollToStep, scrollOffset, enableServiceSearch, serviceSearchPlaceholder, enableCategoryFilter, categoryLabel, serviceListMaxHeight, serviceLayout, serviceColumns, servicePageSize, showServicePagination, staffLayout, staffColumns, showAnyStaffOption, staffPageSize, showStaffPagination, timeLayout, availabilityDays: availabilityDaysProp, enableDatePaging, datePickerMode, calendarVariant, maxAdvanceMonths, disabledWeekdays, showFullyBookedLabel, }: BookingWidgetProps): react_jsx_runtime.JSX.Element;
442
+ declare function BookingWidget({ className, title, subtitle, serviceSearchPlaceholder, categoryLabel, serviceListMaxHeight, serviceLayout, serviceColumns, showServicePagination, staffLayout, staffColumns, showStaffPagination, timeLayout, showFullyBookedLabel, calendarVariant, enableServiceSearch, enableCategoryFilter, enableDatePaging, disabledWeekdays, ...hookProps }: BookingWidgetProps): react_jsx_runtime.JSX.Element;
308
443
 
309
444
  interface AvailabilityPickerProps {
310
445
  serviceId: string;
@@ -352,4 +487,4 @@ interface TimePickerProps {
352
487
  }
353
488
  declare function TimePicker({ slots, selectedTime, onSelect, className, }: TimePickerProps): react_jsx_runtime.JSX.Element;
354
489
 
355
- export { AvailabilityPicker, type AvailabilityResult, type BookingCancelInput, type BookingCreateInput, type BookingLookup, BookingWidget, ContactForm, type ContactSubmissionInput, DatePicker, PlatformProvider, type Service, ServiceCard, ServicePicker, ServicesList, type ServicesQueryParams, type StaffMember, StaffPicker, TeamGrid, TeamMember, type TeamQueryParams, type TenantInfo, TimePicker, useAvailability, useBookingLookup, useCancelBooking, useCreateBooking, useServices, useTeam, useTenant };
490
+ export { AvailabilityPicker, type AvailabilityResult, type BookingCancelInput, type BookingCreateInput, type BookingLookup, BookingWidget, ContactForm, type ContactSubmissionInput, DatePicker, PlatformProvider, type Service, ServiceCard, ServicePicker, ServicesList, type ServicesQueryParams, type StaffMember, StaffPicker, TeamGrid, TeamMember, type TeamQueryParams, type TenantInfo, TimePicker, type UseBookingWidgetOptions, type UseBookingWidgetReturn, useAvailability, useBookingLookup, useBookingWidget, useCancelBooking, useCreateBooking, useServices, useTeam, useTenant };