@tebuto/react-booking-widget 1.0.5 → 1.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/.storybook/main.ts +15 -0
- package/.storybook/preview.ts +39 -0
- package/README.md +308 -30
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/types.d.ts +493 -3
- package/package.json +47 -21
- package/pnpm-workspace.yaml +2 -0
- package/vite.config.ts +6 -0
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../node_modules/.pnpm/@rollup+plugin-typescript@12.1.2_rollup@4.41.1_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../src/components/TebutoBookingWidget.tsx","../../src/constants.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { JSX } from 'react'\nimport { TEBUTO_BOOKING_WIDGET_ID, TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT, TEBUTO_BOOKING_WIDGET_SCRIPT_URL } from '../constants'\nimport { TebutoBookingWidgetConfiguration } from '../types'\n\ntype TebutoBookingWidgetProps = {\n noScriptText?: string\n} & TebutoBookingWidgetConfiguration\n\nexport default function TebutoBookingWidget({ noScriptText = TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT, ...config }: TebutoBookingWidgetProps): JSX.Element {\n return (\n <div id={TEBUTO_BOOKING_WIDGET_ID} data-testid=\"tebuto-booking-widget-container\">\n <TebutoBookingWidgetScript config={config} />\n <noscript data-testid=\"tebuto-booking-widget-noscript\">{noScriptText}</noscript>\n </div>\n )\n}\n\nfunction TebutoBookingWidgetScript({ config }: { config: TebutoBookingWidgetConfiguration }): JSX.Element {\n return (\n <script\n src={TEBUTO_BOOKING_WIDGET_SCRIPT_URL}\n data-therapist-uuid={config.therapistUUID}\n {...(config.backgroundColor ? { 'data-background-color': config.backgroundColor } : {})}\n {...(config.categories ? { 'data-categories': config.categories.join(',') } : {})}\n {...(config.border !== undefined ? { 'data-border': config.border ? 'true' : 'false' } : {})}\n data-testid=\"tebuto-booking-widget-script\"\n />\n )\n}\n","export const TEBUTO_BOOKING_WIDGET_SCRIPT_URL = 'https://widget.tebuto.de/booking-widget.js'\nexport const TEBUTO_BOOKING_WIDGET_ID = 'tebuto-booking-widget'\nexport const TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT = 'Widget konnte nicht geladen werden. Möglicherweise ist Skripting im Browser deaktiviert.'\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","SuppressedError","TebutoBookingWidget","_a","_b","noScriptText","config","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__rest","_jsxs","id","children","_jsx","TebutoBookingWidgetScript","src","therapistUUID","backgroundColor","categories","join","undefined","border"],"mappings":"kDA+BO,IAAIA,EAAW,WAQlB,OAPAA,EAAWC,OAAOC,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAII,KADTL,EAAIG,UAAUF,GACOJ,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,IAE9E,OAAON,CACV,EACMH,EAASa,MAAMC,KAAMP,UAChC,EAgSkD,mBAApBQ,iBAAiCA,gBChUvC,SAAAC,EAAoBC,GAAE,IAAAC,EAAAD,EAAAE,aAAAA,OAAe,IAAAD,ECNT,6FDMkDE,EDkC/F,SAAgBhB,EAAGiB,GACtB,IAAIlB,EAAI,CAAA,EACR,IAAK,IAAIM,KAAKL,EAAOH,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,IAAMY,EAAEC,QAAQb,GAAK,IAC9EN,EAAEM,GAAKL,EAAEK,IACb,GAAS,MAALL,GAAqD,mBAAjCH,OAAOsB,sBACtB,KAAIlB,EAAI,EAAb,IAAgBI,EAAIR,OAAOsB,sBAAsBnB,GAAIC,EAAII,EAAED,OAAQH,IAC3DgB,EAAEC,QAAQb,EAAEJ,IAAM,GAAKJ,OAAOS,UAAUc,qBAAqBZ,KAAKR,EAAGK,EAAEJ,MACvEF,EAAEM,EAAEJ,IAAMD,EAAEK,EAAEJ,IAF4B,CAItD,OAAOF,CACX,CC5C4CsB,CAAAR,EAAA,CAAA,iBACxC,OACIS,SAAKC,GCT2B,wBDSe,cAAA,kCAC3CC,SAAA,CAAAC,EAACC,EAAyB,CAACV,OAAQA,IACnCS,EAAsB,WAAA,CAAA,cAAA,0CAAkCV,MAGpE,CAEA,SAASW,EAA0Bb,GAAE,IAAAG,EAAMH,EAAAG,OACvC,OACIS,EACI,SAAA7B,EAAA,CAAA+B,ICpBoC,6CDoBC,sBAChBX,EAAOY,eACvBZ,EAAOa,gBAAkB,CAAE,wBAAyBb,EAAOa,iBAAoB,CAAE,EACjFb,EAAOc,WAAa,CAAE,kBAAmBd,EAAOc,WAAWC,KAAK,MAAS,CAAA,OACvDC,IAAlBhB,EAAOiB,OAAuB,CAAE,cAAejB,EAAOiB,OAAS,OAAS,SAAY,CAAA,iBAC7E,iCAGxB","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../node_modules/.pnpm/@rollup+plugin-typescript@12.3.0_rollup@4.54.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../../src/components/TebutoBookingWidget.tsx","../../src/constants.ts","../../src/hooks/TebutoProvider.tsx","../../src/hooks/useTherapist.ts","../../src/hooks/useAvailableSlots.ts","../../src/hooks/useClaimSlot.ts","../../src/hooks/useBookAppointment.ts","../../src/hooks/useBookingFlow.ts","../../src/components/examples/CustomBookingExample.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { JSX } from 'react'\nimport { TEBUTO_BOOKING_WIDGET_ID, TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT, TEBUTO_BOOKING_WIDGET_SCRIPT_URL } from '../constants'\nimport { TebutoBookingWidgetConfiguration, TebutoWidgetTheme } from '../types'\n\ntype TebutoBookingWidgetProps = {\n noScriptText?: string\n} & TebutoBookingWidgetConfiguration\n\nexport default function TebutoBookingWidget({ noScriptText = TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT, ...config }: TebutoBookingWidgetProps): JSX.Element {\n return (\n <div id={TEBUTO_BOOKING_WIDGET_ID} data-testid=\"tebuto-booking-widget-container\">\n <TebutoBookingWidgetScript config={config} />\n <noscript data-testid=\"tebuto-booking-widget-noscript\">{noScriptText}</noscript>\n </div>\n )\n}\n\ntype DataAttributes = {\n 'data-therapist-uuid': string\n 'data-background-color'?: string\n 'data-categories'?: string\n 'data-border'?: string\n 'data-include-subusers'?: string\n 'data-show-quick-filters'?: string\n 'data-inherit-font'?: string\n 'data-primary-color'?: string\n 'data-text-primary'?: string\n 'data-text-secondary'?: string\n 'data-border-color'?: string\n 'data-font-family'?: string\n}\n\nfunction buildDataAttributes(config: TebutoBookingWidgetConfiguration): DataAttributes {\n const attributes: DataAttributes = {\n 'data-therapist-uuid': config.therapistUUID\n }\n\n // Background color (top-level or from theme)\n const backgroundColor = config.backgroundColor ?? config.theme?.backgroundColor\n if (backgroundColor) {\n attributes['data-background-color'] = backgroundColor\n }\n\n // Categories\n if (config.categories && config.categories.length > 0) {\n attributes['data-categories'] = config.categories.join(',')\n }\n\n // Boolean options\n if (config.border !== undefined) {\n attributes['data-border'] = config.border ? 'true' : 'false'\n }\n\n if (config.includeSubusers !== undefined) {\n attributes['data-include-subusers'] = config.includeSubusers ? 'true' : 'false'\n }\n\n if (config.showQuickFilters !== undefined) {\n attributes['data-show-quick-filters'] = config.showQuickFilters ? 'true' : 'false'\n }\n\n // Inherit font (top-level or from theme)\n const inheritFont = config.inheritFont ?? config.theme?.inheritFont\n if (inheritFont !== undefined) {\n attributes['data-inherit-font'] = inheritFont ? 'true' : 'false'\n }\n\n // Theme colors\n if (config.theme) {\n addThemeAttributes(attributes, config.theme)\n }\n\n return attributes\n}\n\nfunction addThemeAttributes(attributes: DataAttributes, theme: TebutoWidgetTheme): void {\n if (theme.primaryColor) {\n attributes['data-primary-color'] = theme.primaryColor\n }\n\n if (theme.textPrimary) {\n attributes['data-text-primary'] = theme.textPrimary\n }\n\n if (theme.textSecondary) {\n attributes['data-text-secondary'] = theme.textSecondary\n }\n\n if (theme.borderColor) {\n attributes['data-border-color'] = theme.borderColor\n }\n\n if (theme.fontFamily) {\n attributes['data-font-family'] = theme.fontFamily\n }\n}\n\nfunction TebutoBookingWidgetScript({ config }: { config: TebutoBookingWidgetConfiguration }): JSX.Element {\n const dataAttributes = buildDataAttributes(config)\n\n return <script src={TEBUTO_BOOKING_WIDGET_SCRIPT_URL} {...dataAttributes} data-testid=\"tebuto-booking-widget-script\" />\n}\n","export const TEBUTO_BOOKING_WIDGET_SCRIPT_URL = 'https://widget.tebuto.de/booking.js'\nexport const TEBUTO_BOOKING_WIDGET_ID = 'tebuto-booking-widget'\nexport const TEBUTO_BOOKING_WIDGET_NO_SCRIPT_TEXT = 'Widget konnte nicht geladen werden. Möglicherweise ist Skripting im Browser deaktiviert.'\n","import { ReactNode, createContext, useContext, useMemo } from 'react'\n\nconst TEBUTO_API_BASE_URL = 'https://api.tebuto.de'\n\ntype TebutoConfig = {\n therapistUUID: string\n apiBaseUrl: string\n categories?: number[]\n includeSubusers?: boolean\n}\n\ntype TebutoContextValue = TebutoConfig & {\n buildUrl: (path: string) => string\n}\n\nconst TebutoContext = createContext<TebutoContextValue | null>(null)\n\ntype TebutoProviderProps = {\n therapistUUID: string\n apiBaseUrl?: string\n categories?: number[]\n includeSubusers?: boolean\n children: ReactNode\n}\n\n/**\n * TebutoProvider - Context provider for Tebuto booking hooks\n *\n * Wrap your booking components with this provider to share configuration\n * across all Tebuto hooks.\n *\n * @example\n * ```tsx\n * <TebutoProvider therapistUUID=\"your-uuid\">\n * <YourBookingComponent />\n * </TebutoProvider>\n * ```\n */\nexport function TebutoProvider({ therapistUUID, apiBaseUrl = TEBUTO_API_BASE_URL, categories, includeSubusers, children }: TebutoProviderProps) {\n const value = useMemo<TebutoContextValue>(\n () => ({\n therapistUUID,\n apiBaseUrl,\n categories,\n includeSubusers,\n buildUrl: (path: string) => `${apiBaseUrl}${path}`\n }),\n [therapistUUID, apiBaseUrl, categories, includeSubusers]\n )\n\n return <TebutoContext.Provider value={value}>{children}</TebutoContext.Provider>\n}\n\n/**\n * useTebutoContext - Access the Tebuto configuration context\n *\n * Must be used within a TebutoProvider.\n *\n * @throws Error if used outside of TebutoProvider\n */\nexport function useTebutoContext(): TebutoContextValue {\n const context = useContext(TebutoContext)\n\n if (!context) {\n throw new Error('useTebutoContext must be used within a TebutoProvider')\n }\n\n return context\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { AsyncState, Therapist } from '../api-types'\nimport { useTebutoContext } from './TebutoProvider'\n\ntype UseTherapistReturn = AsyncState<Therapist> & {\n refetch: () => Promise<void>\n}\n\n/**\n * useTherapist - Fetch therapist information\n *\n * Automatically fetches the therapist data when the component mounts.\n * Uses the therapistUUID from the TebutoProvider context.\n *\n * @example\n * ```tsx\n * const { data: therapist, isLoading, error } = useTherapist()\n *\n * if (isLoading) return <Spinner />\n * if (error) return <Error message={error.message} />\n *\n * return <h1>Book with {therapist.name}</h1>\n * ```\n */\nexport function useTherapist(): UseTherapistReturn {\n const { therapistUUID, buildUrl } = useTebutoContext()\n const [state, setState] = useState<AsyncState<Therapist>>({\n data: null,\n isLoading: true,\n error: null\n })\n\n const fetchTherapist = useCallback(async () => {\n setState(prev => ({ ...prev, isLoading: true, error: null }))\n\n try {\n const response = await fetch(buildUrl(`/therapists/uuid/${therapistUUID}`))\n\n if (!response.ok) {\n throw new Error(`Failed to fetch therapist: ${response.statusText}`)\n }\n\n const data = (await response.json()) as Therapist\n setState({ data, isLoading: false, error: null })\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error occurred')\n setState({ data: null, isLoading: false, error })\n }\n }, [therapistUUID, buildUrl])\n\n useEffect(() => {\n void fetchTherapist()\n }, [fetchTherapist])\n\n return {\n ...state,\n refetch: fetchTherapist\n }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { AsyncState, EnrichedTimeSlot, SlotsByDate, TimeSlot } from '../api-types'\nimport { useTebutoContext } from './TebutoProvider'\n\ntype UseAvailableSlotsOptions = {\n /** Auto-fetch on mount (default: true) */\n autoFetch?: boolean\n /** Filter by specific category IDs */\n categories?: number[]\n}\n\ntype UseAvailableSlotsReturn = AsyncState<TimeSlot[]> & {\n /** Refetch available slots */\n refetch: () => Promise<void>\n /** Slots grouped by date (YYYY-MM-DD) */\n slotsByDate: SlotsByDate\n /** All unique dates with available slots */\n availableDates: Date[]\n /** Get enriched slots for a specific date */\n getSlotsForDate: (date: Date) => EnrichedTimeSlot[]\n /** All unique categories from available slots */\n categories: Array<{ id: number; name: string; color: string }>\n /** Total count of available slots */\n totalSlots: number\n}\n\nfunction formatDate(date: Date): string {\n // Use local date to avoid timezone issues\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction enrichSlot(slot: TimeSlot): EnrichedTimeSlot {\n const startDate = new Date(slot.start)\n const endDate = new Date(slot.end)\n const now = new Date()\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n const slotDay = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate())\n\n const durationMinutes = Math.round((endDate.getTime() - startDate.getTime()) / 60000)\n\n return {\n ...slot,\n dateKey: formatDate(startDate),\n timeString: startDate.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }),\n durationMinutes,\n formattedPrice: new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(Number.parseFloat(slot.price)),\n isToday: slotDay.getTime() === today.getTime(),\n isPast: startDate < now\n }\n}\n\n/**\n * useAvailableSlots - Fetch and manage available time slots\n *\n * Provides available appointment slots with helpers for grouping,\n * filtering, and date navigation.\n *\n * @example\n * ```tsx\n * const {\n * slotsByDate,\n * availableDates,\n * getSlotsForDate,\n * isLoading\n * } = useAvailableSlots()\n *\n * const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n *\n * return (\n * <div>\n * <DatePicker dates={availableDates} onSelect={setSelectedDate} />\n * {selectedDate && (\n * <TimeSlotList slots={getSlotsForDate(selectedDate)} />\n * )}\n * </div>\n * )\n * ```\n */\nexport function useAvailableSlots(options: UseAvailableSlotsOptions = {}): UseAvailableSlotsReturn {\n const { autoFetch = true, categories: filterCategories } = options\n const { therapistUUID, buildUrl, categories: contextCategories } = useTebutoContext()\n\n const [state, setState] = useState<AsyncState<TimeSlot[]>>({\n data: null,\n isLoading: autoFetch,\n error: null\n })\n\n const categoriesToFilter = filterCategories ?? contextCategories\n // Stabilize the categories dependency to prevent infinite loops\n const categoriesKey = categoriesToFilter?.join(',') ?? ''\n\n const fetchSlots = useCallback(async () => {\n setState(prev => ({ ...prev, isLoading: true, error: null }))\n\n try {\n const url = new URL(buildUrl(`/events/${therapistUUID}`))\n\n if (categoriesKey) {\n url.searchParams.set('categories', categoriesKey)\n }\n\n const response = await fetch(url.toString())\n\n if (!response.ok) {\n throw new Error(`Failed to fetch slots: ${response.statusText}`)\n }\n\n const data = (await response.json()) as TimeSlot[]\n setState({ data, isLoading: false, error: null })\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error occurred')\n setState({ data: null, isLoading: false, error })\n }\n }, [therapistUUID, buildUrl, categoriesKey])\n\n useEffect(() => {\n if (autoFetch) {\n void fetchSlots()\n }\n }, [autoFetch, fetchSlots])\n\n const slotsByDate = useMemo<SlotsByDate>(() => {\n if (!state.data) return {}\n\n const grouped: SlotsByDate = {}\n const now = new Date()\n\n for (const slot of state.data) {\n const startDate = new Date(slot.start)\n\n if (startDate <= now) continue\n\n const dateKey = formatDate(startDate)\n\n if (!grouped[dateKey]) {\n grouped[dateKey] = []\n }\n grouped[dateKey].push(slot)\n }\n\n for (const dateKey in grouped) {\n grouped[dateKey].sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime())\n }\n\n return grouped\n }, [state.data])\n\n const availableDates = useMemo<Date[]>(() => {\n return Object.keys(slotsByDate)\n .map(dateStr => new Date(dateStr))\n .sort((a, b) => a.getTime() - b.getTime())\n }, [slotsByDate])\n\n const getSlotsForDate = useCallback(\n (date: Date): EnrichedTimeSlot[] => {\n const dateKey = formatDate(date)\n const slots = slotsByDate[dateKey] ?? []\n return slots.map(enrichSlot)\n },\n [slotsByDate]\n )\n\n const categories = useMemo(() => {\n if (!state.data) return []\n\n const categoryMap = new Map<number, { id: number; name: string; color: string }>()\n\n for (const slot of state.data) {\n if (!categoryMap.has(slot.eventCategoryId)) {\n categoryMap.set(slot.eventCategoryId, {\n id: slot.eventCategoryId,\n name: slot.title,\n color: slot.color\n })\n }\n }\n\n return Array.from(categoryMap.values())\n }, [state.data])\n\n return {\n ...state,\n refetch: fetchSlots,\n slotsByDate,\n availableDates,\n getSlotsForDate,\n categories,\n totalSlots: state.data?.length ?? 0\n }\n}\n","import { useCallback, useRef, useState } from 'react'\nimport type { ClaimResponse, TimeSlot } from '../api-types'\nimport { useTebutoContext } from './TebutoProvider'\n\ntype ClaimState = {\n claimedSlot: TimeSlot | null\n claimResponse: ClaimResponse | null\n isLoading: boolean\n error: Error | null\n}\n\ntype UseClaimSlotReturn = ClaimState & {\n /** Claim a time slot to reserve it temporarily */\n claim: (slot: TimeSlot) => Promise<ClaimResponse | null>\n /** Release the currently claimed slot */\n unclaim: () => Promise<void>\n /** Check if a specific slot is currently claimed */\n isClaimed: (slot: TimeSlot) => boolean\n /** Clear error state */\n clearError: () => void\n}\n\n/**\n * useClaimSlot - Temporarily claim a time slot\n *\n * Claims a time slot to reserve it while the user fills out\n * their booking information. Automatically handles unclaiming\n * when claiming a new slot.\n *\n * @example\n * ```tsx\n * const { claim, unclaim, claimedSlot, claimResponse, isLoading } = useClaimSlot()\n *\n * const handleSlotSelect = async (slot: TimeSlot) => {\n * const response = await claim(slot)\n * if (response?.isAvailable) {\n * setStep('booking-form')\n * }\n * }\n *\n * const handleCancel = () => {\n * unclaim()\n * setStep('slot-selection')\n * }\n * ```\n */\nexport function useClaimSlot(): UseClaimSlotReturn {\n const { therapistUUID, buildUrl } = useTebutoContext()\n const [state, setState] = useState<ClaimState>({\n claimedSlot: null,\n claimResponse: null,\n isLoading: false,\n error: null\n })\n\n const claimKeyRef = useRef<string | null>(null)\n\n const unclaim = useCallback(async () => {\n if (!state.claimedSlot || !claimKeyRef.current) {\n setState(prev => ({ ...prev, claimedSlot: null, claimResponse: null }))\n return\n }\n\n try {\n await fetch(buildUrl(`/events/${therapistUUID}/unclaim`), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n start: state.claimedSlot.start,\n eventRuleId: state.claimedSlot.eventRuleId\n })\n })\n } catch {\n // Silently fail unclaim - slot will auto-release eventually\n } finally {\n claimKeyRef.current = null\n setState(prev => ({ ...prev, claimedSlot: null, claimResponse: null }))\n }\n }, [state.claimedSlot, therapistUUID, buildUrl])\n\n const claim = useCallback(\n async (slot: TimeSlot): Promise<ClaimResponse | null> => {\n // If already claiming the same slot, return existing response\n const newKey = `${slot.start}-${slot.eventRuleId}`\n if (claimKeyRef.current === newKey && state.claimResponse) {\n return state.claimResponse\n }\n\n // Unclaim previous slot if any\n if (claimKeyRef.current && claimKeyRef.current !== newKey) {\n await unclaim()\n }\n\n setState(prev => ({\n ...prev,\n isLoading: true,\n error: null\n }))\n\n try {\n const response = await fetch(buildUrl(`/events/${therapistUUID}/claim`), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n start: slot.start,\n end: slot.end,\n eventRuleId: slot.eventRuleId\n })\n })\n\n if (!response.ok) {\n throw new Error(`Failed to claim slot: ${response.statusText}`)\n }\n\n const claimResponse = (await response.json()) as ClaimResponse\n\n if (!claimResponse.isAvailable) {\n setState(prev => ({\n ...prev,\n isLoading: false,\n error: new Error('This time slot is no longer available')\n }))\n return null\n }\n\n claimKeyRef.current = newKey\n setState({\n claimedSlot: slot,\n claimResponse,\n isLoading: false,\n error: null\n })\n\n return claimResponse\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error occurred')\n setState(prev => ({ ...prev, isLoading: false, error }))\n return null\n }\n },\n [therapistUUID, buildUrl, unclaim, state.claimResponse]\n )\n\n const isClaimed = useCallback(\n (slot: TimeSlot): boolean => {\n if (!state.claimedSlot) return false\n return state.claimedSlot.start === slot.start && state.claimedSlot.eventRuleId === slot.eventRuleId\n },\n [state.claimedSlot]\n )\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null }))\n }, [])\n\n return {\n ...state,\n claim,\n unclaim,\n isClaimed,\n clearError\n }\n}\n","import { useCallback, useState } from 'react'\nimport type { AppointmentLocation, BookingResponse, ClientInfo, TimeSlot } from '../api-types'\nimport { useTebutoContext } from './TebutoProvider'\n\ntype BookingState = {\n booking: BookingResponse | null\n isLoading: boolean\n error: Error | null\n isSuccess: boolean\n}\n\ntype BookAppointmentParams = {\n slot: TimeSlot\n client: ClientInfo\n locationSelection?: AppointmentLocation\n}\n\ntype UseBookAppointmentReturn = BookingState & {\n /** Book the appointment */\n book: (params: BookAppointmentParams) => Promise<BookingResponse | null>\n /** Reset the booking state */\n reset: () => void\n /** Download the calendar file (.ics) */\n downloadCalendar: () => void\n}\n\n/**\n * useBookAppointment - Complete the booking process\n *\n * Submits the booking with client information and handles\n * the response including calendar download.\n *\n * @example\n * ```tsx\n * const { book, booking, isLoading, isSuccess, downloadCalendar, reset } = useBookAppointment()\n *\n * const handleSubmit = async (clientInfo: ClientInfo) => {\n * const result = await book({\n * slot: claimedSlot,\n * client: clientInfo,\n * locationSelection: selectedLocation\n * })\n *\n * if (result) {\n * setStep('confirmation')\n * }\n * }\n *\n * if (isSuccess) {\n * return (\n * <SuccessMessage>\n * <button onClick={downloadCalendar}>Add to Calendar</button>\n * <button onClick={reset}>Book Another</button>\n * </SuccessMessage>\n * )\n * }\n * ```\n */\nexport function useBookAppointment(): UseBookAppointmentReturn {\n const { therapistUUID, buildUrl } = useTebutoContext()\n const [state, setState] = useState<BookingState>({\n booking: null,\n isLoading: false,\n error: null,\n isSuccess: false\n })\n\n const book = useCallback(\n async (params: BookAppointmentParams): Promise<BookingResponse | null> => {\n const { slot, client, locationSelection } = params\n\n setState(prev => ({ ...prev, isLoading: true, error: null }))\n\n try {\n const response = await fetch(buildUrl(`/events/${therapistUUID}/book`), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n start: slot.start,\n end: slot.end,\n eventRuleId: slot.eventRuleId,\n locationSelection: locationSelection ?? slot.location,\n ...client\n })\n })\n\n if (!response.ok) {\n throw new Error(`Booking failed: ${response.statusText}`)\n }\n\n const booking = (await response.json()) as BookingResponse\n\n setState({\n booking,\n isLoading: false,\n error: null,\n isSuccess: true\n })\n\n return booking\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error occurred')\n setState(prev => ({ ...prev, isLoading: false, error, isSuccess: false }))\n return null\n }\n },\n [therapistUUID, buildUrl]\n )\n\n const reset = useCallback(() => {\n setState({\n booking: null,\n isLoading: false,\n error: null,\n isSuccess: false\n })\n }, [])\n\n const downloadCalendar = useCallback(() => {\n if (!state.booking?.ics) return\n\n const blob = new Blob([state.booking.ics], { type: 'text/calendar;charset=utf-8' })\n const url = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.setAttribute('download', 'appointment.ics')\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n window.URL.revokeObjectURL(url)\n }, [state.booking])\n\n return {\n ...state,\n book,\n reset,\n downloadCalendar\n }\n}\n","import { useCallback, useMemo, useState } from 'react'\nimport type { AppointmentLocation, BookingResponse, ClientInfo, EnrichedTimeSlot, TimeSlot } from '../api-types'\nimport { useAvailableSlots } from './useAvailableSlots'\nimport { useBookAppointment } from './useBookAppointment'\nimport { useClaimSlot } from './useClaimSlot'\nimport { useTherapist } from './useTherapist'\n\ntype BookingStep = 'loading' | 'date-selection' | 'time-selection' | 'booking-form' | 'confirmation' | 'error'\n\ntype UseBookingFlowOptions = {\n /** Categories to filter by */\n categories?: number[]\n /** Callback when booking is complete */\n onBookingComplete?: (booking: BookingResponse) => void\n /** Callback on any error */\n onError?: (error: Error) => void\n}\n\ntype UseBookingFlowReturn = {\n /** Current booking step */\n step: BookingStep\n /** Go to a specific step */\n goToStep: (step: BookingStep) => void\n\n /** Therapist information */\n therapist: ReturnType<typeof useTherapist>\n\n /** Available slots management */\n slots: ReturnType<typeof useAvailableSlots>\n\n /** Selected date */\n selectedDate: Date | null\n /** Select a date */\n selectDate: (date: Date | null) => void\n /** Slots for the selected date */\n selectedDateSlots: EnrichedTimeSlot[]\n\n /** Selected time slot */\n selectedSlot: TimeSlot | null\n /** Select a time slot (claims it) */\n selectSlot: (slot: TimeSlot | null) => Promise<boolean>\n\n /** Selected location (for not-fixed appointments) */\n selectedLocation: AppointmentLocation | null\n /** Set the location selection */\n setLocation: (location: AppointmentLocation) => void\n\n /** Claim state */\n claim: ReturnType<typeof useClaimSlot>\n\n /** Booking state */\n booking: ReturnType<typeof useBookAppointment>\n\n /** Submit booking with client info */\n submitBooking: (client: ClientInfo) => Promise<boolean>\n\n /** Start over from the beginning */\n reset: () => void\n\n /** Overall loading state */\n isLoading: boolean\n\n /** Current error if any */\n error: Error | null\n}\n\n/**\n * useBookingFlow - Complete booking flow orchestration\n *\n * A convenience hook that combines all booking hooks and manages\n * the booking flow state. Perfect for quickly building a booking UI.\n *\n * @example\n * ```tsx\n * function BookingPage() {\n * const {\n * step,\n * therapist,\n * slots,\n * selectedDate,\n * selectDate,\n * selectedDateSlots,\n * selectSlot,\n * submitBooking,\n * booking,\n * reset\n * } = useBookingFlow()\n *\n * switch (step) {\n * case 'loading':\n * return <LoadingSpinner />\n *\n * case 'date-selection':\n * return (\n * <DatePicker\n * availableDates={slots.availableDates}\n * onSelect={selectDate}\n * />\n * )\n *\n * case 'time-selection':\n * return (\n * <TimeSlotPicker\n * slots={selectedDateSlots}\n * onSelect={selectSlot}\n * />\n * )\n *\n * case 'booking-form':\n * return (\n * <BookingForm onSubmit={submitBooking} />\n * )\n *\n * case 'confirmation':\n * return (\n * <Confirmation\n * booking={booking.booking}\n * onReset={reset}\n * />\n * )\n * }\n * }\n * ```\n */\nexport function useBookingFlow(options: UseBookingFlowOptions = {}): UseBookingFlowReturn {\n const { onBookingComplete, onError } = options\n\n const [step, setStep] = useState<BookingStep>('loading')\n const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n const [selectedSlot, setSelectedSlot] = useState<TimeSlot | null>(null)\n const [selectedLocation, setSelectedLocation] = useState<AppointmentLocation | null>(null)\n\n const therapist = useTherapist()\n const slots = useAvailableSlots({ categories: options.categories })\n const claim = useClaimSlot()\n const booking = useBookAppointment()\n\n // Auto-advance from loading when data is ready\n useMemo(() => {\n if (step === 'loading' && !therapist.isLoading && !slots.isLoading) {\n if (therapist.error || slots.error) {\n setStep('error')\n } else {\n setStep('date-selection')\n }\n }\n }, [step, therapist.isLoading, slots.isLoading, therapist.error, slots.error])\n\n const selectedDateSlots = useMemo(() => {\n if (!selectedDate) return []\n return slots.getSlotsForDate(selectedDate)\n }, [selectedDate, slots])\n\n const selectDate = useCallback(\n (date: Date | null) => {\n setSelectedDate(date)\n setSelectedSlot(null)\n setSelectedLocation(null)\n\n if (date) {\n setStep('time-selection')\n }\n },\n [setSelectedDate, setSelectedSlot, setSelectedLocation, setStep]\n )\n\n const selectSlot = useCallback(\n async (slot: TimeSlot | null): Promise<boolean> => {\n if (!slot) {\n await claim.unclaim()\n setSelectedSlot(null)\n setSelectedLocation(null)\n return true\n }\n\n const response = await claim.claim(slot)\n\n if (!response) {\n if (claim.error) {\n onError?.(claim.error)\n }\n return false\n }\n\n setSelectedSlot(slot)\n\n // Auto-set location if it's fixed\n if (slot.location !== 'not-fixed') {\n setSelectedLocation(slot.location)\n }\n\n setStep('booking-form')\n return true\n },\n [claim, onError]\n )\n\n const submitBooking = useCallback(\n async (client: ClientInfo): Promise<boolean> => {\n if (!selectedSlot) return false\n\n const result = await booking.book({\n slot: selectedSlot,\n client,\n locationSelection: selectedLocation ?? selectedSlot.location\n })\n\n if (!result) {\n if (booking.error) {\n onError?.(booking.error)\n }\n return false\n }\n\n onBookingComplete?.(result)\n setStep('confirmation')\n return true\n },\n [selectedSlot, selectedLocation, booking, onBookingComplete, onError]\n )\n\n const reset = useCallback(() => {\n setStep('loading')\n setSelectedDate(null)\n setSelectedSlot(null)\n setSelectedLocation(null)\n booking.reset()\n claim.unclaim()\n slots.refetch()\n }, [booking, claim, slots])\n\n const goToStep = useCallback((newStep: BookingStep) => {\n setStep(newStep)\n }, [])\n\n const setLocation = useCallback((location: AppointmentLocation) => {\n setSelectedLocation(location)\n }, [])\n\n const isLoading = therapist.isLoading || slots.isLoading || claim.isLoading || booking.isLoading\n\n const error = therapist.error ?? slots.error ?? claim.error ?? booking.error\n\n return {\n step,\n goToStep,\n therapist,\n slots,\n selectedDate,\n selectDate,\n selectedDateSlots,\n selectedSlot,\n selectSlot,\n selectedLocation,\n setLocation,\n claim,\n booking,\n submitBooking,\n reset,\n isLoading,\n error\n }\n}\n","import { FormEvent, useState, useMemo } from 'react'\nimport type { AppointmentLocation, ClientInfo, EnrichedTimeSlot } from '../../api-types'\nimport { TebutoProvider, useBookingFlow } from '../../hooks'\n\n/** CSS Variables for theming */\nconst cssVariables = {\n '--booking-bg': '#0f0f10',\n '--booking-surface': '#18181b',\n '--booking-surface-elevated': '#1f1f23',\n '--booking-surface-hover': '#27272a',\n '--booking-border': '#2d2d30',\n '--booking-border-subtle': '#232326',\n '--booking-text': '#fafafa',\n '--booking-text-secondary': '#d4d4d8',\n '--booking-text-muted': '#a1a1aa',\n '--booking-text-subtle': '#71717a',\n '--booking-accent': '#10b981',\n '--booking-accent-hover': '#34d399',\n '--booking-accent-muted': 'rgba(16, 185, 129, 0.12)',\n '--booking-accent-glow': 'rgba(16, 185, 129, 0.25)',\n '--booking-error': '#ef4444',\n '--booking-error-bg': 'rgba(239, 68, 68, 0.1)',\n '--booking-radius': '10px',\n '--booking-radius-sm': '6px',\n '--booking-radius-lg': '14px',\n '--booking-shadow': '0 4px 24px rgba(0, 0, 0, 0.4)',\n '--booking-transition': '0.15s ease',\n '--booking-font': '\"Inter\", -apple-system, BlinkMacSystemFont, sans-serif'\n} as const\n\nconst globalStyles = `\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');\n@keyframes spin { to { transform: rotate(360deg); } }\n@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\n`\n\n// ============================================\n// COMPONENTS\n// ============================================\n\nfunction Spinner() {\n return (\n <div\n style={{\n width: 32,\n height: 32,\n border: '2px solid var(--booking-border)',\n borderTopColor: 'var(--booking-accent)',\n borderRadius: '50%',\n animation: 'spin 0.6s linear infinite'\n }}\n />\n )\n}\n\nfunction LoadingState() {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 80,\n gap: 16\n }}\n >\n <Spinner />\n <span style={{ color: 'var(--booking-text-muted)', fontSize: 14 }}>Verfügbare Termine werden geladen...</span>\n </div>\n )\n}\n\nfunction StepIndicator({ current, total }: { current: number; total: number }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8, marginBottom: 32 }}>\n {Array.from({ length: total }, (_, i) => (\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <div\n style={{\n width: i === current ? 28 : 10,\n height: 10,\n borderRadius: 5,\n background: i <= current ? 'var(--booking-accent)' : 'var(--booking-border)',\n transition: 'all 0.2s ease',\n boxShadow: i === current ? '0 0 12px var(--booking-accent-glow)' : 'none'\n }}\n />\n </div>\n ))}\n </div>\n )\n}\n\n// ============================================\n// CALENDAR COMPONENT\n// ============================================\n\ntype CalendarProps = {\n availableDates: Date[]\n selectedDate: Date | null\n onSelectDate: (date: Date) => void\n}\n\nfunction Calendar({ availableDates, selectedDate, onSelectDate }: CalendarProps) {\n const [viewDate, setViewDate] = useState(() => {\n // Start with the first available date's month, or current month\n return availableDates.length > 0 ? new Date(availableDates[0]) : new Date()\n })\n\n const availableDateSet = useMemo(() => {\n return new Set(availableDates.map(d => d.toDateString()))\n }, [availableDates])\n\n const { year, month, weeks } = useMemo(() => {\n const year = viewDate.getFullYear()\n const month = viewDate.getMonth()\n const firstDay = new Date(year, month, 1)\n const lastDay = new Date(year, month + 1, 0)\n const daysInMonth = lastDay.getDate()\n // Monday = 0, Sunday = 6 (European style)\n const firstDayOfWeek = (firstDay.getDay() + 6) % 7\n\n const weeks: (number | null)[][] = []\n let currentWeek: (number | null)[] = []\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDayOfWeek; i++) {\n currentWeek.push(null)\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n currentWeek.push(day)\n if (currentWeek.length === 7) {\n weeks.push(currentWeek)\n currentWeek = []\n }\n }\n\n // Fill remaining days\n if (currentWeek.length > 0) {\n while (currentWeek.length < 7) {\n currentWeek.push(null)\n }\n weeks.push(currentWeek)\n }\n\n return { year, month, daysInMonth, firstDayOfWeek, weeks }\n }, [viewDate])\n\n const monthNames = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']\n const dayNames = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']\n\n const goToPrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1))\n }\n\n const goToNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1))\n }\n\n const isDateAvailable = (day: number) => {\n const date = new Date(year, month, day)\n return availableDateSet.has(date.toDateString())\n }\n\n const isDateSelected = (day: number) => {\n if (!selectedDate) return false\n const date = new Date(year, month, day)\n return date.toDateString() === selectedDate.toDateString()\n }\n\n const isToday = (day: number) => {\n const today = new Date()\n return day === today.getDate() && month === today.getMonth() && year === today.getFullYear()\n }\n\n const handleDateClick = (day: number) => {\n if (isDateAvailable(day)) {\n onSelectDate(new Date(year, month, day))\n }\n }\n\n // Check if we can navigate\n const today = new Date()\n const canGoPrev = year > today.getFullYear() || (year === today.getFullYear() && month > today.getMonth())\n\n return (\n <div>\n {/* Month Navigation */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 20,\n padding: '0 4px'\n }}\n >\n <button\n type=\"button\"\n onClick={goToPrevMonth}\n disabled={!canGoPrev}\n style={{\n width: 36,\n height: 36,\n border: '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-surface)',\n color: canGoPrev ? 'var(--booking-text)' : 'var(--booking-text-subtle)',\n cursor: canGoPrev ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 16,\n transition: 'var(--booking-transition)',\n opacity: canGoPrev ? 1 : 0.4\n }}\n >\n ‹\n </button>\n <span style={{ fontSize: 16, fontWeight: 600, color: 'var(--booking-text)' }}>\n {monthNames[month]} {year}\n </span>\n <button\n type=\"button\"\n onClick={goToNextMonth}\n style={{\n width: 36,\n height: 36,\n border: '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-surface)',\n color: 'var(--booking-text)',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 16,\n transition: 'var(--booking-transition)'\n }}\n >\n ›\n </button>\n </div>\n\n {/* Weekday Headers */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 4,\n marginBottom: 8\n }}\n >\n {dayNames.map(day => (\n <div\n key={day}\n style={{\n textAlign: 'center',\n fontSize: 12,\n fontWeight: 500,\n color: 'var(--booking-text-subtle)',\n padding: '8px 0',\n textTransform: 'uppercase',\n letterSpacing: '0.05em'\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar Grid */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {weeks.map((week, weekIndex) => (\n <div key={weekIndex} style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 4 }}>\n {week.map((day, dayIndex) => {\n if (day === null) {\n return <div key={dayIndex} style={{ aspectRatio: '1', minHeight: 44 }} />\n }\n\n const available = isDateAvailable(day)\n const selected = isDateSelected(day)\n const todayMark = isToday(day)\n\n return (\n <button\n key={dayIndex}\n type=\"button\"\n onClick={() => handleDateClick(day)}\n disabled={!available}\n style={{\n aspectRatio: '1',\n minHeight: 44,\n border: selected ? '2px solid var(--booking-accent)' : todayMark ? '1px solid var(--booking-accent)' : '1px solid transparent',\n borderRadius: 'var(--booking-radius-sm)',\n background: selected ? 'var(--booking-accent)' : available ? 'var(--booking-surface-elevated)' : 'transparent',\n color: selected ? '#000' : available ? 'var(--booking-text)' : 'var(--booking-text-subtle)',\n cursor: available ? 'pointer' : 'default',\n fontSize: 14,\n fontWeight: selected ? 600 : available ? 500 : 400,\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'var(--booking-transition)',\n opacity: available ? 1 : 0.35,\n position: 'relative'\n }}\n >\n {day}\n {available && !selected && (\n <span\n style={{\n position: 'absolute',\n bottom: 6,\n width: 4,\n height: 4,\n borderRadius: '50%',\n background: 'var(--booking-accent)'\n }}\n />\n )}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n\n {/* Legend */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 20,\n marginTop: 20,\n paddingTop: 16,\n borderTop: '1px solid var(--booking-border-subtle)',\n fontSize: 12,\n color: 'var(--booking-text-muted)'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: 'var(--booking-accent)'\n }}\n />\n Termine verfügbar\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: 'var(--booking-text-subtle)',\n opacity: 0.35\n }}\n />\n Keine Termine\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================\n// TIME SLOT PICKER\n// ============================================\n\ntype TimeSlotPickerProps = {\n slots: EnrichedTimeSlot[]\n selectedSlot: EnrichedTimeSlot | null\n onSelectSlot: (slot: EnrichedTimeSlot) => void\n selectedDate: Date\n onBack: () => void\n}\n\nfunction TimeSlotPicker({ slots, selectedSlot, onSelectSlot, selectedDate, onBack }: TimeSlotPickerProps) {\n const getLocationIcon = (location: AppointmentLocation) => {\n switch (location) {\n case 'virtual':\n return '🎥'\n case 'onsite':\n return '📍'\n case 'not-fixed':\n return '🔄'\n }\n }\n\n const getLocationLabel = (location: AppointmentLocation) => {\n switch (location) {\n case 'virtual':\n return 'Online'\n case 'onsite':\n return 'Vor Ort'\n case 'not-fixed':\n return 'Flexibel'\n }\n }\n\n // Group slots by category\n const slotsByCategory = slots.reduce<Record<string, EnrichedTimeSlot[]>>((acc, slot) => {\n const key = slot.title\n if (!acc[key]) acc[key] = []\n acc[key].push(slot)\n return acc\n }, {})\n\n const formatDateLong = (date: Date) => {\n return date.toLocaleDateString('de-DE', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' })\n }\n\n return (\n <div>\n {/* Back button and date header */}\n <div style={{ marginBottom: 24 }}>\n <button\n type=\"button\"\n onClick={onBack}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n background: 'none',\n border: 'none',\n color: 'var(--booking-text-muted)',\n fontSize: 13,\n cursor: 'pointer',\n padding: '4px 0',\n marginBottom: 12,\n fontFamily: 'inherit',\n transition: 'var(--booking-transition)'\n }}\n >\n ← Zurück zum Kalender\n </button>\n\n <h3\n style={{\n fontSize: 18,\n fontWeight: 600,\n color: 'var(--booking-text)',\n margin: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 12\n }}\n >\n <span\n style={{\n width: 40,\n height: 40,\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-accent-muted)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 18\n }}\n >\n 🕐\n </span>\n {formatDateLong(selectedDate)}\n </h3>\n </div>\n\n {/* Slots grouped by category */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 28 }}>\n {Object.entries(slotsByCategory).map(([category, categorySlots]) => (\n <div key={category}>\n <h4\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: 'var(--booking-text-secondary)',\n margin: '0 0 12px 0',\n display: 'flex',\n alignItems: 'center',\n gap: 8\n }}\n >\n <span\n style={{\n width: 3,\n height: 14,\n borderRadius: 2,\n background: categorySlots[0]?.color || 'var(--booking-accent)'\n }}\n />\n {category}\n </h4>\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(240px, 1fr))',\n gap: 12\n }}\n >\n {categorySlots.map(slot => {\n const isSelected = selectedSlot?.start === slot.start && selectedSlot?.eventRuleId === slot.eventRuleId\n\n return (\n <button\n type=\"button\"\n key={`${slot.start}-${slot.eventRuleId}`}\n onClick={() => onSelectSlot(slot)}\n style={{\n padding: '14px 16px',\n border: isSelected ? '2px solid var(--booking-accent)' : '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius)',\n background: isSelected ? 'var(--booking-accent-muted)' : 'var(--booking-surface-elevated)',\n cursor: 'pointer',\n textAlign: 'left',\n fontFamily: 'inherit',\n transition: 'var(--booking-transition)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n fontSize: 17,\n fontWeight: 600,\n color: 'var(--booking-text)',\n fontVariantNumeric: 'tabular-nums'\n }}\n >\n {slot.timeString}\n </span>\n <span\n style={{\n fontSize: 11,\n color: 'var(--booking-text-subtle)',\n background: 'var(--booking-surface)',\n padding: '4px 8px',\n borderRadius: 4,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n whiteSpace: 'nowrap',\n flexShrink: 0\n }}\n >\n {getLocationIcon(slot.location)} {getLocationLabel(slot.location)}\n </span>\n </div>\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: 'var(--booking-accent)'\n }}\n >\n {slot.formattedPrice}\n </span>\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n\n {slots.length === 0 && (\n <div\n style={{\n textAlign: 'center',\n padding: 40,\n color: 'var(--booking-text-muted)'\n }}\n >\n Keine Termine an diesem Tag verfügbar.\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// BOOKING FORM\n// ============================================\n\ntype BookingFormProps = {\n slot: EnrichedTimeSlot\n showLocationSelector: boolean\n selectedLocation: AppointmentLocation | null\n onLocationChange: (location: AppointmentLocation) => void\n onSubmit: (client: ClientInfo) => void\n onBack: () => void\n isLoading: boolean\n error: Error | null\n}\n\nfunction BookingForm({ slot, showLocationSelector, selectedLocation, onLocationChange, onSubmit, onBack, isLoading, error }: BookingFormProps) {\n const [formData, setFormData] = useState({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n notes: ''\n })\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit({\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n phone: formData.phone || undefined,\n notes: formData.notes || undefined\n })\n }\n\n const formatDateShort = (dateStr: string) => {\n return new Date(dateStr).toLocaleDateString('de-DE', {\n weekday: 'short',\n day: 'numeric',\n month: 'short'\n })\n }\n\n const inputStyle = {\n width: '100%',\n padding: '14px 16px',\n border: '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-bg)',\n color: 'var(--booking-text)',\n fontSize: 15,\n fontFamily: 'inherit',\n outline: 'none',\n transition: 'var(--booking-transition)',\n boxSizing: 'border-box' as const\n }\n\n const labelStyle = {\n display: 'block',\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--booking-text-secondary)',\n marginBottom: 8,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.03em'\n }\n\n return (\n <div>\n {/* Back button */}\n <button\n type=\"button\"\n onClick={onBack}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n background: 'var(--booking-surface-elevated)',\n border: '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius-sm)',\n color: 'var(--booking-text-muted)',\n fontSize: 13,\n cursor: 'pointer',\n padding: '8px 14px',\n marginBottom: 24,\n fontFamily: 'inherit',\n transition: 'var(--booking-transition)'\n }}\n >\n ← Zurück\n </button>\n\n {/* Appointment Summary Card - Full Width */}\n <div\n style={{\n background: 'linear-gradient(135deg, var(--booking-accent-muted) 0%, var(--booking-surface-elevated) 100%)',\n borderRadius: 'var(--booking-radius-lg)',\n padding: 24,\n marginBottom: 28,\n border: '1px solid var(--booking-accent)',\n position: 'relative',\n overflow: 'hidden'\n }}\n >\n {/* Decorative accent */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: 6,\n height: '100%',\n background: slot.color || 'var(--booking-accent)'\n }}\n />\n\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 16 }}>\n {/* Left: Title and details */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 20 }}>\n <div\n style={{\n width: 56,\n height: 56,\n borderRadius: 'var(--booking-radius)',\n background: 'var(--booking-surface)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 24,\n border: '1px solid var(--booking-border)'\n }}\n >\n 📅\n </div>\n <div>\n <div style={{ fontSize: 18, fontWeight: 700, color: 'var(--booking-text)', marginBottom: 6 }}>{slot.title}</div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 16, fontSize: 14, color: 'var(--booking-text-muted)' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ opacity: 0.7 }}>📆</span> {formatDateShort(slot.start)}\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ opacity: 0.7 }}>🕐</span> {slot.timeString} Uhr\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ opacity: 0.7 }}>⏱</span> {slot.durationMinutes} Min.\n </span>\n </div>\n </div>\n </div>\n\n {/* Right: Price */}\n <div style={{ textAlign: 'right' }}>\n <div style={{ fontSize: 12, color: 'var(--booking-text-muted)', marginBottom: 2 }}>Preis</div>\n <div style={{ fontSize: 28, fontWeight: 700, color: 'var(--booking-accent)' }}>{slot.formattedPrice}</div>\n </div>\n </div>\n </div>\n\n {/* Location selector - if needed */}\n {showLocationSelector && (\n <div\n style={{\n background: 'var(--booking-surface-elevated)',\n borderRadius: 'var(--booking-radius)',\n padding: 20,\n marginBottom: 28,\n border: '1px solid var(--booking-border)'\n }}\n >\n <div style={{ fontSize: 14, fontWeight: 600, color: 'var(--booking-text)', marginBottom: 14 }}>Wo soll der Termin stattfinden?</div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\n {(['virtual', 'onsite'] as const).map(loc => (\n <button\n key={loc}\n type=\"button\"\n onClick={() => onLocationChange(loc)}\n style={{\n padding: '16px 20px',\n border: selectedLocation === loc ? '2px solid var(--booking-accent)' : '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius)',\n background: selectedLocation === loc ? 'var(--booking-accent-muted)' : 'var(--booking-surface)',\n color: 'var(--booking-text)',\n cursor: 'pointer',\n fontFamily: 'inherit',\n fontSize: 15,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n transition: 'var(--booking-transition)'\n }}\n >\n <span style={{ fontSize: 20 }}>{loc === 'virtual' ? '🎥' : '📍'}</span>\n {loc === 'virtual' ? 'Online-Termin' : 'Vor Ort'}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Contact Form */}\n <div\n style={{\n background: 'var(--booking-surface-elevated)',\n borderRadius: 'var(--booking-radius-lg)',\n padding: 28,\n border: '1px solid var(--booking-border)'\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 14,\n marginBottom: 24,\n paddingBottom: 20,\n borderBottom: '1px solid var(--booking-border)'\n }}\n >\n <div\n style={{\n width: 44,\n height: 44,\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-accent-muted)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 20\n }}\n >\n 👤\n </div>\n <div>\n <h3 style={{ fontSize: 17, fontWeight: 700, color: 'var(--booking-text)', margin: 0 }}>Ihre Kontaktdaten</h3>\n <p style={{ fontSize: 13, color: 'var(--booking-text-muted)', margin: '4px 0 0 0' }}>Wir benötigen diese Angaben für Ihre Terminbestätigung</p>\n </div>\n </div>\n\n {error && (\n <div\n style={{\n background: 'var(--booking-error-bg)',\n border: '1px solid var(--booking-error)',\n borderRadius: 'var(--booking-radius-sm)',\n padding: '14px 16px',\n marginBottom: 20,\n color: 'var(--booking-error)',\n fontSize: 14,\n display: 'flex',\n alignItems: 'center',\n gap: 10\n }}\n >\n <span>⚠️</span> {error.message}\n </div>\n )}\n\n <form onSubmit={handleSubmit} style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>\n {/* Name row */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>\n <div>\n <label htmlFor=\"booking-firstName\" style={labelStyle}>\n Vorname\n </label>\n <input\n id=\"booking-firstName\"\n type=\"text\"\n required\n value={formData.firstName}\n onChange={e => setFormData(d => ({ ...d, firstName: e.target.value }))}\n style={inputStyle}\n placeholder=\"Max\"\n />\n </div>\n <div>\n <label htmlFor=\"booking-lastName\" style={labelStyle}>\n Nachname\n </label>\n <input\n id=\"booking-lastName\"\n type=\"text\"\n required\n value={formData.lastName}\n onChange={e => setFormData(d => ({ ...d, lastName: e.target.value }))}\n style={inputStyle}\n placeholder=\"Mustermann\"\n />\n </div>\n </div>\n\n {/* Email */}\n <div>\n <label htmlFor=\"booking-email\" style={labelStyle}>\n E-Mail-Adresse\n </label>\n <input\n id=\"booking-email\"\n type=\"email\"\n required\n value={formData.email}\n onChange={e => setFormData(d => ({ ...d, email: e.target.value }))}\n style={inputStyle}\n placeholder=\"max@beispiel.de\"\n />\n </div>\n\n {/* Phone */}\n <div>\n <label htmlFor=\"booking-phone\" style={{ ...labelStyle, color: 'var(--booking-text-muted)' }}>\n Telefonnummer <span style={{ fontWeight: 400, textTransform: 'none' }}>(optional)</span>\n </label>\n <input\n id=\"booking-phone\"\n type=\"tel\"\n value={formData.phone}\n onChange={e => setFormData(d => ({ ...d, phone: e.target.value }))}\n style={inputStyle}\n placeholder=\"+49 123 456789\"\n />\n </div>\n\n {/* Notes */}\n <div>\n <label htmlFor=\"booking-notes\" style={{ ...labelStyle, color: 'var(--booking-text-muted)' }}>\n Nachricht <span style={{ fontWeight: 400, textTransform: 'none' }}>(optional)</span>\n </label>\n <textarea\n id=\"booking-notes\"\n value={formData.notes}\n onChange={e => setFormData(d => ({ ...d, notes: e.target.value }))}\n style={{ ...inputStyle, minHeight: 100, resize: 'vertical' }}\n placeholder=\"Gibt es etwas, das wir vorab wissen sollten?\"\n />\n </div>\n\n {/* Submit button */}\n <button\n type=\"submit\"\n disabled={isLoading || (showLocationSelector && !selectedLocation)}\n style={{\n marginTop: 8,\n padding: '18px 32px',\n border: 'none',\n borderRadius: 'var(--booking-radius)',\n background: 'var(--booking-accent)',\n color: '#000',\n fontSize: 16,\n fontWeight: 700,\n cursor: isLoading || (showLocationSelector && !selectedLocation) ? 'not-allowed' : 'pointer',\n fontFamily: 'inherit',\n transition: 'var(--booking-transition)',\n opacity: isLoading || (showLocationSelector && !selectedLocation) ? 0.5 : 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n boxShadow: isLoading || (showLocationSelector && !selectedLocation) ? 'none' : '0 4px 14px var(--booking-accent-glow)'\n }}\n >\n {isLoading ? (\n <>\n <Spinner /> Wird gebucht...\n </>\n ) : (\n <>Termin verbindlich buchen</>\n )}\n </button>\n </form>\n </div>\n </div>\n )\n}\n\n// ============================================\n// CONFIRMATION\n// ============================================\n\ntype ConfirmationProps = {\n slot: EnrichedTimeSlot\n onDownloadCalendar: () => void\n onReset: () => void\n}\n\nfunction Confirmation({ slot, onDownloadCalendar, onReset }: ConfirmationProps) {\n const formatDateLong = (dateStr: string) => {\n return new Date(dateStr).toLocaleDateString('de-DE', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric'\n })\n }\n\n return (\n <div style={{ textAlign: 'center', padding: '48px 24px' }}>\n <div\n style={{\n width: 72,\n height: 72,\n borderRadius: '50%',\n background: 'var(--booking-accent-muted)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 24px',\n fontSize: 32,\n border: '2px solid var(--booking-accent)'\n }}\n >\n ✓\n </div>\n\n <h2\n style={{\n fontSize: 24,\n fontWeight: 700,\n color: 'var(--booking-text)',\n margin: '0 0 12px 0'\n }}\n >\n Termin gebucht!\n </h2>\n\n <p\n style={{\n fontSize: 15,\n color: 'var(--booking-text-muted)',\n maxWidth: 400,\n margin: '0 auto 32px',\n lineHeight: 1.6\n }}\n >\n Ihr Termin <strong style={{ color: 'var(--booking-text)' }}>\"{slot.title}\"</strong> am{' '}\n <strong style={{ color: 'var(--booking-text)' }}>{formatDateLong(slot.start)}</strong> um{' '}\n <strong style={{ color: 'var(--booking-text)' }}>{slot.timeString} Uhr</strong> wurde erfolgreich gebucht.\n </p>\n\n <div style={{ display: 'flex', gap: 12, justifyContent: 'center', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={onDownloadCalendar}\n style={{\n padding: '12px 20px',\n border: 'none',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-accent)',\n color: '#000',\n fontSize: 14,\n fontWeight: 600,\n cursor: 'pointer',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n gap: 8\n }}\n >\n 📅 Zum Kalender hinzufügen\n </button>\n <button\n type=\"button\"\n onClick={onReset}\n style={{\n padding: '12px 20px',\n border: '1px solid var(--booking-border)',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'transparent',\n color: 'var(--booking-text)',\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n fontFamily: 'inherit'\n }}\n >\n Weiteren Termin buchen\n </button>\n </div>\n </div>\n )\n}\n\n// ============================================\n// MAIN BOOKING INTERFACE\n// ============================================\n\nfunction BookingInterface() {\n const {\n step,\n goToStep,\n therapist,\n slots,\n selectedDate,\n selectDate,\n selectedDateSlots,\n selectedSlot,\n selectSlot,\n selectedLocation,\n setLocation,\n booking,\n submitBooking,\n reset,\n isLoading,\n error\n } = useBookingFlow()\n\n const getStepNumber = () => {\n switch (step) {\n case 'date-selection':\n return 0\n case 'time-selection':\n return 1\n case 'booking-form':\n return 2\n case 'confirmation':\n return 3\n default:\n return 0\n }\n }\n\n const handleSlotSelect = async (slot: EnrichedTimeSlot) => {\n await selectSlot(slot)\n }\n\n const enrichedSelectedSlot: EnrichedTimeSlot | null = selectedSlot\n ? {\n ...selectedSlot,\n dateKey: new Date(selectedSlot.start).toISOString().split('T')[0],\n timeString: new Date(selectedSlot.start).toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }),\n durationMinutes: Math.round((new Date(selectedSlot.end).getTime() - new Date(selectedSlot.start).getTime()) / 60000),\n formattedPrice: new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(Number.parseFloat(selectedSlot.price)),\n isToday: false,\n isPast: false\n }\n : null\n\n return (\n <div\n style={{\n ...cssVariables,\n fontFamily: 'var(--booking-font)',\n background: 'var(--booking-bg)',\n color: 'var(--booking-text)',\n minHeight: '100vh',\n padding: '40px 24px'\n }}\n >\n <style>{globalStyles}</style>\n\n <div style={{ maxWidth: 880, margin: '0 auto' }}>\n {/* Header */}\n <header style={{ textAlign: 'center', marginBottom: 40 }}>\n <h1\n style={{\n fontSize: 28,\n fontWeight: 700,\n margin: '0 0 8px 0',\n color: 'var(--booking-text)'\n }}\n >\n Termin buchen{therapist.data ? ` bei ${therapist.data.name}` : ''}\n </h1>\n <p style={{ fontSize: 15, color: 'var(--booking-text-muted)', margin: 0 }}>Wählen Sie einen passenden Termin für Ihr Anliegen</p>\n </header>\n\n {/* Step indicator */}\n {step !== 'loading' && step !== 'error' && step !== 'confirmation' && <StepIndicator current={getStepNumber()} total={3} />}\n\n {/* Main card */}\n <div\n style={{\n background: 'var(--booking-surface)',\n borderRadius: 'var(--booking-radius-lg)',\n border: '1px solid var(--booking-border)',\n boxShadow: 'var(--booking-shadow)',\n overflow: 'hidden',\n animation: 'fadeIn 0.3s ease'\n }}\n >\n <div style={{ padding: 28 }}>\n {step === 'loading' && <LoadingState />}\n\n {step === 'error' && (\n <div style={{ textAlign: 'center', padding: 40 }}>\n <div\n style={{\n background: 'var(--booking-error-bg)',\n border: '1px solid var(--booking-error)',\n borderRadius: 'var(--booking-radius)',\n padding: 16,\n marginBottom: 20,\n color: 'var(--booking-error)'\n }}\n >\n {error?.message ?? 'Ein Fehler ist aufgetreten'}\n </div>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n padding: '12px 24px',\n border: 'none',\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-accent)',\n color: '#000',\n fontSize: 14,\n fontWeight: 600,\n cursor: 'pointer',\n fontFamily: 'inherit'\n }}\n >\n Erneut versuchen\n </button>\n </div>\n )}\n\n {step === 'date-selection' && (\n <div>\n <h3\n style={{\n fontSize: 18,\n fontWeight: 600,\n color: 'var(--booking-text)',\n margin: '0 0 20px 0',\n display: 'flex',\n alignItems: 'center',\n gap: 12\n }}\n >\n <span\n style={{\n width: 40,\n height: 40,\n borderRadius: 'var(--booking-radius-sm)',\n background: 'var(--booking-accent-muted)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 18\n }}\n >\n 📅\n </span>\n Datum wählen\n </h3>\n <Calendar availableDates={slots.availableDates} selectedDate={selectedDate} onSelectDate={selectDate} />\n </div>\n )}\n\n {step === 'time-selection' && selectedDate && (\n <TimeSlotPicker\n slots={selectedDateSlots}\n selectedSlot={\n selectedSlot\n ? {\n ...selectedSlot,\n dateKey: '',\n timeString: '',\n durationMinutes: 0,\n formattedPrice: '',\n isToday: false,\n isPast: false\n }\n : null\n }\n onSelectSlot={handleSlotSelect}\n selectedDate={selectedDate}\n onBack={() => goToStep('date-selection')}\n />\n )}\n\n {step === 'booking-form' && enrichedSelectedSlot && (\n <BookingForm\n slot={enrichedSelectedSlot}\n showLocationSelector={enrichedSelectedSlot.location === 'not-fixed'}\n selectedLocation={selectedLocation}\n onLocationChange={setLocation}\n onSubmit={submitBooking}\n onBack={() => goToStep('time-selection')}\n isLoading={isLoading}\n error={error}\n />\n )}\n\n {step === 'confirmation' && enrichedSelectedSlot && (\n <Confirmation slot={enrichedSelectedSlot} onDownloadCalendar={booking.downloadCalendar} onReset={reset} />\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================\n// EXPORT\n// ============================================\n\ntype CustomBookingExampleProps = {\n therapistUUID: string\n categories?: number[]\n}\n\n/**\n * CustomBookingExample - A modern, fully-featured booking interface\n *\n * This example demonstrates how to use the Tebuto hooks to build\n * a completely custom booking experience.\n *\n * @example\n * ```tsx\n * import { CustomBookingExample } from '@tebuto/react-booking-widget'\n *\n * function BookingPage() {\n * return <CustomBookingExample therapistUUID=\"your-uuid\" />\n * }\n * ```\n */\nexport function CustomBookingExample({ therapistUUID, categories }: CustomBookingExampleProps) {\n return (\n <TebutoProvider therapistUUID={therapistUUID} categories={categories}>\n <BookingInterface />\n </TebutoProvider>\n )\n}\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","SuppressedError","TebutoBookingWidget","_a","_b","noScriptText","config","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__rest","_jsxs","id","children","_jsx","TebutoBookingWidgetScript","dataAttributes","attributes","therapistUUID","backgroundColor","theme","categories","join","undefined","border","includeSubusers","showQuickFilters","inheritFont","_c","_d","primaryColor","textPrimary","textSecondary","borderColor","fontFamily","addThemeAttributes","buildDataAttributes","src","TebutoContext","createContext","TebutoProvider","apiBaseUrl","useMemo","buildUrl","path","concat","Provider","useTebutoContext","context","useContext","Error","useTherapist","_this","useState","data","isLoading","error","state","setState","fetchTherapist","useCallback","prev","fetch","response","ok","statusText","json","err_1","useEffect","refetch","formatDate","date","year","getFullYear","month","String","getMonth","padStart","day","getDate","enrichSlot","slot","startDate","Date","start","endDate","end","now","today","slotDay","durationMinutes","Math","round","getTime","dateKey","timeString","toLocaleTimeString","hour","minute","formattedPrice","Intl","NumberFormat","style","currency","format","Number","parseFloat","price","isToday","isPast","useAvailableSlots","options","autoFetch","filterCategories","_e","contextCategories","_f","categoriesToFilter","categoriesKey","fetchSlots","url","URL","searchParams","set","toString","slotsByDate","grouped","_i","sort","a","b","availableDates","keys","map","dateStr","getSlotsForDate","categoryMap","Map","has","eventCategoryId","name","title","color","Array","from","values","totalSlots","useClaimSlot","claimedSlot","claimResponse","claimKeyRef","useRef","unclaim","current","method","headers","JSON","stringify","eventRuleId","claim","newKey","isAvailable","error_1","isClaimed","clearError","useBookAppointment","booking","isSuccess","book","params","client","locationSelection","location","reset","downloadCalendar","ics","blob","Blob","type","window","createObjectURL","link","document","createElement","href","setAttribute","appendChild","click","removeChild","revokeObjectURL","useBookingFlow","onBookingComplete","onError","setStep","selectedDate","setSelectedDate","selectedSlot","setSelectedSlot","_g","selectedLocation","setSelectedLocation","therapist","slots","selectedDateSlots","selectDate","selectSlot","submitBooking","goToStep","newStep","setLocation","cssVariables","Spinner","width","height","borderTopColor","borderRadius","animation","LoadingState","display","flexDirection","alignItems","justifyContent","padding","gap","fontSize","StepIndicator","total","marginBottom","background","transition","boxShadow","Calendar","onSelectDate","viewDate","setViewDate","availableDateSet","Set","d","toDateString","firstDay","daysInMonth","firstDayOfWeek","getDay","weeks","currentWeek","isDateAvailable","canGoPrev","onClick","disabled","cursor","opacity","fontWeight","gridTemplateColumns","textAlign","textTransform","letterSpacing","week","weekIndex","dayIndex","aspectRatio","minHeight","available","selected","isDateSelected","todayMark","handleDateClick","position","bottom","marginTop","paddingTop","borderTop","TimeSlotPicker","onSelectSlot","onBack","getLocationIcon","getLocationLabel","slotsByCategory","reduce","acc","key","margin","toLocaleDateString","weekday","entries","category","categorySlots","isSelected","fontVariantNumeric","whiteSpace","flexShrink","BookingForm","showLocationSelector","onLocationChange","onSubmit","firstName","lastName","email","phone","notes","formData","setFormData","inputStyle","outline","boxSizing","labelStyle","overflow","top","left","flexWrap","loc","paddingBottom","borderBottom","message","preventDefault","htmlFor","required","onChange","target","placeholder","resize","_Fragment","Confirmation","onDownloadCalendar","onReset","maxWidth","lineHeight","BookingInterface","enrichedSelectedSlot","toISOString","split","getStepNumber","CustomBookingExample"],"mappings":"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","x_google_ignoreList":[0]}
|