@idkwebsites/components 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.
- package/dist/index.cjs +847 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +276 -0
- package/dist/index.d.ts +276 -0
- package/dist/index.js +806 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +201 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.cts +2 -0
- package/dist/styles.d.ts +2 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/PlatformProvider.tsx","../src/core/context.ts","../src/core/hooks/useTenant.ts","../src/core/api-client.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTeam.ts","../src/core/hooks/useAvailability.ts","../src/core/hooks/useBooking.ts","../src/components/ServiceCard.tsx","../src/components/ServicesList.tsx","../src/components/TeamMember.tsx","../src/components/TeamGrid.tsx","../src/components/ContactForm.tsx","../src/components/BookingWidget.tsx","../src/components/AvailabilityPicker.tsx","../src/components/ServicePicker.tsx","../src/components/StaffPicker.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx"],"sourcesContent":["/**\n * PlatformProvider\n * Provides API configuration + React Query client for all components.\n */\n'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport {\n QueryClient,\n QueryClientProvider,\n HydrationBoundary,\n type DehydratedState,\n type DefaultOptions,\n} from '@tanstack/react-query'\nimport { PlatformContext } from './context'\n\ninterface PlatformProviderProps {\n apiKey: string\n apiUrl?: string\n children: ReactNode\n dehydratedState?: DehydratedState\n queryOptions?: DefaultOptions\n queryClient?: QueryClient\n}\n\nconst DEFAULT_API_URL =\n process.env.NEXT_PUBLIC_IDK_API_URL ||\n process.env.NEXT_PUBLIC_PLATFORM_API_URL ||\n 'https://app.idkwebsites.com/api/v1'\n\nexport function PlatformProvider({\n apiKey,\n apiUrl = DEFAULT_API_URL,\n children,\n dehydratedState,\n queryOptions,\n queryClient,\n}: PlatformProviderProps) {\n const [client] = useState(\n () =>\n queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n retry: 1,\n ...queryOptions?.queries,\n },\n mutations: {\n ...queryOptions?.mutations,\n },\n },\n })\n )\n\n return (\n <PlatformContext.Provider value={{ apiKey, apiUrl }}>\n <QueryClientProvider client={client}>\n <HydrationBoundary state={dehydratedState}>{children}</HydrationBoundary>\n </QueryClientProvider>\n </PlatformContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport interface PlatformConfig {\n apiKey: string\n apiUrl: string\n}\n\nconst PlatformContext = createContext<PlatformConfig | null>(null)\n\nexport function usePlatformConfig(): PlatformConfig {\n const context = useContext(PlatformContext)\n if (!context) {\n throw new Error('PlatformProvider is missing in the component tree.')\n }\n return context\n}\n\nexport { PlatformContext }\n","import { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { TenantInfo } from '../../types'\n\nexport function useTenant() {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'tenant'],\n queryFn: () => apiRequest<TenantInfo>(config, '/tenant'),\n })\n}\n","export class ApiError extends Error {\n status: number\n code: string\n\n constructor(message: string, status: number, code: string) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.code = code\n }\n}\n\nexport interface ApiClientConfig {\n apiKey: string\n apiUrl: string\n}\n\nfunction normalizeBaseUrl(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, '')\n}\n\nexport async function apiRequest<T>(\n config: ApiClientConfig,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const url = `${normalizeBaseUrl(config.apiUrl)}${path.startsWith('/') ? path : `/${path}`}`\n\n const headers = new Headers(options.headers)\n headers.set('X-API-Key', config.apiKey)\n if (!headers.has('Content-Type') && options.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const errorCode = payload?.error?.code || 'REQUEST_FAILED'\n const errorMessage = payload?.error?.message || response.statusText\n throw new ApiError(errorMessage, response.status, errorCode)\n }\n\n if (payload?.error) {\n throw new ApiError(payload.error.message || 'Request failed', payload.error.status || 400, payload.error.code || 'REQUEST_FAILED')\n }\n\n return payload?.data as T\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { Service } from '../../types'\n\ninterface ServicesResponse {\n services: Service[]\n total: number\n}\n\nexport function useServices() {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'services'],\n queryFn: () => apiRequest<ServicesResponse>(config, '/services'),\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { StaffMember } from '../../types'\n\ninterface TeamResponse {\n team: StaffMember[]\n total: number\n}\n\nexport function useTeam() {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'team'],\n queryFn: () => apiRequest<TeamResponse>(config, '/team'),\n })\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { AvailabilityResult } from '../../types'\n\nexport interface AvailabilityParams {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n startDate?: string\n endDate?: string\n enabled?: boolean\n}\n\nfunction buildQuery(params: AvailabilityParams): string {\n const searchParams = new URLSearchParams()\n searchParams.set('serviceId', params.serviceId)\n if (params.staffId) searchParams.set('staffId', params.staffId)\n if (params.startDate) searchParams.set('startDate', params.startDate)\n if (params.endDate) searchParams.set('endDate', params.endDate)\n if (params.date) searchParams.set('date', params.date)\n if (params.days) searchParams.set('days', String(params.days))\n return searchParams.toString()\n}\n\nexport function useAvailability(params: AvailabilityParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(\n () => buildQuery(params),\n [params.serviceId, params.staffId, params.startDate, params.endDate, params.date, params.days]\n )\n const enabled = params.enabled ?? Boolean(params.serviceId)\n\n return useQuery({\n queryKey: ['idk', 'availability', queryString],\n queryFn: () => apiRequest<AvailabilityResult>(config, `/availability?${queryString}`),\n enabled,\n })\n}\n","import { useMutation, useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { BookingCreateInput, BookingCancelInput, BookingLookup } from '../../types'\n\nexport function useCreateBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCreateInput) =>\n apiRequest<{ booking: unknown }>(config, '/bookings', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n })\n}\n\nexport function useCancelBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCancelInput) =>\n apiRequest<{ booking: unknown }>(config, `/bookings/${input.uid}/cancel`, {\n method: 'POST',\n body: JSON.stringify({\n reason: input.reason,\n cancelledBy: input.cancelledBy || 'customer',\n }),\n }),\n })\n}\n\nexport function useBookingLookup(uid?: string, enabled = true) {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'booking', uid],\n queryFn: () => apiRequest<BookingLookup>(config, `/bookings/${uid}`),\n enabled: Boolean(uid) && enabled,\n })\n}\n","'use client'\n\nimport type { Service } from '../types'\n\ninterface ServiceCardProps {\n service: Service\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n onSelect?: (service: Service) => void\n}\n\nexport function ServiceCard({\n service,\n className,\n showDescription = true,\n showPrice = true,\n onSelect,\n}: ServiceCardProps) {\n const handleClick = () => {\n if (onSelect) onSelect(service)\n }\n\n return (\n <div\n className={['idk-card', onSelect ? 'idk-card--clickable' : '', className]\n .filter(Boolean)\n .join(' ')}\n onClick={onSelect ? handleClick : undefined}\n role={onSelect ? 'button' : undefined}\n tabIndex={onSelect ? 0 : undefined}\n >\n <div className=\"idk-card__header\">\n <h3 className=\"idk-card__title\">{service.name}</h3>\n {showPrice && typeof service.price === 'number' && service.price > 0 ? (\n <span className=\"idk-card__price\">${(service.price / 100).toFixed(2)}</span>\n ) : null}\n </div>\n {showDescription && service.description ? (\n <p className=\"idk-card__description\">{service.description}</p>\n ) : null}\n <div className=\"idk-card__meta\">\n <span>{service.duration} min</span>\n {service.category ? <span>{service.category}</span> : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { ServiceCard } from './ServiceCard'\nimport { useServices } from '../core/hooks/useServices'\nimport type { Service } from '../types'\n\ninterface ServicesListProps {\n layout?: 'grid' | 'list'\n columns?: number\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n onSelect?: (service: Service) => void\n}\n\nexport function ServicesList({\n layout = 'grid',\n columns = 3,\n className,\n showDescription,\n showPrice,\n onSelect,\n}: ServicesListProps) {\n const { data, isLoading, error } = useServices()\n\n if (isLoading) {\n return <div className=\"idk-state\">Loading services...</div>\n }\n\n if (error || !data?.services?.length) {\n return <div className=\"idk-state\">No services available.</div>\n }\n\n const gridStyle = layout === 'grid'\n ? { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={[\n 'idk-services',\n layout === 'grid' ? 'idk-services--grid' : 'idk-services--list',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={gridStyle}\n >\n {data.services.map((service) => (\n <ServiceCard\n key={service.id}\n service={service}\n showDescription={showDescription}\n showPrice={showPrice}\n onSelect={onSelect}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport type { StaffMember } from '../types'\n\ninterface TeamMemberProps {\n member: StaffMember\n className?: string\n showRole?: boolean\n showEmail?: boolean\n}\n\nexport function TeamMember({\n member,\n className,\n showRole = true,\n showEmail = false,\n}: TeamMemberProps) {\n const initials = member.name\n ?.split(' ')\n .map((part) => part[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n\n return (\n <div className={['idk-card', className].filter(Boolean).join(' ')}>\n <div className=\"idk-team__avatar\">\n {member.photo?.url ? (\n <img src={member.photo.url} alt={member.name} />\n ) : (\n <span>{initials}</span>\n )}\n </div>\n <div className=\"idk-team__info\">\n <h3 className=\"idk-card__title\">{member.name}</h3>\n {showRole ? (\n <p className=\"idk-card__description\">{member.role || 'Staff'}</p>\n ) : null}\n {showEmail ? (\n <p className=\"idk-card__meta\">{member.email}</p>\n ) : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useTeam } from '../core/hooks/useTeam'\nimport { TeamMember } from './TeamMember'\n\ninterface TeamGridProps {\n columns?: number\n className?: string\n showRole?: boolean\n showEmail?: boolean\n}\n\nexport function TeamGrid({\n columns = 3,\n className,\n showRole,\n showEmail,\n}: TeamGridProps) {\n const { data, isLoading, error } = useTeam()\n\n if (isLoading) {\n return <div className=\"idk-state\">Loading team...</div>\n }\n\n if (error || !data?.team?.length) {\n return <div className=\"idk-state\">No team members available.</div>\n }\n\n const gridStyle = { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n\n return (\n <div\n className={['idk-team', className].filter(Boolean).join(' ')}\n style={gridStyle}\n >\n {data.team.map((member) => (\n <TeamMember\n key={member.id}\n member={member}\n showRole={showRole}\n showEmail={showEmail}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { apiRequest } from '../core/api-client'\nimport { usePlatformConfig } from '../core/context'\nimport type { ContactSubmissionInput } from '../types'\n\ntype ContactField = 'name' | 'email' | 'phone' | 'subject' | 'message'\n\ninterface ContactFormProps {\n fields?: ContactField[]\n formType?: ContactSubmissionInput['formType']\n submitLabel?: string\n className?: string\n onSuccess?: () => void\n onError?: (message: string) => void\n}\n\nconst DEFAULT_FIELDS: ContactField[] = ['name', 'email', 'phone', 'message']\n\nexport function ContactForm({\n fields = DEFAULT_FIELDS,\n formType = 'contact',\n submitLabel = 'Send Message',\n className,\n onSuccess,\n onError,\n}: ContactFormProps) {\n const config = usePlatformConfig()\n const [formState, setFormState] = useState<Record<ContactField, string>>({\n name: '',\n email: '',\n phone: '',\n subject: '',\n message: '',\n })\n\n const mutation = useMutation({\n mutationFn: (payload: ContactSubmissionInput) =>\n apiRequest<{ submissionId: string | number }>(config, '/contact', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n onSuccess: () => {\n setFormState({ name: '', email: '', phone: '', subject: '', message: '' })\n onSuccess?.()\n },\n onError: (error) => {\n const message = error instanceof Error ? error.message : 'Failed to submit form'\n onError?.(message)\n },\n })\n\n const handleChange = (field: ContactField, value: string) => {\n setFormState((prev) => ({ ...prev, [field]: value }))\n }\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n\n mutation.mutate({\n name: formState.name,\n email: formState.email,\n phone: formState.phone || undefined,\n subject: formState.subject || undefined,\n message: formState.message,\n formType,\n })\n }\n\n return (\n <form className={['idk-form', className].filter(Boolean).join(' ')} onSubmit={handleSubmit}>\n {fields.includes('name') && (\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={formState.name}\n onChange={(event) => handleChange('name', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('email') && (\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={formState.email}\n onChange={(event) => handleChange('email', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('phone') && (\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={formState.phone}\n onChange={(event) => handleChange('phone', event.target.value)}\n />\n </label>\n )}\n {fields.includes('subject') && (\n <label className=\"idk-form__field\">\n <span>Subject</span>\n <input\n value={formState.subject}\n onChange={(event) => handleChange('subject', event.target.value)}\n />\n </label>\n )}\n {fields.includes('message') && (\n <label className=\"idk-form__field\">\n <span>Message</span>\n <textarea\n value={formState.message}\n onChange={(event) => handleChange('message', event.target.value)}\n rows={5}\n required\n />\n </label>\n )}\n <button type=\"submit\" className=\"idk-button\" disabled={mutation.isPending}>\n {mutation.isPending ? 'Sending...' : submitLabel}\n </button>\n {mutation.isError ? (\n <p className=\"idk-form__error\">Something went wrong. Please try again.</p>\n ) : null}\n {mutation.isSuccess ? (\n <p className=\"idk-form__success\">Thanks! We'll be in touch soon.</p>\n ) : null}\n </form>\n )\n}\n","\"use client\"\n\nimport { useMemo, useState } from \"react\"\nimport { useServices } from \"../core/hooks/useServices\"\nimport { useTeam } from \"../core/hooks/useTeam\"\nimport { useAvailability } from \"../core/hooks/useAvailability\"\nimport { useCreateBooking } from \"../core/hooks/useBooking\"\nimport type { Service, StaffMember } from \"../types\"\n\ninterface BookingWidgetProps {\n className?: string\n showStaffSelection?: boolean\n onSuccess?: (booking: unknown) => void\n}\n\ntype Step = \"service\" | \"staff\" | \"time\" | \"details\" | \"done\"\n\nexport function BookingWidget({\n className,\n showStaffSelection = true,\n onSuccess,\n}: BookingWidgetProps) {\n const { data: servicesData, isLoading: servicesLoading } = useServices()\n const { data: teamData } = useTeam()\n const createBooking = useCreateBooking()\n\n const [step, setStep] = useState<Step>(\"service\")\n const [selectedService, setSelectedService] = useState<Service | null>(null)\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null)\n const [selectedDate, setSelectedDate] = useState<string | null>(null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n const [selectedEndTime, setSelectedEndTime] = useState<string | null>(null)\n const [details, setDetails] = useState({\n name: \"\",\n email: \"\",\n phone: \"\",\n notes: \"\",\n })\n\n const staffOptions = useMemo(() => {\n if (!selectedService) return []\n if (selectedService.assignedStaff && selectedService.assignedStaff.length > 0) {\n return selectedService.assignedStaff\n }\n return teamData?.team || []\n }, [selectedService, teamData])\n\n const availability = useAvailability({\n serviceId: selectedService?.id || \"\",\n staffId: selectedStaff?.id,\n days: 7,\n enabled: Boolean(selectedService),\n })\n\n const requiresStaff =\n showStaffSelection ||\n selectedService?.requiresStaffSelection ||\n selectedService?.schedulingType === \"customer-choice\"\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault()\n if (!selectedService || !selectedDate || !selectedTime || !selectedEndTime) return\n\n const start = new Date(`${selectedDate}T${selectedTime}:00`)\n const end = new Date(`${selectedDate}T${selectedEndTime}:00`)\n\n const result = await createBooking.mutateAsync({\n serviceId: selectedService.id,\n staffId: selectedStaff?.id,\n startTime: start.toISOString(),\n endTime: end.toISOString(),\n customerName: details.name,\n customerEmail: details.email,\n customerPhone: details.phone || undefined,\n customerNotes: details.notes || undefined,\n })\n\n setStep(\"done\")\n onSuccess?.(result?.booking)\n }\n\n if (servicesLoading) {\n return <div className=\"idk-state\">Loading booking options...</div>\n }\n\n if (!servicesData?.services?.length) {\n return <div className=\"idk-state\">No services available.</div>\n }\n\n return (\n <div className={[\"idk-booking\", className].filter(Boolean).join(\" \")}>\n {step === \"service\" && (\n <div className=\"idk-booking__step\">\n <h3>Select a service</h3>\n <div className=\"idk-services idk-services--list\">\n {servicesData.services.map((service) => (\n <button\n key={service.id}\n type=\"button\"\n className=\"idk-card idk-card--clickable\"\n onClick={() => {\n setSelectedService(service)\n if (requiresStaff) {\n setStep(\"staff\")\n } else {\n setStep(\"time\")\n }\n }}\n >\n <div className=\"idk-card__header\">\n <span className=\"idk-card__title\">{service.name}</span>\n {typeof service.price === \"number\" && service.price > 0 ? (\n <span className=\"idk-card__price\">\n ${(service.price / 100).toFixed(2)}\n </span>\n ) : null}\n </div>\n <div className=\"idk-card__meta\">{service.duration} min</div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {step === \"staff\" && (\n <div className=\"idk-booking__step\">\n <h3>Select a team member</h3>\n <div className=\"idk-team\">\n {staffOptions.map((staff) => (\n <button\n key={staff.id}\n type=\"button\"\n className=\"idk-card idk-card--clickable\"\n onClick={() => {\n setSelectedStaff(staff)\n setStep(\"time\")\n }}\n >\n <span className=\"idk-card__title\">{staff.name}</span>\n <span className=\"idk-card__meta\">{staff.role || \"Staff\"}</span>\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"idk-link\"\n onClick={() => {\n setSelectedStaff(null)\n setStep(\"time\")\n }}\n >\n Continue without selecting\n </button>\n </div>\n )}\n\n {step === \"time\" && (\n <div className=\"idk-booking__step\">\n <h3>Select a time</h3>\n {availability.isLoading ? (\n <div className=\"idk-state\">Loading availability...</div>\n ) : availability.data ? (\n <div className=\"idk-availability\">\n <div className=\"idk-availability__dates\">\n {availability.data.dates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === selectedDate ? \"is-active\" : undefined}\n onClick={() => {\n setSelectedDate(entry.date)\n setSelectedTime(null)\n setSelectedEndTime(null)\n }}\n >\n {entry.date}\n </button>\n ))}\n </div>\n <div className=\"idk-availability__slots\">\n {(availability.data.dates.find((entry) => entry.date === selectedDate)?.slots ||\n availability.data.dates[0]?.slots ||\n [])\n .filter((slot) => slot.available)\n .map((slot) => (\n <button\n key={`${slot.time}-${slot.endTime}`}\n type=\"button\"\n className={slot.time === selectedTime ? \"is-active\" : undefined}\n onClick={() => {\n const date = selectedDate || availability.data?.dates[0]?.date\n setSelectedDate(date || null)\n setSelectedTime(slot.time)\n setSelectedEndTime(slot.endTime)\n setStep(\"details\")\n }}\n >\n {slot.time}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"idk-state\">No availability found.</div>\n )}\n </div>\n )}\n\n {step === \"details\" && (\n <form className=\"idk-form\" onSubmit={handleSubmit}>\n <h3>Your details</h3>\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={details.name}\n onChange={(event) => setDetails((prev) => ({ ...prev, name: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={details.email}\n onChange={(event) => setDetails((prev) => ({ ...prev, email: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={details.phone}\n onChange={(event) => setDetails((prev) => ({ ...prev, phone: event.target.value }))}\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Notes</span>\n <textarea\n rows={4}\n value={details.notes}\n onChange={(event) => setDetails((prev) => ({ ...prev, notes: event.target.value }))}\n />\n </label>\n <button type=\"submit\" className=\"idk-button\" disabled={createBooking.isPending}>\n {createBooking.isPending ? \"Booking...\" : \"Confirm booking\"}\n </button>\n </form>\n )}\n\n {step === \"done\" && (\n <div className=\"idk-state\">\n Booking confirmed. You'll receive a confirmation email shortly.\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useAvailability } from '../core/hooks/useAvailability'\n\ninterface AvailabilityPickerProps {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n className?: string\n onSelect?: (params: { date: string; time: string; endTime: string }) => void\n}\n\nexport function AvailabilityPicker({\n serviceId,\n staffId,\n date,\n days = 7,\n className,\n onSelect,\n}: AvailabilityPickerProps) {\n const [selectedDate, setSelectedDate] = useState<string | null>(date || null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n\n const { data, isLoading } = useAvailability({\n serviceId,\n staffId,\n date,\n days,\n })\n\n if (isLoading) {\n return <div className=\"idk-state\">Loading availability...</div>\n }\n\n if (!data?.dates?.length) {\n return <div className=\"idk-state\">No availability found.</div>\n }\n\n const activeDate = selectedDate || data.dates[0]?.date\n const activeSlots = data.dates.find((entry) => entry.date === activeDate)?.slots || []\n\n return (\n <div className={['idk-availability', className].filter(Boolean).join(' ')}>\n <div className=\"idk-availability__dates\">\n {data.dates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === activeDate ? 'is-active' : undefined}\n onClick={() => {\n setSelectedDate(entry.date)\n setSelectedTime(null)\n }}\n >\n {entry.date}\n </button>\n ))}\n </div>\n <div className=\"idk-availability__slots\">\n {activeSlots.filter((slot) => slot.available).length === 0 ? (\n <div className=\"idk-state\">No slots available.</div>\n ) : (\n activeSlots\n .filter((slot) => slot.available)\n .map((slot) => (\n <button\n key={`${activeDate}-${slot.time}`}\n type=\"button\"\n className={selectedTime === slot.time ? 'is-active' : undefined}\n onClick={() => {\n setSelectedTime(slot.time)\n if (onSelect && activeDate) {\n onSelect({\n date: activeDate,\n time: slot.time,\n endTime: slot.endTime,\n })\n }\n }}\n >\n {slot.time}\n </button>\n ))\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport type { Service } from \"../types\"\n\ninterface ServicePickerProps {\n services: Service[]\n selectedId?: string | null\n onSelect?: (service: Service) => void\n className?: string\n}\n\nexport function ServicePicker({\n services,\n selectedId,\n onSelect,\n className,\n}: ServicePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {services.map((service) => (\n <button\n key={service.id}\n type=\"button\"\n className={selectedId === service.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(service)}\n >\n <span>{service.name}</span>\n <small>{service.duration} min</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { StaffMember } from \"../types\"\n\ninterface StaffPickerProps {\n staff: StaffMember[]\n selectedId?: string | null\n onSelect?: (member: StaffMember) => void\n className?: string\n}\n\nexport function StaffPicker({\n staff,\n selectedId,\n onSelect,\n className,\n}: StaffPickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {staff.map((member) => (\n <button\n key={member.id}\n type=\"button\"\n className={selectedId === member.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(member)}\n >\n <span>{member.name}</span>\n <small>{member.role || \"Staff\"}</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\ninterface DatePickerProps {\n dates: string[]\n selectedDate?: string | null\n onSelect?: (date: string) => void\n className?: string\n}\n\nexport function DatePicker({\n dates,\n selectedDate,\n onSelect,\n className,\n}: DatePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {dates.map((date) => (\n <button\n key={date}\n type=\"button\"\n className={selectedDate === date ? \"is-active\" : undefined}\n onClick={() => onSelect?.(date)}\n >\n {date}\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { AvailabilitySlot } from \"../types\"\n\ninterface TimePickerProps {\n slots: AvailabilitySlot[]\n selectedTime?: string | null\n onSelect?: (slot: AvailabilitySlot) => void\n className?: string\n}\n\nexport function TimePicker({\n slots,\n selectedTime,\n onSelect,\n className,\n}: TimePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {slots.map((slot) => (\n <button\n key={`${slot.time}-${slot.endTime}`}\n type=\"button\"\n className={selectedTime === slot.time ? \"is-active\" : undefined}\n disabled={!slot.available}\n onClick={() => onSelect?.(slot)}\n >\n {slot.time}\n </button>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","jsx","jsx","jsx","jsxs","jsx","useState","useMutation","jsx","jsxs","useState","useMutation","useMemo","useState","jsx","jsxs","useState","useMemo","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsx"]}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/* src/styles.css */
|
|
2
|
+
:root {
|
|
3
|
+
--idk-primary: #0f172a;
|
|
4
|
+
--idk-primary-contrast: #ffffff;
|
|
5
|
+
--idk-accent: #2563eb;
|
|
6
|
+
--idk-border: #e2e8f0;
|
|
7
|
+
--idk-muted: #64748b;
|
|
8
|
+
--idk-bg: #ffffff;
|
|
9
|
+
--idk-bg-muted: #f8fafc;
|
|
10
|
+
--idk-radius: 12px;
|
|
11
|
+
--idk-shadow: 0 10px 30px rgba(15, 23, 42, 0.08);
|
|
12
|
+
--idk-font:
|
|
13
|
+
ui-sans-serif,
|
|
14
|
+
system-ui,
|
|
15
|
+
-apple-system,
|
|
16
|
+
"Segoe UI",
|
|
17
|
+
sans-serif;
|
|
18
|
+
}
|
|
19
|
+
.idk-state {
|
|
20
|
+
font-family: var(--idk-font);
|
|
21
|
+
color: var(--idk-muted);
|
|
22
|
+
font-size: 14px;
|
|
23
|
+
}
|
|
24
|
+
.idk-card {
|
|
25
|
+
border: 1px solid var(--idk-border);
|
|
26
|
+
border-radius: var(--idk-radius);
|
|
27
|
+
background: var(--idk-bg);
|
|
28
|
+
padding: 16px;
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
gap: 8px;
|
|
32
|
+
box-shadow: var(--idk-shadow);
|
|
33
|
+
}
|
|
34
|
+
.idk-card--clickable {
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
|
37
|
+
}
|
|
38
|
+
.idk-card--clickable:hover {
|
|
39
|
+
transform: translateY(-2px);
|
|
40
|
+
box-shadow: 0 14px 32px rgba(15, 23, 42, 0.12);
|
|
41
|
+
}
|
|
42
|
+
.idk-card__header {
|
|
43
|
+
display: flex;
|
|
44
|
+
justify-content: space-between;
|
|
45
|
+
align-items: baseline;
|
|
46
|
+
gap: 12px;
|
|
47
|
+
}
|
|
48
|
+
.idk-card__title {
|
|
49
|
+
margin: 0;
|
|
50
|
+
font-size: 16px;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
color: var(--idk-primary);
|
|
53
|
+
}
|
|
54
|
+
.idk-card__price {
|
|
55
|
+
font-size: 14px;
|
|
56
|
+
color: var(--idk-accent);
|
|
57
|
+
font-weight: 600;
|
|
58
|
+
}
|
|
59
|
+
.idk-card__description {
|
|
60
|
+
margin: 0;
|
|
61
|
+
color: var(--idk-muted);
|
|
62
|
+
font-size: 14px;
|
|
63
|
+
}
|
|
64
|
+
.idk-card__meta {
|
|
65
|
+
font-size: 12px;
|
|
66
|
+
color: var(--idk-muted);
|
|
67
|
+
display: flex;
|
|
68
|
+
gap: 10px;
|
|
69
|
+
}
|
|
70
|
+
.idk-services {
|
|
71
|
+
display: grid;
|
|
72
|
+
gap: 16px;
|
|
73
|
+
}
|
|
74
|
+
.idk-services--list {
|
|
75
|
+
display: flex;
|
|
76
|
+
flex-direction: column;
|
|
77
|
+
gap: 12px;
|
|
78
|
+
}
|
|
79
|
+
.idk-team {
|
|
80
|
+
display: grid;
|
|
81
|
+
gap: 16px;
|
|
82
|
+
}
|
|
83
|
+
.idk-team__avatar {
|
|
84
|
+
width: 56px;
|
|
85
|
+
height: 56px;
|
|
86
|
+
border-radius: 50%;
|
|
87
|
+
background: var(--idk-bg-muted);
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
overflow: hidden;
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
color: var(--idk-primary);
|
|
94
|
+
}
|
|
95
|
+
.idk-team__avatar img {
|
|
96
|
+
width: 100%;
|
|
97
|
+
height: 100%;
|
|
98
|
+
-o-object-fit: cover;
|
|
99
|
+
object-fit: cover;
|
|
100
|
+
}
|
|
101
|
+
.idk-form {
|
|
102
|
+
display: grid;
|
|
103
|
+
gap: 14px;
|
|
104
|
+
font-family: var(--idk-font);
|
|
105
|
+
}
|
|
106
|
+
.idk-form__field {
|
|
107
|
+
display: grid;
|
|
108
|
+
gap: 6px;
|
|
109
|
+
font-size: 14px;
|
|
110
|
+
color: var(--idk-primary);
|
|
111
|
+
}
|
|
112
|
+
.idk-form__field input,
|
|
113
|
+
.idk-form__field textarea,
|
|
114
|
+
.idk-form__field select {
|
|
115
|
+
border-radius: 10px;
|
|
116
|
+
border: 1px solid var(--idk-border);
|
|
117
|
+
padding: 10px 12px;
|
|
118
|
+
font-family: var(--idk-font);
|
|
119
|
+
}
|
|
120
|
+
.idk-form__error {
|
|
121
|
+
color: #dc2626;
|
|
122
|
+
font-size: 13px;
|
|
123
|
+
}
|
|
124
|
+
.idk-form__success {
|
|
125
|
+
color: #16a34a;
|
|
126
|
+
font-size: 13px;
|
|
127
|
+
}
|
|
128
|
+
.idk-button {
|
|
129
|
+
border-radius: 10px;
|
|
130
|
+
border: none;
|
|
131
|
+
padding: 12px 16px;
|
|
132
|
+
background: var(--idk-accent);
|
|
133
|
+
color: var(--idk-primary-contrast);
|
|
134
|
+
font-weight: 600;
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
}
|
|
137
|
+
.idk-button:disabled {
|
|
138
|
+
opacity: 0.7;
|
|
139
|
+
cursor: not-allowed;
|
|
140
|
+
}
|
|
141
|
+
.idk-link {
|
|
142
|
+
margin-top: 12px;
|
|
143
|
+
background: transparent;
|
|
144
|
+
border: none;
|
|
145
|
+
color: var(--idk-accent);
|
|
146
|
+
cursor: pointer;
|
|
147
|
+
text-decoration: underline;
|
|
148
|
+
font-size: 13px;
|
|
149
|
+
}
|
|
150
|
+
.idk-picker {
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-wrap: wrap;
|
|
153
|
+
gap: 8px;
|
|
154
|
+
}
|
|
155
|
+
.idk-picker button {
|
|
156
|
+
border: 1px solid var(--idk-border);
|
|
157
|
+
background: var(--idk-bg);
|
|
158
|
+
padding: 8px 12px;
|
|
159
|
+
border-radius: 999px;
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
font-size: 13px;
|
|
162
|
+
}
|
|
163
|
+
.idk-picker button.is-active,
|
|
164
|
+
.idk-availability__dates button.is-active,
|
|
165
|
+
.idk-availability__slots button.is-active {
|
|
166
|
+
background: var(--idk-accent);
|
|
167
|
+
color: var(--idk-primary-contrast);
|
|
168
|
+
border-color: transparent;
|
|
169
|
+
}
|
|
170
|
+
.idk-availability {
|
|
171
|
+
display: grid;
|
|
172
|
+
gap: 12px;
|
|
173
|
+
}
|
|
174
|
+
.idk-availability__dates,
|
|
175
|
+
.idk-availability__slots {
|
|
176
|
+
display: flex;
|
|
177
|
+
flex-wrap: wrap;
|
|
178
|
+
gap: 8px;
|
|
179
|
+
}
|
|
180
|
+
.idk-availability__dates button,
|
|
181
|
+
.idk-availability__slots button {
|
|
182
|
+
border: 1px solid var(--idk-border);
|
|
183
|
+
background: var(--idk-bg);
|
|
184
|
+
padding: 8px 12px;
|
|
185
|
+
border-radius: 10px;
|
|
186
|
+
cursor: pointer;
|
|
187
|
+
font-size: 13px;
|
|
188
|
+
}
|
|
189
|
+
.idk-availability__slots button:disabled {
|
|
190
|
+
opacity: 0.4;
|
|
191
|
+
cursor: not-allowed;
|
|
192
|
+
}
|
|
193
|
+
.idk-booking {
|
|
194
|
+
display: grid;
|
|
195
|
+
gap: 16px;
|
|
196
|
+
}
|
|
197
|
+
.idk-booking__step {
|
|
198
|
+
display: grid;
|
|
199
|
+
gap: 12px;
|
|
200
|
+
}
|
|
201
|
+
/*# sourceMappingURL=styles.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* Base styles for @idkwebsites/components */\n\n:root {\n --idk-primary: #0f172a;\n --idk-primary-contrast: #ffffff;\n --idk-accent: #2563eb;\n --idk-border: #e2e8f0;\n --idk-muted: #64748b;\n --idk-bg: #ffffff;\n --idk-bg-muted: #f8fafc;\n --idk-radius: 12px;\n --idk-shadow: 0 10px 30px rgba(15, 23, 42, 0.08);\n --idk-font: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n}\n\n.idk-state {\n font-family: var(--idk-font);\n color: var(--idk-muted);\n font-size: 14px;\n}\n\n.idk-card {\n border: 1px solid var(--idk-border);\n border-radius: var(--idk-radius);\n background: var(--idk-bg);\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n box-shadow: var(--idk-shadow);\n}\n\n.idk-card--clickable {\n cursor: pointer;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n}\n\n.idk-card--clickable:hover {\n transform: translateY(-2px);\n box-shadow: 0 14px 32px rgba(15, 23, 42, 0.12);\n}\n\n.idk-card__header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 12px;\n}\n\n.idk-card__title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--idk-primary);\n}\n\n.idk-card__price {\n font-size: 14px;\n color: var(--idk-accent);\n font-weight: 600;\n}\n\n.idk-card__description {\n margin: 0;\n color: var(--idk-muted);\n font-size: 14px;\n}\n\n.idk-card__meta {\n font-size: 12px;\n color: var(--idk-muted);\n display: flex;\n gap: 10px;\n}\n\n.idk-services {\n display: grid;\n gap: 16px;\n}\n\n.idk-services--list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.idk-team {\n display: grid;\n gap: 16px;\n}\n\n.idk-team__avatar {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--idk-bg-muted);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n font-weight: 600;\n color: var(--idk-primary);\n}\n\n.idk-team__avatar img {\n width: 100%;\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n}\n\n.idk-form {\n display: grid;\n gap: 14px;\n font-family: var(--idk-font);\n}\n\n.idk-form__field {\n display: grid;\n gap: 6px;\n font-size: 14px;\n color: var(--idk-primary);\n}\n\n.idk-form__field input,\n.idk-form__field textarea,\n.idk-form__field select {\n border-radius: 10px;\n border: 1px solid var(--idk-border);\n padding: 10px 12px;\n font-family: var(--idk-font);\n}\n\n.idk-form__error {\n color: #dc2626;\n font-size: 13px;\n}\n\n.idk-form__success {\n color: #16a34a;\n font-size: 13px;\n}\n\n.idk-button {\n border-radius: 10px;\n border: none;\n padding: 12px 16px;\n background: var(--idk-accent);\n color: var(--idk-primary-contrast);\n font-weight: 600;\n cursor: pointer;\n}\n\n.idk-button:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.idk-link {\n margin-top: 12px;\n background: transparent;\n border: none;\n color: var(--idk-accent);\n cursor: pointer;\n text-decoration: underline;\n font-size: 13px;\n}\n\n.idk-picker {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.idk-picker button {\n border: 1px solid var(--idk-border);\n background: var(--idk-bg);\n padding: 8px 12px;\n border-radius: 999px;\n cursor: pointer;\n font-size: 13px;\n}\n\n.idk-picker button.is-active,\n.idk-availability__dates button.is-active,\n.idk-availability__slots button.is-active {\n background: var(--idk-accent);\n color: var(--idk-primary-contrast);\n border-color: transparent;\n}\n\n.idk-availability {\n display: grid;\n gap: 12px;\n}\n\n.idk-availability__dates,\n.idk-availability__slots {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.idk-availability__dates button,\n.idk-availability__slots button {\n border: 1px solid var(--idk-border);\n background: var(--idk-bg);\n padding: 8px 12px;\n border-radius: 10px;\n cursor: pointer;\n font-size: 13px;\n}\n\n.idk-availability__slots button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.idk-booking {\n display: grid;\n gap: 16px;\n}\n\n.idk-booking__step {\n display: grid;\n gap: 12px;\n}\n"],"mappings":"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","names":[]}
|
package/dist/styles.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@idkwebsites/components",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React components for IDK Websites platform",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.mjs",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./styles.css": "./dist/styles.css"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
28
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@tanstack/react-query": "^5.80.7"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsup": "^8.5.0",
|
|
35
|
+
"typescript": "^5.7.3"
|
|
36
|
+
}
|
|
37
|
+
}
|