@restaround/react 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/utils/image.ts","../src/utils/constants.ts","../src/utils/url.ts","../src/store/index.tsx","../src/constants/analytics.ts","../src/utils/category.ts","../src/components/Image/Image.tsx","../src/components/PublicMenu/Header/Languages/Languages.tsx","../src/components/PublicMenu/Header/Header.tsx","../src/components/PublicMenu/Categories.tsx","../src/utils/common.ts","../src/models/addon.ts","../src/utils/addon.ts","../src/utils/product.ts","../src/models/product.ts","../src/models/pricing.ts","../src/utils/cart.ts","../src/store/cart.tsx","../src/constants/translations.ts","../src/hooks/translation.ts","../src/components/PublicMenu/ProductsListItem/ProductsListItem.tsx","../src/components/PublicMenu/ProductsGridItem/ProductsGridItem.tsx","../src/hooks/cart.ts","../src/components/Quantity/Quantity.tsx","../src/components/PublicMenu/ProductInCart/ProductInCart.tsx","../src/components/PublicMenu/ProductVariants/ProductVariants.tsx","../src/components/PublicMenu/ProductAddons/ProductAddons.tsx","../src/components/PublicMenu/ProductDetails/ProductDetails.tsx","../src/components/PublicMenu/CartStepper/CartStepper.tsx","../src/components/PublicMenu/Cart/Cart.tsx","../src/hooks/product.ts","../src/components/PublicMenu/ProductQuantity/ProductQuantity.tsx","../src/components/PublicMenu/CartItem/OptionsInfo/OptionsInfo.tsx","../src/components/PublicMenu/CartItem/CartItem.tsx","../src/components/PublicMenu/CartDrawer/CartDrawer.tsx","../src/components/PublicMenu/Products/Products.tsx","../src/components/PublicMenu/Branches/Branches.tsx","../src/components/PublicMenu/PublicMenu.tsx","../src/utils/menu.ts","../src/components/Events/EventsToolbar.tsx","../src/components/Events/Events.tsx","../src/constants/pricing.ts","../src/components/Pricing/PricingPlanAmount.tsx","../src/components/Pricing/Pricing.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","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { createContext, ReactElement, useContext } from \"react\";\n\nimport { PublicMenuData } from \"src/models\";\n\nconst StoreContext = createContext<PublicMenuData>({} as PublicMenuData);\n\nconst DEFAULT_CURRENCY = \"AZN\";\nconst DEFAULT_LANGUAGE = \"az\";\n\nexport const StoreProvider = ({\n\tchildren,\n\tvalue,\n}: {\n\tchildren: ReactElement;\n\tvalue: PublicMenuData;\n}) => {\n\tconst storeValue = isEmpty(value) ? ({} as PublicMenuData) : value;\n\tif (!storeValue.currency) storeValue.currency = DEFAULT_CURRENCY;\n\tif (!storeValue.language) storeValue.language = DEFAULT_LANGUAGE;\n\n\treturn (\n\t\t<StoreContext.Provider value={isEmpty(value) ? ({} as PublicMenuData) : value}>\n\t\t\t{children}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport const useStoreContext = () => useContext(StoreContext);\n","const GOAL_BASE_NAME = \"digital_menu\";\n\nexport const CATEGORY_SELECTED = `${GOAL_BASE_NAME}_category_select`;\nexport const CATEGORY_SCROLLED = `${GOAL_BASE_NAME}_category_scroll`;\nexport const PRODUCT_DETAILS = `${GOAL_BASE_NAME}_product_details`;\nexport const PRODUCT_ADD_CART = `${GOAL_BASE_NAME}_product_add_cart`;\nexport const PRODUCT_VIEW_CHANGED = `${GOAL_BASE_NAME}_product_view_changed`;\n\nexport const GOALS = [CATEGORY_SELECTED, CATEGORY_SCROLLED, PRODUCT_DETAILS, PRODUCT_ADD_CART];\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","import { useStoreContext } from \"src/store\";\nimport { rgbDataURL } from \"src/utils/image\";\n\ninterface Props\n\textends React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement> {\n\tplaceholder?: \"blur\" | \"empty\" | `data:image/${string}`;\n\tblurDataURL?: string;\n\tpriority?: boolean;\n\tquality?: number | `${number}`;\n}\n\nconst Image = (props: Props) => {\n\tconst {\n\t\tpriority: _,\n\t\tblurDataURL: __,\n\t\tquality: ___,\n\t\tplaceholder: ____,\n\t\tfetchPriority: _____,\n\t\t...imgProps\n\t} = props;\n\tconst { imageTag } = useStoreContext() || {};\n\n\tif (imageTag) {\n\t\tconst CustomImage: any = imageTag;\n\n\t\treturn (\n\t\t\t<CustomImage\n\t\t\t\t{...props}\n\t\t\t\tquality={props.quality || 100}\n\t\t\t\tplaceholder=\"blur\"\n\t\t\t\tblurDataURL={rgbDataURL(235, 59, 90)}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn <img {...imgProps} />;\n};\n\nexport default Image;\n","import { useState } from \"react\";\nimport { classNames, Row } from \"@sorocraft/ui\";\n\nimport styles from \"./Languages.module.scss\";\n\nimport { useStoreContext } from \"src/store\";\n\nconst Languages = () => {\n\tconst { language, languages, onLanguageSelect } = useStoreContext();\n\tconst [isOptionsOpen, setIsOptionsOpen] = useState(false);\n\n\tconst isBilingual = languages?.length > 1;\n\tconst otherLanguages = languages?.filter?.(({ code }) => code !== language) || [];\n\n\tconst getFlag = (code: string) => {\n\t\treturn `https://images.restaround.co/languages/${code}.svg`;\n\t};\n\n\tconst handleSelectLanguages = (code: string) => {\n\t\tif (onLanguageSelect) onLanguageSelect(code);\n\t};\n\n\tif (!isBilingual) return null;\n\n\treturn (\n\t\t<div className={styles.container} onClick={() => setIsOptionsOpen(!isOptionsOpen)}>\n\t\t\t<Row alignItems=\"center\" gap={0}>\n\t\t\t\t<Row\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\toptions: true,\n\t\t\t\t\t\tisOpen: isOptionsOpen,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t{otherLanguages.map(({ code }) => (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={getFlag(code)}\n\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\tkey={code}\n\t\t\t\t\t\t\tonClick={() => handleSelectLanguages(code)}\n\t\t\t\t\t\t\talt={code}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</Row>\n\t\t\t\t<img src={getFlag(language)} alt={language || \"\"} className={styles.currentLanguage} />\n\t\t\t</Row>\n\t\t</div>\n\t);\n};\nexport default Languages;\n","import { Column, Flex, IconLink, Row, SVGIcon, Tooltip } from \"@sorocraft/ui\";\nimport {\n\tMarkerPin,\n\tPhone,\n\tWifi,\n\tInstagram,\n\tWhatsapp,\n\tTiktok,\n\tFacebook,\n\tTelegram,\n} from \"@sorocraft/ui/icons\";\nimport { isEmpty } from \"@sorocraft/js-utils\";\n\nimport styles from \"./Header.module.scss\";\n\nimport * as branchModels from \"src/models/branch\";\nimport * as menuModels from \"src/models/menu\";\n\nimport Image from \"src/components/Image\";\n\nimport Languages from \"./Languages\";\n\ninterface Props\n\textends Pick<\n\t\tmenuModels.PublicMenuData,\n\t\t| \"coverImage\"\n\t\t| \"logoImage\"\n\t\t| \"name\"\n\t\t| \"instagram\"\n\t\t| \"facebook\"\n\t\t| \"whatsapp\"\n\t\t| \"telegram\"\n\t\t| \"tiktok\"\n\t> {\n\tbranch?: branchModels.Branch;\n}\n\nconst Header = ({\n\tbranch,\n\tcoverImage,\n\tlogoImage,\n\tname,\n\tinstagram,\n\tfacebook,\n\twhatsapp,\n\ttelegram,\n\ttiktok,\n}: Props) => {\n\tconst { address, latitude, longitude, phone, wifiPassword } = branch || {};\n\tconst noBranch = isEmpty(branch);\n\n\tconst googleMapLink = `https://www.google.com/maps/place/${latitude},${longitude}`;\n\n\tconst BranchInfo = () => (\n\t\t<Flex direction=\"row\" gap={1} alignItems=\"center\" fullWidth>\n\t\t\t<Flex.Item>\n\t\t\t\t<Image src={logoImage} alt={name} className={styles.logo} width={96} height={96} />\n\t\t\t</Flex.Item>\n\t\t\t<Flex.Item shrink className={styles.info}>\n\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t<h1 className={styles.name}>{name}</h1>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclassName={styles.address}\n\t\t\t\t\t\thref={googleMapLink}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Row alignItems=\"center\" gap={0.5}>\n\t\t\t\t\t\t\t<SVGIcon icon={MarkerPin} theme=\"dark\" />\n\t\t\t\t\t\t\t<span className={styles.addressText}>{address}</span>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</a>\n\t\t\t\t</Column>\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n\n\tconst BusinessInfo = () => (\n\t\t<Column fullWidth fullHeight alignItems=\"center\" justifyContent=\"center\">\n\t\t\t<Image src={logoImage} alt={name} className={styles.logo} width={96} height={96} />\n\t\t\t<div className={styles.info}>\n\t\t\t\t<h1 className={styles.name}>{name}</h1>\n\t\t\t</div>\n\t\t</Column>\n\t);\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<Image\n\t\t\t\tsrc={coverImage}\n\t\t\t\talt={name}\n\t\t\t\tclassName={styles.cover}\n\t\t\t\twidth={1024}\n\t\t\t\theight={400}\n\t\t\t\tpriority\n\t\t\t\tsizes=\"100vw\"\n\t\t\t\tfetchPriority=\"high\"\n\t\t\t\tloading=\"eager\"\n\t\t\t/>\n\t\t\t<div className={styles.content}>{noBranch ? <BusinessInfo /> : <BranchInfo />}</div>\n\t\t\t<Languages />\n\t\t\t{!noBranch && (\n\t\t\t\t<div className={styles.social}>\n\t\t\t\t\t<div className={styles.links}>\n\t\t\t\t\t\t<Row gap={2} alignItems=\"center\">\n\t\t\t\t\t\t\t<Row alignItems=\"center\" justifyContent=\"center\" gap={0.5}>\n\t\t\t\t\t\t\t\t{!!phone && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Phone}\n\t\t\t\t\t\t\t\t\t\thref={`tel:+${phone}`}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!whatsapp && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Whatsapp}\n\t\t\t\t\t\t\t\t\t\thref={`https://wa.me/${whatsapp}`}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!instagram && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Instagram}\n\t\t\t\t\t\t\t\t\t\thref={instagram}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!telegram && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Telegram}\n\t\t\t\t\t\t\t\t\t\thref={telegram}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!tiktok && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Tiktok}\n\t\t\t\t\t\t\t\t\t\thref={tiktok}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!facebook && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Facebook}\n\t\t\t\t\t\t\t\t\t\thref={facebook}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!wifiPassword && (\n\t\t\t\t\t\t\t\t\t<Tooltip hint={wifiPassword}>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.wifiPassword}>\n\t\t\t\t\t\t\t\t\t\t\t<SVGIcon icon={Wifi} size=\"sm\" className={styles.wifiPasswordIcon} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\nexport default Header;\n","import { Carousel, CarouselItem, Chip, DivElementMap, UIElementType } from \"@sorocraft/ui\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { trackEvent } from \"@sorocraft/js-utils\";\n\nimport styles from \"./PublicMenu.module.scss\";\n\nimport * as menuModels from \"src/models/menu\";\nimport * as analyticsConstants from \"src/constants/analytics\";\n\ninterface Props {\n\tcategoryProductMap: menuModels.CategoryProductMap[];\n\tlanguage: string;\n\tselectedCategoryId: number;\n\tonSelectCategory: (id: number) => void;\n}\n\nconst Categories = ({\n\tcategoryProductMap = [],\n\tlanguage,\n\tselectedCategoryId,\n\tonSelectCategory,\n}: Props) => {\n\tconst categoryBlocksRef = useRef<DivElementMap>({});\n\tconst carouselRef = useRef<HTMLDivElement>(null);\n\n\tconst scrollToCategoryBlock = () => {\n\t\tconst categoryBlock = categoryBlocksRef?.current?.[selectedCategoryId];\n\t\tif (!categoryBlock || !carouselRef.current) return;\n\n\t\tconst carouselWidth = carouselRef.current.clientWidth;\n\t\tconst categoryLeft = categoryBlock.offsetLeft;\n\t\tconst categoryWidth = categoryBlock.offsetWidth;\n\n\t\tconst scrollLeft = categoryLeft - carouselWidth / 2 + categoryWidth / 2;\n\t\tcarouselRef.current.scrollTo({ left: scrollLeft, behavior: \"smooth\" });\n\t};\n\n\tconst handleSelectCategory = (id: number, name?: string) => {\n\t\tif (id === selectedCategoryId) return;\n\n\t\ttrackEvent(analyticsConstants.CATEGORY_SELECTED, { name });\n\t\tonSelectCategory(id);\n\t};\n\n\tconst handleGetCarouselRef = (ref: RefObject<HTMLDivElement>) => {\n\t\tif (!ref?.current) return;\n\t\tcarouselRef.current = ref.current;\n\t};\n\n\tuseEffect(() => {\n\t\tif (selectedCategoryId) scrollToCategoryBlock();\n\t}, [selectedCategoryId]);\n\n\treturn (\n\t\t<div className={styles.categories}>\n\t\t\t<Carousel gap={1} onGetRef={handleGetCarouselRef}>\n\t\t\t\t{(categoryProductMap || []).map(({ id, translations }) => {\n\t\t\t\t\tconst { name } = translations.find((item) => item.language === language) || {};\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CarouselItem key={id}>\n\t\t\t\t\t\t\t<Chip\n\t\t\t\t\t\t\t\tonClick={() => handleSelectCategory(id, name)}\n\t\t\t\t\t\t\t\ttype={UIElementType.BORDERED_PRIMARY}\n\t\t\t\t\t\t\t\tactive={id === selectedCategoryId}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) categoryBlocksRef.current[id] = el;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t</CarouselItem>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Carousel>\n\t\t</div>\n\t);\n};\nexport default Categories;\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"src/models/addon\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon.translations.find((t) => t.language === language)?.title || \"\";\n};\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\nimport { MenuAddon, MenuAddonSelectType, SelectedAddons } from \"src/models/addon\";\n\nimport { getAddonOptionRawPrice } from \"./addon\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductCartRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { MenuAddon } from \"./addon\";\n\nexport interface ProductTranslation {\n\tid: number;\n\tname: string;\n\tdescription?: string;\n\tlanguage: string;\n\tproductId: number;\n}\n\nexport interface ProductVariantTranslations {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\tprice: number;\n\ttranslations: ProductVariantTranslations[];\n\tproductId?: number;\n\tremove?: boolean;\n}\n\nexport interface Product {\n\tid: number;\n\tcategoryId: number;\n\tvat?: number;\n\tprice: number;\n\tvolume?: string; // 100qr/250ml/1kq\n\timage160?: string;\n\timage580?: string;\n\timage1024?: string;\n\ttranslations: ProductTranslation[];\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n}\n\nexport enum ProductView {\n\tLIST = \"list\",\n\tGRID = \"grid\",\n}\n","export enum PlanType {\n\tAPPETIZER = \"appetizer\",\n\tMAIN_COURSE = \"mainCourse\",\n\tCHEFS_SPECIAL = \"chefsSpecial\",\n}\n\nexport interface PricingPlan {\n\ttitle: string;\n\tprice: {\n\t\tmonthly: number;\n\t\tannually: number;\n\t};\n\tdiscountedPrice?: number;\n}\n\nexport interface PricingPlans {\n\t[key: string]: PricingPlan;\n}\n\nexport type PricingInterval = \"monthly\" | \"annually\";\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getCartPrice = (item: CartItem, currency: string = \"USD\", language: string = \"en\") => {\n\tconst { price, vat, quantity, optionsPrice } = item || {};\n\tconst productPrice = calculateTotalPrice(price, quantity, vat);\n\tconst totalPrice = productPrice + optionsPrice * quantity;\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const generateCartId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the cart ID base with productId and variantId\n\tlet cartId = `${productId}`;\n\tif (variantId) {\n\t\tcartId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\tcartId += `-${addonIdsPart}`;\n\t}\n\n\treturn cartId;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { createContext, ReactNode, useContext, useMemo, useState } from \"react\";\n\nimport { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { Cart } from \"src/models/order\";\nimport { getProductCartRawPrice } from \"src/utils/product\";\nimport { generateCartId } from \"src/utils/cart\";\n\ntype UpdateCartProductParams = {\n\tproduct: Product;\n\tquantity?: number;\n\tvariantId?: number;\n\tselectedAddons?: SelectedAddons;\n};\n\ntype CartContent = {\n\tcart: Cart;\n\tisCartOpen: boolean;\n\taddProduct: (params: UpdateCartProductParams) => void;\n\tupdateProduct: (params: UpdateCartProductParams) => void;\n\tremoveAllProductVariants: (productId: number) => void;\n\tsetIsCartOpen: (state: boolean) => void;\n};\n\nconst CartContext = createContext<CartContent>({\n\tcart: {},\n\tisCartOpen: false,\n\taddProduct: () => {},\n\tupdateProduct: () => {},\n\tsetIsCartOpen: () => {},\n\tremoveAllProductVariants: () => {},\n} as CartContent);\n\nexport const CartProvider = ({ children }: { children: ReactNode }) => {\n\tconst [cart, setCart] = useState<Cart>({});\n\tconst [isCartOpen, setIsCartOpen] = useState<boolean>(false);\n\n\tconst updateCart = ({\n\t\tproduct,\n\t\tquantity,\n\t\tisAddOperation,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams & { isAddOperation: boolean }) => {\n\t\tif (isEmpty(product) || quantity < 0) return;\n\n\t\tconst { id, vat = 0 } = product;\n\t\tconst cartId = generateCartId(id, variantId, selectedAddons);\n\t\tconst { price, optionsPrice } = getProductCartRawPrice({\n\t\t\tproduct,\n\t\t\tvariantId,\n\t\t\tquantity: 1, // to save we just need price per quantity,\n\t\t\tselectedAddons,\n\t\t\tnoVat: true, // we will calculate vat later\n\t\t});\n\n\t\tsetCart((currentCart) => {\n\t\t\tconst existingItem = currentCart[cartId];\n\t\t\tconst newQuantity = isAddOperation ? (existingItem?.quantity || 0) + quantity : quantity;\n\n\t\t\t// Remove item if quantity is zero\n\t\t\tif (newQuantity <= 0) {\n\t\t\t\tconst { [cartId]: _, ...remainingCart } = currentCart;\n\t\t\t\treturn remainingCart;\n\t\t\t}\n\n\t\t\t// Update or add item\n\t\t\treturn {\n\t\t\t\t...currentCart,\n\t\t\t\t[cartId]: {\n\t\t\t\t\tproductId: id,\n\t\t\t\t\tprice,\n\t\t\t\t\toptionsPrice,\n\t\t\t\t\tquantity: newQuantity,\n\t\t\t\t\tvat,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tselectedAddons,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t};\n\n\tconst addProduct = ({\n\t\tproduct,\n\t\tquantity = 1,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams) => {\n\t\treturn updateCart({ product, quantity, variantId, selectedAddons, isAddOperation: true });\n\t};\n\n\tconst updateProduct = ({\n\t\tproduct,\n\t\tquantity = 1,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams) => {\n\t\treturn updateCart({ product, quantity, variantId, selectedAddons, isAddOperation: false });\n\t};\n\n\tconst removeAllProductVariants = (productId: number) => {\n\t\tif (!productId || isEmpty(cart)) return;\n\n\t\t// Filter out cart items that do not belong to the given productId\n\t\tconst updatedCart = Object.entries(cart).reduce((acc, [cartId, cartItem]) => {\n\t\t\tif (cartItem.productId !== productId) {\n\t\t\t\tacc[cartId] = cartItem;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} as typeof cart);\n\n\t\t// Update the cart with the remaining items\n\t\tsetCart(updatedCart);\n\t};\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tcart,\n\t\t\tisCartOpen,\n\t\t\taddProduct,\n\t\t\tupdateProduct,\n\t\t\tsetIsCartOpen,\n\t\t\tremoveAllProductVariants,\n\t\t}),\n\t\t[cart, isCartOpen]\n\t);\n\n\treturn <CartContext.Provider value={contextValue}>{children}</CartContext.Provider>;\n};\n\nexport const useCartContext = () => useContext(CartContext);\n","export const translations = {\n\t[\"en\"]: {},\n\t[\"az\"]: {\n\t\t\"View order\": \"Şifarişi göstər\",\n\t\t\"Remove from order\": \"Sifarişdən sil\",\n\t\t\"Update order\": \"Sifarişi yenilə\",\n\t\t\"Add to order\": \"Sifarişə əlavə et\",\n\t\t\"Your order\": \"Sifarişiniz\",\n\t\tSubtotal: \"Ümumi\",\n\t\t\"Empty order\": \"Boş sifariş\",\n\t\t\"You don't have any items in your order\": \"Sifarişinizdə heç bir məhsul yoxdur\",\n\t\t\"Add items\": \"Məhsul əlavə et\",\n\t\tEvents: \"Hərəkətlər\",\n\t\t\"Scrolled to Category\": \"Kateqoriyaya sürüşdürdü\",\n\t\t\"Category Selected\": \"Kateqoriya seçildi\",\n\t\t\"Product Details\": \"Məhsul detalına baxıldı\",\n\t\t\"Product Added to Cart\": \"Səbətə əlavə edildi\",\n\t\t\"Product choices\": \"Seçimlər\",\n\t\t\"In order\": \"Sifarişdə\",\n\t\t\"Not available\": \"Mövcud deyil\",\n\t\t// PRICING\n\t\t\"Get Started\": \"İndi başla\",\n\t\t\"Choose Plan\": \"Planı seçin\",\n\t\t\"Smart QR Menu\": \"Ağıllı QR Menyu\",\n\t\t\"Link-in-bio\": \"Bio üçün link\",\n\t\t\"Menu Analytics\": \"Menyu analitikası\",\n\t\t\"Unlimited Products\": \"Limitsiz məhsul\",\n\t\t\"Unlimited Categories\": \"Limitsiz kateqoriya\",\n\t\t\"Product variants\": \"Məhsul variantları\",\n\t\t\"Product options\": \"Məhsul əlavələri\",\n\t\t\"Sales reports\": \"Satış hesabatı\",\n\t\t\"24/7 Support\": \"24/7 dəstək\",\n\t\t\"Multiple Branches\": \"Şöbələr\",\n\t\t\"Order Management\": \"Sifarişlərin idarə edilməsi\",\n\t\t\"Table Management\": \"Masaların idarə edilməsi\",\n\t\t\"Mobile App for Owners & Staff\": \"Rəhbərlik və ofisiantlar üçün Mobil tətbiq\",\n\t\t\"Point of Sale (POS)\": \"POS-kassa\",\n\t\t\"Delivery Management\": \"Çatdırılmaların idarə edilməsi\",\n\t\t\"Third-Party Delivery Integrations\": \"Çatdırılma partnyorlarının inteqrasiyası\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay ilə ödəniş\",\n\t\t\"Event management\": \"Tədbirlərin idarəsi\",\n\t\t\"Unlimited Users\": \"Limitsiz istifadəçi\",\n\t\t\"/ month\": \"/ Ay\",\n\t\tmonthly: \"Aylıq plan\",\n\t\tannually: \"İllik plan\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Hər biznesə uyğun tariflər - Sadə qiymətlər, daha çox dəyər!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Biznesinizə uyğun tarif planını seçin. Aylıq və ya illik abunə olun, uzunmüddətli planlarla daha çox qazanın!\",\n\t},\n\t[\"tr\"]: {\n\t\t\"View order\": \"Siparişi Görüntüle\",\n\t\t\"Remove from order\": \"Siparişten Kaldır\",\n\t\t\"Update order\": \"Siparişi Güncelle\",\n\t\t\"Add to order\": \"Siparişe Ekle\",\n\t\t\"Your order\": \"Siparişiniz\",\n\t\t\"Empty order\": \"Boş sipariş\",\n\t\t\"You don't have any items in your order\": \"Siparişinizde hiç bir ürün yok\",\n\t\t\"Add items\": \"Ürün ekle\",\n\t\tSubtotal: \"Toplam\",\n\t\tEvents: \"Olaylar\",\n\t\t\"Product choices\": \"Seçenekler\",\n\t\t\"In order\": \"Siparişte\",\n\t\t\"Not available\": \"Mevcut değil\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Hemen Başla\",\n\t\t\"Choose Plan\": \"Planı seçin\",\n\t\t\"Smart QR Menu\": \"Akıllı QR Menü\",\n\t\t\"Link-in-bio\": \"Bio için link\",\n\t\t\"Menu Analytics\": \"Menü Analitiği\",\n\t\t\"Unlimited Users\": \"Sınırsız kullanıcı\",\n\t\t\"Unlimited Products\": \"Sınırsız ürün\",\n\t\t\"Unlimited Categories\": \"Sınırsız kategori\",\n\t\t\"Product variants\": \"Ürün çeşitleri\",\n\t\t\"Product options\": \"Ürün seçenekleri\",\n\t\t\"Sales reports\": \"Satış raporu\",\n\t\t\"24/7 Support\": \"24/7 Teknik Destek\",\n\t\t\"Multiple Branches\": \"Şube Yönetimi\",\n\t\t\"Table Management\": \"Masa Yönetimi\",\n\t\t\"Order Management\": \"Sipariş Yönetimi\",\n\t\t\"Mobile App for Owners & Staff\": \"Patron ve Personel için Mobil Uygulama\",\n\t\t\"Point of Sale (POS)\": \"POS Adisyon Sistemi\",\n\t\t\"Delivery Management\": \"Paket sipariş yönetimi\",\n\t\t\"Third-Party Delivery Integrations\": \"Üçüncü Parti Teslimat Entegrasyonları\",\n\t\t\"RestaroundPay with Mobile\": \"Mobil ile RestaroundPay\",\n\t\t\"Event management\": \"Etkinlik yönetimi\",\n\t\t\"/ month\": \"/ Ay\",\n\t\tmonthly: \"Aylık\",\n\t\tannually: \"Yıllık\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"İşletmenize uygun abonelik planını seçin. Aylık veya yıllık abone olun, uzun vadeli planlarla daha fazla tasarruf edin!\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Her işletmeye uygun esnek planlar - Basit fiyatlandırma, daha fazla avantaj!\",\n\t},\n\t[\"nl\"]: {\n\t\t\"View order\": \"Bestelling bekijken\",\n\t\t\"Remove from order\": \"Uit bestelling verwijderen\",\n\t\t\"Update order\": \"Bestelling bijwerken\",\n\t\t\"Add to order\": \"Aan bestelling toevoegen\",\n\t\t\"Your order\": \"Uw bestelling\",\n\t\t\"Empty order\": \"Lege bestelling\",\n\t\t\"You don't have any items in your order\": \"U heeft geen items in uw bestelling\",\n\t\t\"Add items\": \"Items toevoegen\",\n\t\tSubtotal: \"Totaal\",\n\t\tEvents: \"Gebeurtenissen\",\n\t\t\"Product choices\": \"Productkeuzes\",\n\t\t\"In order\": \"In bestelling\",\n\t\t\"Not available\": \"Niet beschikbaar\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Start nu\",\n\t\t\"Choose Plan\": \"Kies een plan\",\n\t\t\"Smart QR Menu\": \"Slimme QR-menu\",\n\t\t\"Link-in-bio\": \"Link-in-bio\",\n\t\t\"Menu Analytics\": \"Menu analyse\",\n\t\t\"Unlimited Products\": \"Onbeperkte producten\",\n\t\t\"Unlimited Categories\": \"Onbeperkte categorieën\",\n\t\t\"Unlimited Users\": \"Onbeperkte gebruikers\",\n\t\t\"Product variants\": \"Productvarianten\",\n\t\t\"Product options\": \"Productopties\",\n\t\t\"Sales reports\": \"Verkooprapporten\",\n\t\t\"24/7 Support\": \"24/7 ondersteuning\",\n\t\t\"Multiple Branches\": \"Meerdere vestigingen\",\n\t\t\"Table Management\": \"Tafelbeheer\",\n\t\t\"Order Management\": \"Orderbeheer\",\n\t\t\"Mobile App for Owners & Staff\": \"Mobiele app voor eigenaren en personeel\",\n\t\t\"Point of Sale (POS)\": \"Kassasysteem (POS)\",\n\t\t\"Delivery Management\": \"Leveringsbeheer\",\n\t\t\"Third-Party Delivery Integrations\": \"Integraties van derden\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay met mobiel\",\n\t\t\"Event management\": \"Beheer van evenementen\",\n\t\t\"/ month\": \"/ maand\",\n\t\tmonthly: \"Maandelijks\",\n\t\tannually: \"Jaarlijks\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Kies een abonnementsplan dat bij jouw bedrijf past. Abonneer je maandelijks of jaarlijks en bespaar meer met een lange termijn plan!\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Flexibele abonnementen voor elk bedrijf - Eenvoudige prijzen, meer waarde!\",\n\t},\n\t[\"et\"]: {\n\t\t\"View order\": \"Vaata tellimust\",\n\t\t\"Remove from order\": \"Eemalda tellimusest\",\n\t\t\"Update order\": \"Uuenda tellimust\",\n\t\t\"Add to order\": \"Lisa tellimusele\",\n\t\t\"Your order\": \"Teie tellimus\",\n\t\t\"Empty order\": \"Tühi tellimus\",\n\t\t\"You don't have any items in your order\": \"Teie tellimuses pole ühtegi eset\",\n\t\t\"Add items\": \"Lisa esemeid\",\n\t\tSubtotal: \"Kokku\",\n\t\tEvents: \"Sündmused\",\n\t\t\"Product choices\": \"Tootevalikud\",\n\t\t\"In order\": \"Tellimuses\",\n\t\t\"Not available\": \"Ei ole saadaval\",\n\t\t// PRiCING\n\t\t\"Get Started\": \"Alustage\",\n\t\t\"Choose Plan\": \"Vali plaan\",\n\t\t\"Smart QR Menu\": \"Nutikas QR-menüü\",\n\t\t\"Link-in-bio\": \"Link-in-bio\",\n\t\t\"Menu Analytics\": \"Menüü Analüütika\",\n\t\t\"Unlimited Products\": \"Piiramata tooted\",\n\t\t\"Unlimited Categories\": \"Piiramata kategooriad\",\n\t\t\"Product variants\": \"Tootevariandid\",\n\t\t\"Product options\": \"Toote valikud\",\n\t\t\"Sales reports\": \"Müügiaruanded\",\n\t\t\"24/7 Support\": \"24/7 tugi\",\n\t\t\"Multiple Branches\": \"Mitu filiaali\",\n\t\t\"Table Management\": \"Tabelite haldamine\",\n\t\t\"Order Management\": \"Tellimuste haldamine\",\n\t\t\"Mobile App for Owners & Staff\": \"Mobiilirakendus omanikele ja töötajatele\",\n\t\t\"Point of Sale (POS)\": \"Müügipunkt (POS)\",\n\t\t\"Delivery Management\": \"Tarnejuhtimine\",\n\t\t\"Third-Party Delivery Integrations\": \"Kolmanda osapoole tarneintegratsioonid\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay koos mobiiliga\",\n\t\t\"Event management\": \"Sündmuste haldamine\",\n\t\t\"Unlimited Users\": \"Piiramatu arv kasutajaid\",\n\t\t\"/ month\": \"/ kuus\",\n\t\tmonthly: \"Igakuine\",\n\t\tannually: \"Igal aastal\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Paindlikud plaanid igale ettevõttele - Lihtne hind, rohkem väärtust!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Vali tellimus, mis sobib sinu ettevõttele. Telli igakuiselt või kord aastas ning säästa rohkem pikaajaliste plaanidega!\",\n\t},\n\t[\"ru\"]: {\n\t\t\"View order\": \"Посмотреть заказ\",\n\t\t\"Remove from order\": \"Удалить из заказа\",\n\t\t\"Update order\": \"Обновить заказ\",\n\t\t\"Add to order\": \"Добавить в заказ\",\n\t\t\"Your order\": \"Ваш заказ\",\n\t\t\"Empty order\": \"Пустой заказ\",\n\t\t\"You don't have any items in your order\": \"В вашем заказе нет товаров\",\n\t\t\"Add items\": \"Добавить товары\",\n\t\tSubtotal: \"Итого\",\n\t\tEvents: \"События\",\n\t\t\"Product choices\": \"Варианты товара\",\n\t\t\"In order\": \"В заказе\",\n\t\t\"Not available\": \"Не доступен\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Начать\",\n\t\t\"Choose Plan\": \"Выберите план\",\n\t\t\"Smart QR Menu\": \"Умное меню по QR-коду\",\n\t\t\"Link-in-bio\": \"Ссылка в био\",\n\t\t\"Menu Analytics\": \"Аналитика меню\",\n\t\t\"Unlimited Users\": \"Неограниченные пользователи\",\n\t\t\"Unlimited Products\": \"Неограниченные продукты\",\n\t\t\"Unlimited Categories\": \"Неограниченные категории\",\n\t\t\"Product variants\": \"Варианты продуктов\",\n\t\t\"Product options\": \"Дополнения к продукту\",\n\t\t\"Sales reports\": \"Отчеты о продажах\",\n\t\t\"24/7 Support\": \"24/7 техническая поддержка\",\n\t\t\"Multiple Branches\": \"Многочисленные филиалы\",\n\t\t\"Table Management\": \"Управление столами\",\n\t\t\"Order Management\": \"Управление заказами\",\n\t\t\"Mobile App for Owners & Staff\": \"Мобильное приложение для владельцев и персонала\",\n\t\t\"Point of Sale (POS)\": \"POS-касса\",\n\t\t\"Delivery Management\": \"Управление доставкой\",\n\t\t\"Third-Party Delivery Integrations\": \"Интеграция со сторонними поставщиками\",\n\t\t\"RestaroundPay with Mobile\": \"«RestaroundPay» с мобильного\",\n\t\t\"Event management\": \"Управление мероприятиями\",\n\t\t\"/ month\": \"/ месяц\",\n\t\tmonthly: \"Ежемесячный план\",\n\t\tannually: \"Годовой план\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Тарифы для любого бизнеса - Простой прайс, больше возможностей!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Выберите тарифный план, который подходит вашему бизнесу. Подписывайтесь помесячно или ежегодно и экономьте больше с долгосрочными планами!\",\n\t},\n};\n","import { translations } from \"src/constants/translations\";\nimport { useStoreContext } from \"src/store\";\n\nexport const useTranslation = (lang?: string) => {\n\tconst { language } = useStoreContext();\n\tconst locale = lang || language;\n\n\tconst t = (key: string) => translations[locale]?.[key] || key;\n\n\treturn { t };\n};\n","import { Column, IconButton, Row, UIElementType, Text } from \"@sorocraft/ui\";\nimport { classNames, trackEvent } from \"@sorocraft/js-utils\";\nimport { Plus } from \"@sorocraft/ui/icons\";\nimport { MouseEvent, useMemo } from \"react\";\n\nimport styles from \"./ProductsListItem.module.scss\";\n\nimport * as productModels from \"src/models/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { useCartContext } from \"src/store/cart\";\nimport { getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport Image from \"src/components/Image\";\n\ninterface Props {\n\tproduct: productModels.Product;\n\tcurrency: string;\n\tlanguage: string;\n\tonClick?: () => void;\n}\n\nconst ProductsListItem = ({ product, currency, language, onClick }: Props) => {\n\tconst { addProduct } = useCartContext();\n\tconst { image160, volume, available } = product || {};\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\tconst { t } = useTranslation();\n\n\tconst hasVariant = product?.variants?.length > 0;\n\tconst hasAddons = product?.addons?.length > 0;\n\tconst hasImage = !!image160;\n\n\tconst handleAddToCart = (e: MouseEvent<HTMLElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif ((hasVariant || hasAddons) && onClick) return onClick();\n\n\t\taddProduct({ product });\n\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity: 1 });\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tisClickable: !!onClick,\n\t\t\t\tnoImage: !hasImage,\n\t\t\t})}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<Row justifyContent=\"space-between\" gap={0}>\n\t\t\t\t<div className={styles.info}>\n\t\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t\t<h3 className={styles.name}>{name}</h3>\n\t\t\t\t\t\t<p className={styles.description}>{description}</p>\n\t\t\t\t\t\t<Row className={styles.price} gap={0.5} fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t<span>{formattedTotalPrice}</span>\n\t\t\t\t\t\t\t{!!volume && <Text color=\"muted\">{volume}</Text>}\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t{!available && (\n\t\t\t\t\t\t\t<Text size=\"xs\" color=\"danger\" className={styles.notAvailableText}>\n\t\t\t\t\t\t\t\t{t(\"Not available\")}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Column>\n\t\t\t\t</div>\n\t\t\t\t{hasImage && (\n\t\t\t\t\t<Image\n\t\t\t\t\t\tsrc={getImageSource(image160)}\n\t\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\timage: true,\n\t\t\t\t\t\t\tnotAvailable: !available,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\twidth={160}\n\t\t\t\t\t\theight={90}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Row>\n\t\t\t{available && (\n\t\t\t\t<div className={styles.addToCart}>\n\t\t\t\t\t<IconButton onClick={handleAddToCart} icon={Plus} type={UIElementType.DEFAULT} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\nexport default ProductsListItem;\n","import { Column, IconButton, Row, UIElementType, Text } from \"@sorocraft/ui\";\nimport { classNames, trackEvent } from \"@sorocraft/js-utils\";\nimport { Plus } from \"@sorocraft/ui/icons\";\nimport { MouseEvent, useMemo } from \"react\";\n\nimport styles from \"./ProductsGridItem.module.scss\";\n\nimport * as productModels from \"src/models/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { useCartContext } from \"src/store/cart\";\nimport { getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport Image from \"src/components/Image\";\n\ninterface Props {\n\tproduct: productModels.Product;\n\tcurrency: string;\n\tlanguage: string;\n\tonClick?: () => void;\n}\n\nconst ProductsGridItem = ({ product, currency, language, onClick }: Props) => {\n\tconst { addProduct } = useCartContext();\n\tconst { volume, image580, image160, image1024, available } = product || {};\n\tconst image = image580 || image1024 || image160;\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\tconst { t } = useTranslation();\n\n\tconst hasVariant = product?.variants?.length > 0;\n\tconst hasAddons = product?.addons?.length > 0;\n\n\tconst handleAddToCart = (e: MouseEvent<HTMLElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif ((hasVariant || hasAddons) && onClick) return onClick();\n\n\t\taddProduct({ product });\n\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity: 1 });\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div\n\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\tcontent: true,\n\t\t\t\t\tisClickable: !!onClick,\n\t\t\t\t\tnoImage: !image,\n\t\t\t\t})}\n\t\t\t\tonClick={onClick}\n\t\t\t>\n\t\t\t\t{image && (\n\t\t\t\t\t<div className={styles.imageContainer}>\n\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\tsrc={getImageSource(image)}\n\t\t\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\t\timage: true,\n\t\t\t\t\t\t\t\tnotAvailable: !available,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\twidth={580}\n\t\t\t\t\t\t\theight={326}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div className={styles.info}>\n\t\t\t\t\t<div className={styles.data}>\n\t\t\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t\t\t<h3 className={styles.name}>{name}</h3>\n\t\t\t\t\t\t\t<p className={styles.description}>{description}</p>\n\n\t\t\t\t\t\t\t<Row className={styles.price} gap={0.5} fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t<span>{formattedTotalPrice}</span>\n\t\t\t\t\t\t\t\t{!!volume && (\n\t\t\t\t\t\t\t\t\t<Text color=\"white\" className={styles.volume}>\n\t\t\t\t\t\t\t\t\t\t{volume}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t{!available && (\n\t\t\t\t\t\t\t\t<Text color=\"white\" size=\"xs\" className={styles.notAvailableText}>\n\t\t\t\t\t\t\t\t\t{t(\"Not available\")}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{available && (\n\t\t\t\t\t<div className={styles.addToCart}>\n\t\t\t\t\t\t<IconButton onClick={handleAddToCart} icon={Plus} type={UIElementType.DEFAULT} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\nexport default ProductsGridItem;\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { CartItem } from \"src/models/order\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { generateCartId, getCartPrice } from \"src/utils/cart\";\n\nexport const useTotalCartItemsCount = () => {\n\tconst { cart } = useCartContext();\n\n\treturn Object.values(cart || {}).reduce((sum, item) => sum + item.quantity, 0);\n};\n\nexport const useCartTotalPrice = (): { totalPrice: number; formattedTotalPrice: string } => {\n\tconst { cart } = useCartContext();\n\tconst { currency, language } = useStoreContext();\n\n\tconst cartTotalPrice = Object.values(cart || {}).reduce((sum, item: CartItem) => {\n\t\tconst { totalPrice } = getCartPrice(item);\n\t\treturn sum + totalPrice;\n\t}, 0);\n\n\treturn {\n\t\ttotalPrice: cartTotalPrice,\n\t\tformattedTotalPrice: priceFormatter(cartTotalPrice, currency, language),\n\t};\n};\n\nexport const useProductQuantityInCart = ({\n\tproductId,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproductId: number;\n\tvariantId?: number | null;\n\tselectedAddons: SelectedAddons;\n}): number => {\n\tconst { cart } = useCartContext();\n\tif (isEmpty(cart) || !productId) return 0;\n\n\tconst cartId = generateCartId(productId, variantId, selectedAddons);\n\n\treturn cart[cartId]?.quantity || 0;\n};\n\nexport const useProductQuantityInCartWithAllVariants = (productId: number): number => {\n\tconst { cart } = useCartContext();\n\tif (isEmpty(cart) || !productId) return 0;\n\n\t// get all cart items with the same product id\n\tconst cartItems = Object.values(cart).filter((item) => item.productId === productId);\n\n\t// get the total quantity of all cart items with the same product id\n\tconst totalQuantity = cartItems.reduce((sum, item) => sum + item.quantity, 0);\n\n\treturn totalQuantity;\n};\n","import { Row, SIZE, SVGIcon } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\nimport { Minus, Plus } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./Quantity.module.scss\";\n\ninterface Props {\n\tisDecreaseDisabled?: boolean;\n\tquantity?: number;\n\tsize?: SIZE;\n\tonIncrease: () => void;\n\tonDecrease: () => void;\n}\n\nconst Quantity = ({\n\tisDecreaseDisabled = false,\n\tquantity = 1,\n\tsize = \"md\",\n\tonIncrease,\n\tonDecrease,\n}: Props) => {\n\treturn (\n\t\t<Row\n\t\t\tclassName={classNames(\n\t\t\t\tstyles,\n\t\t\t\t{\n\t\t\t\t\tcontainer: true,\n\t\t\t\t},\n\t\t\t\t[styles[size]]\n\t\t\t)}\n\t\t\tjustifyContent=\"space-between\"\n\t\t\tgap={0}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\tquantityAction: true,\n\t\t\t\t\tisDisabled: isDecreaseDisabled,\n\t\t\t\t})}\n\t\t\t\tonClick={onDecrease}\n\t\t\t>\n\t\t\t\t<SVGIcon icon={Minus} />\n\t\t\t</div>\n\t\t\t<div className={styles.quantityValue}>{quantity}</div>\n\t\t\t<div className={styles.quantityAction} onClick={onIncrease}>\n\t\t\t\t<SVGIcon icon={Plus} />\n\t\t\t</div>\n\t\t</Row>\n\t);\n};\nexport default Quantity;\n","import { Flex, IconButton, Row, UIElementType } from \"@sorocraft/ui\";\nimport { ShoppingBag, Trash } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./ProductInCart.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useProductQuantityInCartWithAllVariants } from \"src/hooks/cart\";\n\ninterface Props {\n\tproductId: number;\n\tonModalClose: () => void;\n}\n\nconst ProductInCart = ({ productId, onModalClose }: Props) => {\n\tconst { setIsCartOpen, removeAllProductVariants } = useCartContext();\n\tconst { t } = useTranslation();\n\tconst quantity = useProductQuantityInCartWithAllVariants(productId);\n\n\tconst handleOpenCart = () => {\n\t\tsetIsCartOpen(true);\n\t\tif (onModalClose) onModalClose();\n\t};\n\n\tconst handleRemoveAllFromCart = () => {\n\t\tremoveAllProductVariants(productId);\n\t};\n\n\tif (quantity <= 0) return null;\n\n\treturn (\n\t\t<Flex className={styles.container} fullWidth justifyContent=\"space-between\" alignItems=\"center\">\n\t\t\t<Flex.Item flex={1} className={styles.title}>\n\t\t\t\t{t(\"In order\")} ({quantity})\n\t\t\t</Flex.Item>\n\n\t\t\t<Flex.Item flex={0}>\n\t\t\t\t<Row>\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\ticon={Trash}\n\t\t\t\t\t\tonClick={handleRemoveAllFromCart}\n\t\t\t\t\t\ttype={UIElementType.DANGER}\n\t\t\t\t\t\ttooltip={t(\"Remove from order\")}\n\t\t\t\t\t/>\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\ticon={ShoppingBag}\n\t\t\t\t\t\tonClick={handleOpenCart}\n\t\t\t\t\t\ttype={UIElementType.SUCCESS}\n\t\t\t\t\t\ttooltip={t(\"View order\")}\n\t\t\t\t\t/>\n\t\t\t\t</Row>\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n};\nexport default ProductInCart;\n","import { useEffect, useRef } from \"react\";\nimport { Column, Input, InputType, Row } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\n\nimport styles from \"./ProductVariants.module.scss\";\n\nimport { getProductVariantPrice, getProductVariantTranslation } from \"src/utils/product\";\nimport { Product } from \"src/models/product\";\nimport { useStoreContext } from \"src/store\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tproduct: Product;\n\tselectedVariant: number;\n\tfocusedSection: string;\n\tonSelectVariant: (id: number) => void;\n}\n\nconst ProductVariants = ({ product, selectedVariant, focusedSection, onSelectVariant }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\tconst { t } = useTranslation();\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst { variants } = product || {};\n\n\tconst isVariantsFocused = focusedSection === \"variant\";\n\n\tuseEffect(() => {\n\t\tif (isVariantsFocused && containerRef.current) {\n\t\t\tcontainerRef.current.scrollIntoView({ behavior: \"smooth\" });\n\t\t}\n\t}, [focusedSection]);\n\n\treturn (\n\t\t<Column\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tfocused: isVariantsFocused,\n\t\t\t})}\n\t\t\tgap={1}\n\t\t\tfullWidth\n\t\t>\n\t\t\t<div className={styles.variantsTitle} ref={containerRef}>\n\t\t\t\t{t(\"Product choices\")}\n\t\t\t</div>\n\t\t\t{(variants || []).map((variant) => {\n\t\t\t\tconst { id } = variant || {};\n\t\t\t\tconst { formattedTotalPrice: formattedTotalVariantPrice } = getProductVariantPrice({\n\t\t\t\t\tvariantId: id,\n\t\t\t\t\tlanguage,\n\t\t\t\t\tcurrency,\n\t\t\t\t\tproduct,\n\t\t\t\t});\n\n\t\t\t\tconst { title } = getProductVariantTranslation(variant, language);\n\n\t\t\t\treturn (\n\t\t\t\t\t<Row\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\t\tonClick={() => onSelectVariant(id)}\n\t\t\t\t\t\tclassName={styles.variant}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel={title}\n\t\t\t\t\t\t\tname=\"variant\"\n\t\t\t\t\t\t\tonChange={() => onSelectVariant(id)}\n\t\t\t\t\t\t\tchecked={selectedVariant === id}\n\t\t\t\t\t\t\ttype={InputType.RADIO}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tnoMargin\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className={styles.variantPrice}>{formattedTotalVariantPrice}</div>\n\t\t\t\t\t</Row>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Column>\n\t);\n};\nexport default ProductVariants;\n","import { Column, Input, InputType, Row, Text } from \"@sorocraft/ui\";\n\nimport styles from \"./ProductAddons.module.scss\";\n\nimport { Product } from \"src/models/product\";\nimport { getAddonOptionTranslation, getAddonTranslation, getOptionPrice } from \"src/utils/addon\";\nimport { useStoreContext } from \"src/store\";\nimport { SelectedAddons, MenuAddonSelectType } from \"src/models/addon\";\n\ninterface Props {\n\tproduct: Product;\n\tselectedAddons: SelectedAddons;\n\tonOptionSelect: (selection: {\n\t\taddonId: number;\n\t\toptionId: number;\n\t\tisSingle: boolean;\n\t\tisRemove?: boolean;\n\t}) => void;\n}\n\nconst ProductAddons = ({ product, selectedAddons, onOptionSelect }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\n\tconst { addons } = product || {};\n\treturn (\n\t\t<Column className={styles.container} gap={1.5} fullWidth>\n\t\t\t{(addons || []).map((addon) => {\n\t\t\t\tconst { id: addonId, options, selectType } = addon || {};\n\t\t\t\tconst { title } = getAddonTranslation(addon, language);\n\n\t\t\t\treturn (\n\t\t\t\t\t<Column key={addonId}>\n\t\t\t\t\t\t<Text variant=\"bold\">{title}</Text>\n\t\t\t\t\t\t<Column gap={1} fullWidth>\n\t\t\t\t\t\t\t{(options || []).map((option) => {\n\t\t\t\t\t\t\t\tconst { id: optionId } = option || {};\n\n\t\t\t\t\t\t\t\tconst { formattedTotalPrice: formattedTotalOptionPrice } = getOptionPrice({\n\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\t\t\t\tcurrency,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst { title: optionTitle } = getAddonOptionTranslation(option, language);\n\t\t\t\t\t\t\t\tconst isSingle = selectType === MenuAddonSelectType.SINGLE;\n\t\t\t\t\t\t\t\tconst checked = isSingle\n\t\t\t\t\t\t\t\t\t? selectedAddons[addonId] === optionId\n\t\t\t\t\t\t\t\t\t: ((selectedAddons[addonId] || []) as number[]).includes(optionId);\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Row key={optionId} justifyContent=\"space-between\" className={styles.option}>\n\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\tlabel={optionTitle}\n\t\t\t\t\t\t\t\t\t\t\tname={`option-${addonId}`}\n\t\t\t\t\t\t\t\t\t\t\tonChange={() =>\n\t\t\t\t\t\t\t\t\t\t\t\tonOptionSelect({\n\t\t\t\t\t\t\t\t\t\t\t\t\taddonId,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSingle,\n\t\t\t\t\t\t\t\t\t\t\t\t\tisRemove: !isSingle && checked,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\t\t\t\t\t\ttype={isSingle ? InputType.RADIO : InputType.CHECKBOX}\n\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\tnoMargin\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.optionPrice}>{formattedTotalOptionPrice}</div>\n\t\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t</Column>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Column>\n\t);\n};\nexport default ProductAddons;\n","import { isEmpty, trackEvent } from \"@sorocraft/js-utils\";\nimport { Button, Column, IconButton, Modal, Row } from \"@sorocraft/ui\";\nimport { useEffect, useMemo, useRef, useState, MouseEvent } from \"react\";\nimport { Close } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./ProductDetails.module.scss\";\n\nimport { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { getImageSource } from \"src/utils/image\";\nimport { getProductCartPrice, getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useProductQuantityInCart } from \"src/hooks/cart\";\nimport * as analyticsConstants from \"src/constants/analytics\";\n\nimport Image from \"src/components/Image\";\nimport Quantity from \"src/components/Quantity\";\nimport ProductInCart from \"../ProductInCart\";\nimport ProductVariants from \"../ProductVariants\";\nimport ProductAddons from \"../ProductAddons\";\n\ninterface Props {\n\tproduct: Product;\n\tonClose: () => void;\n}\n\n// Product modal\nconst ProductDetails = ({ product, onClose }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\tconst { addProduct, updateProduct } = useCartContext();\n\tconst [quantity, setQuantity] = useState<number>(1);\n\tconst [isUpdate, setIsUpdate] = useState<boolean>(false);\n\tconst [selectedVariant, setSelectedVariant] = useState<number | null>(null);\n\tconst [focusedSection, setFocusedSection] = useState<string | null>(null);\n\tconst [selectedAddons, setSelectedAddons] = useState<SelectedAddons>({});\n\tconst modalRef = useRef<HTMLDivElement>(null);\n\tconst { t } = useTranslation();\n\n\tconst productQuantityInCart = useProductQuantityInCart({\n\t\tproductId: product?.id,\n\t\tvariantId: selectedVariant,\n\t\tselectedAddons,\n\t});\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\n\tconst { formattedTotalPrice: formattedTotalCartPrice } = useMemo(\n\t\t() =>\n\t\t\tgetProductCartPrice({\n\t\t\t\tproduct,\n\t\t\t\tquantity,\n\t\t\t\tlanguage,\n\t\t\t\tcurrency,\n\t\t\t\tvariantId: selectedVariant,\n\t\t\t\tselectedAddons,\n\t\t\t}),\n\t\t[product, quantity, language, currency, selectedVariant, selectedAddons]\n\t);\n\n\tconst isDecreaseDisabled = isUpdate ? quantity === 0 : quantity === 1;\n\tconst actionTitle = useMemo(\n\t\t() =>\n\t\t\tisUpdate ? (quantity === 0 ? t(\"Remove from order\") : t(\"Update order\")) : t(\"Add to order\"),\n\t\t[isUpdate, quantity]\n\t);\n\n\tuseEffect(() => {\n\t\tsetQuantity(productQuantityInCart > 0 ? productQuantityInCart : 1);\n\t\tsetIsUpdate(productQuantityInCart > 0);\n\t}, [productQuantityInCart, product]);\n\n\tuseEffect(() => {\n\t\tsetSelectedVariant(null);\n\t\tsetSelectedAddons({});\n\t}, [product]);\n\n\tconst handleClickOutside = (event: MouseEvent) => {\n\t\tif (!modalRef?.current?.contains?.(event?.target as Node)) {\n\t\t\tif (onClose) onClose();\n\t\t}\n\t};\n\n\tconst handleSetFocusedSection = (section: string) => {\n\t\tsetFocusedSection(section);\n\n\t\tsetTimeout(() => {\n\t\t\tsetFocusedSection(null);\n\t\t}, 200);\n\t};\n\n\tconst handleSubmit = () => {\n\t\tconst hasVariant = product?.variants?.length > 0;\n\n\t\tif (hasVariant && !selectedVariant) return handleSetFocusedSection(\"variant\");\n\n\t\tif (isUpdate) {\n\t\t\tupdateProduct({ product, quantity, variantId: selectedVariant, selectedAddons });\n\t\t} else {\n\t\t\taddProduct({ product, quantity, variantId: selectedVariant, selectedAddons });\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity });\n\t\t}\n\t\tif (onClose) onClose();\n\t};\n\n\tconst adjustQuantity = (amount: number) => {\n\t\tif (amount === -1 && isDecreaseDisabled) return;\n\n\t\tsetQuantity((current) => Math.max(0, current + amount));\n\t};\n\n\tconst handleOptionSelect = ({\n\t\taddonId,\n\t\toptionId,\n\t\tisSingle,\n\t\tisRemove = false,\n\t}: {\n\t\taddonId: number;\n\t\toptionId: number;\n\t\tisSingle: boolean;\n\t\tisRemove?: boolean;\n\t}) => {\n\t\tsetSelectedAddons((prevForm) => {\n\t\t\t// For single selection, directly replace the value\n\t\t\tif (isSingle) {\n\t\t\t\treturn { ...prevForm, [addonId]: optionId };\n\t\t\t}\n\n\t\t\t// Handle multiple selection\n\t\t\tconst previousSelection = (prevForm[addonId] || []) as number[];\n\t\t\tconst updatedSelection = isRemove\n\t\t\t\t? previousSelection.filter((id) => id !== optionId) // Remove `optionId`\n\t\t\t\t: [...new Set([...previousSelection, optionId])]; // Add `optionId`\n\n\t\t\treturn {\n\t\t\t\t...prevForm,\n\t\t\t\t[addonId]: updatedSelection,\n\t\t\t};\n\t\t});\n\t};\n\n\tif (isEmpty(product)) return null;\n\n\tconst { image1024, volume, variants, addons, available } = product;\n\tconst hasVariants = variants?.length > 0;\n\tconst hasAddons = addons?.length > 0;\n\n\treturn (\n\t\t<div className={styles.container} onClick={handleClickOutside}>\n\t\t\t<Modal\n\t\t\t\tonClose={onClose}\n\t\t\t\tref={modalRef}\n\t\t\t\tnoBodyPadding\n\t\t\t\tsize=\"small\"\n\t\t\t\tcontent={\n\t\t\t\t\t<div className={styles.content}>\n\t\t\t\t\t\t<Column gap={0}>\n\t\t\t\t\t\t\t{image1024 && (\n\t\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\t\tsrc={getImageSource(image1024)}\n\t\t\t\t\t\t\t\t\twidth={1024}\n\t\t\t\t\t\t\t\t\theight={400}\n\t\t\t\t\t\t\t\t\talt={name || \"product\"}\n\t\t\t\t\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<Column className={styles.details} gap={1}>\n\t\t\t\t\t\t\t\t<h2 className={styles.name}>{name}</h2>\n\t\t\t\t\t\t\t\t<Row justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t\t<div className={styles.price}>{formattedTotalPrice}</div>\n\t\t\t\t\t\t\t\t\t<div className={styles.volume}>{volume}</div>\n\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t<div className={styles.description}>{description}</div>\n\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t{(hasVariants || hasAddons) && (\n\t\t\t\t\t\t\t\t<Column gap={0} className={styles.choices}>\n\t\t\t\t\t\t\t\t\t{hasVariants && (\n\t\t\t\t\t\t\t\t\t\t<ProductVariants\n\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\tselectedVariant={selectedVariant}\n\t\t\t\t\t\t\t\t\t\t\tfocusedSection={focusedSection}\n\t\t\t\t\t\t\t\t\t\t\tonSelectVariant={setSelectedVariant}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{hasAddons && (\n\t\t\t\t\t\t\t\t\t\t<ProductAddons\n\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\tselectedAddons={selectedAddons}\n\t\t\t\t\t\t\t\t\t\t\tonOptionSelect={handleOptionSelect}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t<div className={styles.close}>\n\t\t\t\t\t\t\t<IconButton onClick={onClose} icon={Close} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\t<Column>\n\t\t\t\t\t\t<ProductInCart productId={product?.id} onModalClose={onClose} />\n\t\t\t\t\t\t<Row className={styles.addToCart} gap={0.5}>\n\t\t\t\t\t\t\t<Quantity\n\t\t\t\t\t\t\t\tisDecreaseDisabled={isDecreaseDisabled}\n\t\t\t\t\t\t\t\tonDecrease={() => adjustQuantity(-1)}\n\t\t\t\t\t\t\t\tonIncrease={() => adjustQuantity(1)}\n\t\t\t\t\t\t\t\tquantity={quantity}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tclassName={styles.addAction}\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\tavailable ? (\n\t\t\t\t\t\t\t\t\t\t<Row fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.actionTitle}>{actionTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{formattedTotalCartPrice}</span>\n\t\t\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\tt(\"Not available\")\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\tdisabled={!available}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</Column>\n\t\t\t\t}\n\t\t\t/>\n\t\t</div>\n\t);\n};\nexport default ProductDetails;\n","import { Flex, Row } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\n\nimport styles from \"./CartStepper.module.scss\";\n\nimport { useCartTotalPrice, useTotalCartItemsCount } from \"src/hooks/cart\";\n\ninterface Props {\n\tonClick?: () => void;\n\tactionText?: string;\n}\n\nconst CartStepper = ({ actionText, onClick }: Props) => {\n\tconst totalCount = useTotalCartItemsCount();\n\tconst { formattedTotalPrice } = useCartTotalPrice();\n\n\treturn (\n\t\t<Flex\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tisClickable: !!onClick,\n\t\t\t})}\n\t\t\tjustifyContent=\"space-between\"\n\t\t\talignItems=\"center\"\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<Flex.Item flex={1}>\n\t\t\t\t<Row alignItems=\"center\">\n\t\t\t\t\t<div className={styles.count}>{totalCount}</div>\n\t\t\t\t\t<div className={styles.actionText}>{actionText}</div>\n\t\t\t\t</Row>\n\t\t\t</Flex.Item>\n\t\t\t<Flex.Item className={styles.totalPrice} flex={1}>\n\t\t\t\t{formattedTotalPrice}\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n};\nexport default CartStepper;\n","import styles from \"./Cart.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useTotalCartItemsCount } from \"src/hooks/cart\";\n\nimport CartStepper from \"../CartStepper\";\n\nconst Cart = () => {\n\tconst { setIsCartOpen } = useCartContext();\n\tconst { t } = useTranslation();\n\tconst totalCount = useTotalCartItemsCount();\n\n\tif (totalCount <= 0) return null;\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.content}>\n\t\t\t\t<CartStepper onClick={() => setIsCartOpen(true)} actionText={t(\"View order\")} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\nexport default Cart;\n","import { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { generateCartId } from \"src/utils/cart\";\n\nexport const useProductById = (productId: number): Product => {\n\tconst { products } = useStoreContext();\n\tconst product = products?.find?.(({ id }) => id === productId);\n\n\treturn (product || {}) as Product;\n};\n\nexport const useProductQuantity = ({\n\tproductId,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproductId: number;\n\tvariantId?: number;\n\tselectedAddons: SelectedAddons;\n}): number => {\n\tconst { cart } = useCartContext();\n\tconst cartId = generateCartId(productId, variantId, selectedAddons);\n\tconst item = cart[cartId];\n\n\treturn item?.quantity || 1;\n};\n","import { SIZE } from \"@sorocraft/ui\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useProductById, useProductQuantity } from \"src/hooks/product\";\n\nimport Quantity from \"src/components/Quantity\";\nimport { SelectedAddons } from \"src/models/addon\";\n\ninterface Props {\n\tproductId: number;\n\tvariantId?: number;\n\tselectedAddons?: SelectedAddons;\n\tmin?: number;\n\tsize?: SIZE;\n}\n\nconst ProductQuantity = ({ productId, variantId, min = 1, size = \"md\", selectedAddons }: Props) => {\n\tconst quantity = useProductQuantity({ productId, variantId, selectedAddons });\n\tconst product = useProductById(productId);\n\tconst { updateProduct } = useCartContext();\n\n\tconst isDecreaseDisabled = quantity === min;\n\n\treturn (\n\t\t<Quantity\n\t\t\tisDecreaseDisabled={isDecreaseDisabled}\n\t\t\tonDecrease={() =>\n\t\t\t\tupdateProduct({ product, quantity: quantity - 1, variantId, selectedAddons })\n\t\t\t}\n\t\t\tonIncrease={() =>\n\t\t\t\tupdateProduct({ product, quantity: quantity + 1, variantId, selectedAddons })\n\t\t\t}\n\t\t\tquantity={quantity}\n\t\t\tsize={size}\n\t\t/>\n\t);\n};\nexport default ProductQuantity;\n","import { ReactNode } from \"react\";\nimport { Text } from \"@sorocraft/ui\";\nimport { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { Product } from \"src/models/product\";\nimport { getAddonOptionTranslation, getAddonTranslation } from \"src/utils/addon\";\nimport { getProductAddon } from \"src/utils/product\";\n\nconst GetCartItemOptionsInfo = ({\n\titem,\n\tproduct,\n\tlanguage,\n}: {\n\titem: CartItem;\n\tproduct: Product;\n\tlanguage: string;\n}): ReactNode => {\n\tconst { selectedAddons } = item || {};\n\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(selectedAddons || {})\n\t\t\t\t.map(([addonId, optionId]) => {\n\t\t\t\t\tconst addon = getProductAddon(product, Number(addonId));\n\t\t\t\t\tif (isEmpty(addon) || isEmpty(addon.options) || !Array.isArray(addon.options)) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet optionTitles = \"\";\n\n\t\t\t\t\tif (Array.isArray(optionId)) {\n\t\t\t\t\t\tconst options = addon.options.filter(({ id }) => optionId.includes(id));\n\t\t\t\t\t\tif (isEmpty(options)) return null;\n\n\t\t\t\t\t\toptionTitles = options\n\t\t\t\t\t\t\t.map((option) => {\n\t\t\t\t\t\t\t\tconst { title: optionTitle } = getAddonOptionTranslation(option, language);\n\n\t\t\t\t\t\t\t\treturn optionTitle;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst option = addon.options.find(({ id }) => id === optionId);\n\t\t\t\t\t\tif (isEmpty(option)) return null;\n\t\t\t\t\t\tconst { title } = getAddonOptionTranslation(option, language);\n\t\t\t\t\t\toptionTitles = title;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { title: addonTitle } = getAddonTranslation(addon, language);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Text color=\"muted\" size=\"xs\" key={addonId}>\n\t\t\t\t\t\t\t{addonTitle}: {optionTitles}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)}\n\t\t</>\n\t);\n};\n\nexport default GetCartItemOptionsInfo;\n","import { Column, Row, Text } from \"@sorocraft/ui\";\nimport { useMemo } from \"react\";\n\nimport styles from \"./CartItem.module.scss\";\n\nimport { useProductById } from \"src/hooks/product\";\nimport { CartItem } from \"src/models/order\";\nimport { useStoreContext } from \"src/store\";\nimport {\n\tgetProductTranslation,\n\tgetProductVariant,\n\tgetProductVariantTranslation,\n} from \"src/utils/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { getCartPrice } from \"src/utils/cart\";\n\nimport Image from \"src/components/Image\";\nimport ProductQuantity from \"../ProductQuantity\";\nimport GetCartItemOptionsInfo from \"./OptionsInfo\";\n\ninterface Props {\n\titem: CartItem;\n}\n\nconst CartItem = ({ item }: Props) => {\n\tconst { productId, variantId, selectedAddons } = item || {};\n\tconst product = useProductById(productId);\n\tconst variant = getProductVariant(product, variantId);\n\tconst { language, currency } = useStoreContext();\n\tconst { image160 } = product;\n\tconst { title: variantTitle } = getProductVariantTranslation(variant, language);\n\tconst { name } = useMemo(() => getProductTranslation(product, language), [product, language]);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getCartPrice(item, currency, language),\n\t\t[item, currency, language]\n\t);\n\n\treturn (\n\t\t<Row className={styles.container} gap={1} alignItems=\"flex-start\">\n\t\t\t{image160 && (\n\t\t\t\t<Image\n\t\t\t\t\tsrc={getImageSource(image160)}\n\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\twidth={80}\n\t\t\t\t\theight={45}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className={styles.data}>\n\t\t\t\t<div className={styles.name}>{name}</div>\n\t\t\t\t<Column gap={0}>\n\t\t\t\t\t{!!variantTitle && (\n\t\t\t\t\t\t<Text color=\"muted\" size=\"xs\">\n\t\t\t\t\t\t\t{variantTitle}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t<GetCartItemOptionsInfo item={item} product={product} language={language} />\n\t\t\t\t</Column>\n\t\t\t\t<div className={styles.price}>{formattedTotalPrice}</div>\n\t\t\t</div>\n\t\t\t<ProductQuantity\n\t\t\t\tproductId={productId}\n\t\t\t\tvariantId={variantId}\n\t\t\t\tselectedAddons={selectedAddons}\n\t\t\t\tsize=\"sm\"\n\t\t\t\tmin={0}\n\t\t\t/>\n\t\t</Row>\n\t);\n};\nexport default CartItem;\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { useRef, MouseEvent } from \"react\";\nimport { Button, Column, Description, Text, UIElementType, Drawer } from \"@sorocraft/ui\";\n\nimport styles from \"./CartDrawer.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport CartItem from \"../CartItem\";\nimport CartStepper from \"../CartStepper\";\n\nconst CartDrawer = () => {\n\tconst { isCartOpen, cart, setIsCartOpen } = useCartContext();\n\tconst contentRef = useRef<HTMLDivElement>(null);\n\tconst { t } = useTranslation();\n\n\tconst isCartEmpty = isEmpty(cart);\n\n\tconst close = () => setIsCartOpen(false);\n\n\tconst handleClickOutside = (event: MouseEvent<HTMLElement>) => {\n\t\tif (!contentRef?.current?.contains?.(event?.target as Node)) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst NoItems = () => (\n\t\t<Column\n\t\t\tclassName={styles.noItems}\n\t\t\tfullWidth\n\t\t\tfullHeight\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\tgap={0}\n\t\t>\n\t\t\t<Text variant=\"h2\">{t(\"Empty order\")}</Text>\n\t\t\t<Description text={t(\"You don't have any items in your order\")} />\n\t\t</Column>\n\t);\n\n\tif (!isCartOpen) return null;\n\n\treturn (\n\t\t<div className={styles.container} onClick={handleClickOutside}>\n\t\t\t<Drawer\n\t\t\t\tref={contentRef}\n\t\t\t\tonClose={close}\n\t\t\t\tisOpen={isCartOpen}\n\t\t\t\ttitle={t(\"Your order\")}\n\t\t\t\tcontent={\n\t\t\t\t\t<div className={styles.content}>\n\t\t\t\t\t\t{isCartEmpty ? (\n\t\t\t\t\t\t\t<NoItems />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className={styles.items}>\n\t\t\t\t\t\t\t\t{Object.keys(cart || {}).map((productId) => (\n\t\t\t\t\t\t\t\t\t<CartItem key={productId} item={cart[productId]} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\tisCartEmpty ? (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tlabel={t(\"Add items\")}\n\t\t\t\t\t\t\tonClick={close}\n\t\t\t\t\t\t\ttype={UIElementType.PRIMARY}\n\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CartStepper actionText={t(\"Subtotal\")} />\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t/>\n\t\t</div>\n\t);\n};\nexport default CartDrawer;\n","import { RefObject, useEffect, memo, useState } from \"react\";\nimport { Column, DivElementMap, IconButton, Row, UIElementType } from \"@sorocraft/ui\";\nimport { trackEvent } from \"@sorocraft/js-utils\";\nimport { Grid, List } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./Products.module.scss\";\n\nimport * as categoryUtils from \"src/utils/category\";\nimport { getProductTranslation } from \"src/utils/product\";\nimport * as menuModels from \"src/models/menu\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { Product, ProductView } from \"src/models\";\nimport { CartProvider } from \"src/store/cart\";\n\nimport ProductsListItem from \"../ProductsListItem\";\nimport ProductsGridItem from \"../ProductsGridItem\";\nimport ProductDetails from \"../ProductDetails\";\nimport Cart from \"../Cart\";\nimport CartDrawer from \"../CartDrawer\";\n\ninterface Props {\n\tproductBlocksRef: RefObject<DivElementMap>;\n\tcontainerRef: RefObject<HTMLDivElement>;\n\tcurrency: string;\n\tlanguage: string;\n\tcategoryProductMap: menuModels.CategoryProductMap[];\n\tonCategoryInView: (categoryId: number) => void;\n}\n\nconst Products = memo(\n\t({\n\t\tcategoryProductMap = [],\n\t\tcurrency,\n\t\tlanguage,\n\t\tproductBlocksRef,\n\t\tcontainerRef,\n\t\tonCategoryInView,\n\t}: Props) => {\n\t\tconst [selectedProduct, setSelectedProduct] = useState<Product | null>(null);\n\t\tconst [view, setView] = useState<ProductView>(ProductView.LIST);\n\n\t\tconst views = [\n\t\t\t{\n\t\t\t\ticon: List,\n\t\t\t\ttype: ProductView.LIST,\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: Grid,\n\t\t\t\ttype: ProductView.GRID,\n\t\t\t},\n\t\t];\n\n\t\tconst handleSelectView = (type: ProductView) => {\n\t\t\tsetView(type);\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_VIEW_CHANGED, { name: type });\n\t\t};\n\n\t\tconst handleSelectProduct = (product: Product) => {\n\t\t\tconst { name } = getProductTranslation(product, language);\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_DETAILS, { name });\n\n\t\t\tsetSelectedProduct(product);\n\t\t};\n\n\t\tuseEffect(() => {\n\t\t\t// Create an IntersectionObserver instance\n\t\t\tconst observer = new IntersectionObserver(\n\t\t\t\t(entries) => {\n\t\t\t\t\t// Calculate the center of the viewport\n\t\t\t\t\tconst viewportCenter = (containerRef?.current?.clientHeight || 1000) / 2;\n\n\t\t\t\t\tlet closestCategoryId: string | null = null;\n\t\t\t\t\tlet closestDistance = Infinity;\n\n\t\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\t\tconst rect = entry.boundingClientRect;\n\t\t\t\t\t\t\tconst elementCenter = rect.top + rect.height / 2;\n\t\t\t\t\t\t\tconst distanceToCenter = Math.abs(elementCenter - viewportCenter);\n\n\t\t\t\t\t\t\t// Check if this element is closer to the center\n\t\t\t\t\t\t\tif (distanceToCenter < closestDistance) {\n\t\t\t\t\t\t\t\tclosestDistance = distanceToCenter;\n\t\t\t\t\t\t\t\tclosestCategoryId = entry.target.getAttribute(\"data-category-id\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Update the active category if it has changed\n\t\t\t\t\tif (closestCategoryId) {\n\t\t\t\t\t\tonCategoryInView(Number(closestCategoryId));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tthreshold: 0.1, // Adjust as needed (10% visibility)\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Observe each product block\n\t\t\tObject.entries(productBlocksRef.current || {}).forEach(([categoryId, element]) => {\n\t\t\t\tif (element) {\n\t\t\t\t\telement.setAttribute(\"data-category-id\", categoryId); // Add a data attribute\n\t\t\t\t\tobserver.observe(element);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\t// Cleanup the observer\n\t\t\t\tobserver.disconnect();\n\t\t\t};\n\t\t}, [productBlocksRef, containerRef]);\n\n\t\treturn (\n\t\t\t<CartProvider>\n\t\t\t\t<div className={styles.container}>\n\t\t\t\t\t<Row className={styles.view} alignItems=\"center\">\n\t\t\t\t\t\t{views.map(({ icon, type }) => (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tkey={type}\n\t\t\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\t\t\tonClick={() => handleSelectView(type)}\n\t\t\t\t\t\t\t\ttype={type === view ? UIElementType.PRIMARY : UIElementType.DEFAULT}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Row>\n\t\t\t\t\t<Column>\n\t\t\t\t\t\t{(categoryProductMap || []).map((category) => {\n\t\t\t\t\t\t\tconst { name } = categoryUtils.getCategoryTranslation(category, language);\n\t\t\t\t\t\t\tconst { id, products } = category;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={styles.products}\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\tproductBlocksRef!.current![id] = el;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdata-category-id={id}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<h2 className={styles.category}>{name}</h2>\n\t\t\t\t\t\t\t\t\t<div className={styles.list}>\n\t\t\t\t\t\t\t\t\t\t<Column gap={0}>\n\t\t\t\t\t\t\t\t\t\t\t{(products || []).map((product) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (view === ProductView.GRID) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ProductsGridItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={product.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectProduct(product)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProductsListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={product.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectProduct(product)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Column>\n\t\t\t\t\t<ProductDetails product={selectedProduct} onClose={() => setSelectedProduct(null)} />\n\t\t\t\t\t<Cart />\n\t\t\t\t\t<CartDrawer />\n\t\t\t\t</div>\n\t\t\t</CartProvider>\n\t\t);\n\t},\n\t(prevProps, nextProps) => {\n\t\treturn (\n\t\t\tprevProps.categoryProductMap === nextProps.categoryProductMap &&\n\t\t\tprevProps.currency === nextProps.currency &&\n\t\t\tprevProps.language === nextProps.language\n\t\t);\n\t}\n);\n\nProducts.displayName = \"Products\";\n\nexport default Products;\n","import { ReactNode } from \"react\";\nimport { Card, Container, Flex } from \"@sorocraft/ui\";\n\nimport styles from \"./Branches.module.scss\";\n\nimport * as branchModels from \"src/models/branch\";\n\ninterface Props {\n\tbranches: branchModels.Branch[];\n\trootPath?: string;\n\tonBranchSelect: (branchId: number) => void;\n}\n\nconst Branches = ({ branches = [], rootPath = \"\", onBranchSelect }: Props) => {\n\tconst Parent = ({ children, id }: { children: ReactNode; id: number }) => {\n\t\tif (onBranchSelect) return <div onClick={() => onBranchSelect(id)}>{children}</div>;\n\n\t\treturn <a href={`${rootPath}/${id}`}>{children}</a>;\n\t};\n\n\treturn (\n\t\t<div className={styles.branches}>\n\t\t\t<Container className={styles.list}>\n\t\t\t\t{branches.map(({ id, name }) => (\n\t\t\t\t\t<Parent key={id} id={id}>\n\t\t\t\t\t\t<Card noBottomMargin>\n\t\t\t\t\t\t\t<Flex justifyContent=\"center\" alignItems=\"center\" fullHeight>\n\t\t\t\t\t\t\t\t<h2 className={styles.name}>{name}</h2>\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t</Card>\n\t\t\t\t\t</Parent>\n\t\t\t\t))}\n\t\t\t</Container>\n\t\t</div>\n\t);\n};\nexport default Branches;\n","import { isEmpty, trackEvent } from \"@sorocraft/js-utils\";\nimport { DivElementMap } from \"@sorocraft/ui\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport styles from \"./PublicMenu.module.scss\";\n\nimport * as menuModels from \"src/models/menu\";\nimport * as branchModels from \"src/models/branch\";\nimport { getCoverImageSource, getLogoImageSource } from \"src/utils/image\";\nimport { getBaseUrl } from \"src/utils/url\";\nimport { prepareCategoryAndProductMap } from \"src/utils/menu\";\nimport { StoreProvider } from \"src/store\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { getCategoryNameById } from \"src/utils/category\";\n\nimport Header from \"./Header\";\nimport Categories from \"./Categories\";\nimport Products from \"./Products\";\nimport Branches from \"./Branches\";\n\ninterface Props {\n\tdata: menuModels.PublicMenuData;\n}\n\nconst PublicMenu = ({ data }: Props) => {\n\tconst {\n\t\tname,\n\t\tcoverImage,\n\t\tlogoImage,\n\t\tbranches = [],\n\t\tbranchId,\n\t\tlanguage,\n\t\tcategories,\n\t\tproducts,\n\t\tcurrency,\n\t\tinstagram,\n\t\tfacebook,\n\t\twhatsapp,\n\t\ttelegram,\n\t\ttiktok,\n\t\trootPath,\n\t\thostname,\n\t\tonBranchSelect,\n\t} = data || {};\n\n\tconst hasSingleBranch = branches.length <= 1;\n\tconst categoryProductMap = prepareCategoryAndProductMap(categories, products);\n\n\tconst getSelectedBranch = () => {\n\t\tif (hasSingleBranch) {\n\t\t\tif (branches?.[0]?.id) return branches[0];\n\n\t\t\treturn {} as branchModels.Branch;\n\t\t}\n\n\t\treturn branches.find((item) => item.id === Number(branchId));\n\t};\n\n\tconst selectedBranch = getSelectedBranch();\n\tconst venueName = hasSingleBranch || !selectedBranch?.name ? name : selectedBranch?.name || \"\";\n\n\tconst [selectedCategoryId, setSelectedCategoryId] = useState<number>(categories?.[0]?.id);\n\tconst productBlocksRef = useRef<DivElementMap>({});\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst canUserScroll = useRef<boolean>(true);\n\tconst { url: baseUrl, domain } = getBaseUrl(hostname, language);\n\n\tconst scrollToProductBlock = (categoryId: number) => {\n\t\tconst productBlock = productBlocksRef?.current?.[categoryId];\n\n\t\tif (!productBlock) return;\n\n\t\tsetTimeout(() => {\n\t\t\tproductBlock.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n\t\t}, 100);\n\n\t\tsetTimeout(() => {\n\t\t\tcanUserScroll.current = true;\n\t\t}, 1000);\n\t};\n\n\tconst handleSelectCategory = async (categoryId: number) => {\n\t\tcanUserScroll.current = false;\n\t\tsetSelectedCategoryId(categoryId);\n\n\t\tscrollToProductBlock(categoryId);\n\t};\n\n\tconst handleCategoryInView = (categoryId: number) => {\n\t\tif (!canUserScroll?.current) return;\n\t\tconst name = getCategoryNameById(categoryId, categories, language);\n\t\ttrackEvent(analyticsConstants.CATEGORY_SCROLLED, { name });\n\t\tsetSelectedCategoryId(categoryId);\n\t};\n\n\tconst selectCategoryFromURL = () => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst searchParams = new URLSearchParams(window.location.search);\n\t\tconst categoryIdFromURL = Number(searchParams.get(\"category\"));\n\t\tif (!categoryIdFromURL) return;\n\n\t\tconst categoryToSelect = (categories || []).find(({ id }) => id === categoryIdFromURL);\n\t\tif (isEmpty(categoryToSelect)) return;\n\n\t\thandleSelectCategory(categoryIdFromURL);\n\t};\n\n\tuseEffect(() => {\n\t\tselectCategoryFromURL();\n\t}, []);\n\n\treturn (\n\t\t<div className={styles.container} ref={containerRef}>\n\t\t\t<Header\n\t\t\t\tbranch={selectedBranch}\n\t\t\t\tname={venueName}\n\t\t\t\tcoverImage={getCoverImageSource(coverImage)}\n\t\t\t\tlogoImage={getLogoImageSource(logoImage)}\n\t\t\t\tinstagram={instagram}\n\t\t\t\tfacebook={facebook}\n\t\t\t\twhatsapp={whatsapp}\n\t\t\t\ttelegram={telegram}\n\t\t\t\ttiktok={tiktok}\n\t\t\t/>\n\t\t\t{!hasSingleBranch && !branchId ? (\n\t\t\t\t<Branches branches={branches} onBranchSelect={onBranchSelect} rootPath={rootPath} />\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<Categories\n\t\t\t\t\t\tcategoryProductMap={categoryProductMap}\n\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\tselectedCategoryId={selectedCategoryId}\n\t\t\t\t\t\tonSelectCategory={handleSelectCategory}\n\t\t\t\t\t/>\n\t\t\t\t\t<Products\n\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\tproductBlocksRef={productBlocksRef}\n\t\t\t\t\t\tcontainerRef={containerRef}\n\t\t\t\t\t\tcategoryProductMap={categoryProductMap}\n\t\t\t\t\t\tonCategoryInView={handleCategoryInView}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{!!hostname && (\n\t\t\t\t<a rel=\"noopener noreferrer\" target=\"_blank\" href={baseUrl} className={styles.footer}>\n\t\t\t\t\t{domain}\n\t\t\t\t</a>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst PublicMenuWithContext = ({ data }: Props) => {\n\treturn (\n\t\t<StoreProvider value={data}>\n\t\t\t<PublicMenu data={data} />\n\t\t</StoreProvider>\n\t);\n};\n\nexport default PublicMenuWithContext;\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n","import { useCallback, useRef } from \"react\";\nimport { CloseDropdownRef, DropDown, DropDownMenuItem, UIElementType } from \"@sorocraft/ui\";\n\nimport styles from \"./Events.module.scss\";\n\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tcurrentGoal: string;\n\tlanguage?: string;\n\tsetGoal: (goal: string) => void;\n}\n\nconst EventsToolbar = ({ currentGoal, language, setGoal }: Props) => {\n\tconst { t } = useTranslation(language);\n\tconst closeDropdownRef = useRef<CloseDropdownRef>({});\n\n\tconst getGoalTitle = (goal: string) => {\n\t\tswitch (goal) {\n\t\t\tcase analyticsConstants.CATEGORY_SCROLLED:\n\t\t\t\treturn t(\"Scrolled to Category\");\n\t\t\tcase analyticsConstants.CATEGORY_SELECTED:\n\t\t\t\treturn t(\"Category Selected\");\n\t\t\tcase analyticsConstants.PRODUCT_DETAILS:\n\t\t\t\treturn t(\"Product Details\");\n\t\t\tcase analyticsConstants.PRODUCT_ADD_CART:\n\t\t\t\treturn t(\"Product Added to Cart\");\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tconst handleChange = useCallback(\n\t\t(goal: string) => {\n\t\t\tsetGoal(goal);\n\t\t\tcloseDropdownRef?.current?.close?.();\n\t\t},\n\t\t[setGoal]\n\t);\n\n\treturn (\n\t\t<DropDown\n\t\t\taction={getGoalTitle(currentGoal)}\n\t\t\tactionSize=\"large\"\n\t\t\ttype={UIElementType.BORDERED_PRIMARY}\n\t\t\tcloseRef={closeDropdownRef}\n\t\t\tmenu={\n\t\t\t\t<div className={styles.toolbarMenu}>\n\t\t\t\t\t{analyticsConstants.GOALS.map((goal) => (\n\t\t\t\t\t\t<DropDownMenuItem key={goal} onClick={() => handleChange(goal)}>\n\t\t\t\t\t\t\t{getGoalTitle(goal)}\n\t\t\t\t\t\t</DropDownMenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t}\n\t\t/>\n\t);\n};\nexport default EventsToolbar;\n","import { Card, BarChart, Loading, BarChartData } from \"@sorocraft/ui\";\n\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport EventsToolbar from \"./EventsToolbar\";\n\ninterface Props {\n\tdata: BarChartData[];\n\tisLoading?: boolean;\n\tloadingImage?: string;\n\tlanguage?: string;\n\tgoal: string;\n\tsetGoal: (goal: string) => void;\n}\n\nconst Events = ({ data, isLoading = false, loadingImage, language, goal, setGoal }: Props) => {\n\tconst { t } = useTranslation(language);\n\n\treturn (\n\t\t<Card\n\t\t\ttitle={t(\"Events\")}\n\t\t\ttoolbar={<EventsToolbar language={language} currentGoal={goal} setGoal={setGoal} />}\n\t\t>\n\t\t\t{isLoading ? <Loading image={loadingImage} /> : <BarChart data={data} />}\n\t\t</Card>\n\t);\n};\nexport default Events;\n","import { PlanType, PricingPlans } from \"src/models/pricing\";\n\nexport const PRICING: PricingPlans = {\n\tappetizer: {\n\t\ttitle: \"Appetizer\",\n\t\tprice: {\n\t\t\tmonthly: 9,\n\t\t\tannually: 7,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n\tmainCourse: {\n\t\ttitle: \"Main Course\",\n\t\tprice: {\n\t\t\tmonthly: 19,\n\t\t\tannually: 15,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n\tchefsSpecial: {\n\t\ttitle: \"Chef's Special\",\n\t\tprice: {\n\t\t\tmonthly: 49,\n\t\t\tannually: 39,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n};\n\nexport const PRICING_BENEFITS = [\n\t{\n\t\ttitle: \"Smart QR Menu\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Link-in-bio\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Menu Analytics\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Users\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Products\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Categories\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Product variants\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Product options\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"24/7 Support\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Sales reports\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Multiple Branches\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Table Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Order Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Delivery Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Mobile App for Owners & Staff\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Point of Sale (POS)\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t// {\n\t// \ttitle: \"RestaroundPay with Mobile\",\n\t// \t[PlanType.APPETIZER]: false,\n\t// \t[PlanType.MAIN_COURSE]: true,\n\t// \t[PlanType.CHEFS_SPECIAL]: true,\n\t// },\n\t// {\n\t// \ttitle: \"Event management\",\n\t// \t[PlanType.APPETIZER]: false,\n\t// \t[PlanType.MAIN_COURSE]: true,\n\t// \t[PlanType.CHEFS_SPECIAL]: true,\n\t// },\n\t{\n\t\ttitle: \"Third-Party Delivery Integrations\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n];\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { Column, Row, Text } from \"@sorocraft/ui\";\n\nimport styles from \"./Pricing.module.scss\";\n\nimport { PRICING } from \"src/constants/pricing\";\nimport { PlanType, PricingInterval } from \"src/models/pricing\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tplan: PlanType;\n\tlanguage: string;\n\tinterval: PricingInterval;\n\tcurrency: string;\n}\n\nconst PricingPlanAmount = ({ plan, language, interval, currency }: Props) => {\n\tconst { t } = useTranslation(language);\n\n\tconst { price, discountedPrice } = PRICING[plan];\n\tconst intervalPrice = price[interval];\n\n\tif (discountedPrice !== undefined) {\n\t\treturn (\n\t\t\t<Column gap={0}>\n\t\t\t\t<Row>\n\t\t\t\t\t<span className={styles.discountedPrice}>\n\t\t\t\t\t\t{priceFormatter(discountedPrice, currency, language)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className={styles.originalPrice}>\n\t\t\t\t\t\t{priceFormatter(intervalPrice, currency, language)}\n\t\t\t\t\t</span>\n\t\t\t\t</Row>\n\t\t\t\t<Text size=\"sm\">{t(\"/ month\")}</Text>\n\t\t\t</Column>\n\t\t);\n\t}\n\treturn (\n\t\t<Row gap={0.5}>\n\t\t\t<Text size=\"xxl\" variant=\"bold\">\n\t\t\t\t{priceFormatter(intervalPrice, currency, language)}\n\t\t\t</Text>\n\t\t\t<Text size=\"sm\">{t(\"/ month\")}</Text>\n\t\t</Row>\n\t);\n};\nexport default PricingPlanAmount;\n","import { Card, SVGIcon, UIElementType, Button } from \"@sorocraft/ui\";\nimport { Check, Minus } from \"@sorocraft/ui/icons\";\nimport { classNames } from \"@sorocraft/js-utils\";\nimport { ReactNode, useState } from \"react\";\n\nimport styles from \"./Pricing.module.scss\";\n\nimport { PRICING, PRICING_BENEFITS } from \"src/constants/pricing\";\nimport { PlanType, PricingInterval } from \"src/models/pricing\";\nimport { getRegisterUrl } from \"src/utils/url\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport PricingPlanAmount from \"./PricingPlanAmount\";\n\ninterface Props {\n\tcurrency: string;\n\tlanguage: string;\n\tonPlanSelect?: (plan: PlanType) => void;\n\tonIntervalSelect?: (interval: PricingInterval) => void;\n}\n\nconst Pricing = ({ currency, language, onPlanSelect, onIntervalSelect }: Props) => {\n\tconst [selectedInterval, setSelectedInterval] = useState<PricingInterval>(\"annually\");\n\tconst { t } = useTranslation(language);\n\n\tconst plans: PlanType[] = [PlanType.APPETIZER, PlanType.MAIN_COURSE, PlanType.CHEFS_SPECIAL];\n\tconst intervals: Array<PricingInterval> = [\"annually\", \"monthly\"];\n\tconst actionTitle = onPlanSelect ? \"Choose Plan\" : \"Get Started\";\n\n\tconst handleSelectInterval = (interval: PricingInterval) => {\n\t\tsetSelectedInterval(interval);\n\t\tif (onIntervalSelect) {\n\t\t\tonIntervalSelect(interval);\n\t\t}\n\t};\n\n\tconst PlanParent = ({ children, plan }: { children: ReactNode; plan: PlanType }) => {\n\t\tif (onPlanSelect) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.plan}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tonPlanSelect(plan);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<a\n\t\t\t\tclassName={styles.plan}\n\t\t\t\thref={getRegisterUrl(language, `pricing-${plan}`)}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.intervals}>\n\t\t\t\t{intervals.map((interval) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={interval}\n\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\tinterval: true,\n\t\t\t\t\t\t\tactive: selectedInterval === interval,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonClick={() => handleSelectInterval(interval)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(interval)}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<div className={styles.plans}>\n\t\t\t\t{plans.map((plan) => (\n\t\t\t\t\t<PlanParent key={plan} plan={plan}>\n\t\t\t\t\t\t<Card>\n\t\t\t\t\t\t\t<div className={styles.title}>{PRICING[plan].title}</div>\n\t\t\t\t\t\t\t<div className={styles.price}>\n\t\t\t\t\t\t\t\t<PricingPlanAmount\n\t\t\t\t\t\t\t\t\tplan={plan}\n\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\tinterval={selectedInterval}\n\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={styles.action}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tlabel={t(actionTitle)}\n\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\t\ttype={\n\t\t\t\t\t\t\t\t\t\tplan === PlanType.MAIN_COURSE\n\t\t\t\t\t\t\t\t\t\t\t? UIElementType.PRIMARY\n\t\t\t\t\t\t\t\t\t\t\t: UIElementType.BORDERED_PRIMARY\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonClick={() => {}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={styles.benefits}>\n\t\t\t\t\t\t\t\t{PRICING_BENEFITS.map((benefit) => (\n\t\t\t\t\t\t\t\t\t<div key={benefit.title} className={styles.benefit}>\n\t\t\t\t\t\t\t\t\t\t<SVGIcon icon={benefit[plan] ? Check : Minus} size=\"md\" />{\" \"}\n\t\t\t\t\t\t\t\t\t\t<span>{t(benefit.title)}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Card>\n\t\t\t\t\t</PlanParent>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default Pricing;\n"],"names":["__rest","s","e","t","p","Object","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","apply","SuppressedError","IMAGE_BASE_URL","getImageSource","image","includes","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","CO_DOMAIN","DOMAINS","getRegisterUrl","language","source","tld","getTLD","StoreContext","createContext","StoreProvider","children","storeValue","isEmpty","currency","_jsx","Provider","useStoreContext","useContext","GOAL_BASE_NAME","CATEGORY_SELECTED","CATEGORY_SCROLLED","PRODUCT_DETAILS","PRODUCT_ADD_CART","PRODUCT_VIEW_CHANGED","GOALS","getCategoryTranslation","category","_b","_a","translations","find","item","Image","props","priority","_","blurDataURL","__","quality","___","placeholder","____","fetchPriority","_____","imgProps","imageTag","assign","r","g","b","Languages","languages","onLanguageSelect","isOptionsOpen","setIsOptionsOpen","useState","isBilingual","otherLanguages","filter","code","getFlag","className","styles","container","onClick","_jsxs","Row","alignItems","gap","classNames","options","isOpen","map","src","option","handleSelectLanguages","alt","currentLanguage","Header","branch","name","instagram","facebook","whatsapp","telegram","tiktok","address","latitude","longitude","phone","wifiPassword","noBranch","googleMapLink","width","height","sizes","loading","Column","fullWidth","fullHeight","justifyContent","Flex","direction","Item","shrink","href","target","rel","SVGIcon","icon","MarkerPin","theme","IconLink","Phone","size","shape","Whatsapp","Instagram","Telegram","Tiktok","Facebook","Tooltip","hint","Wifi","Categories","categoryProductMap","selectedCategoryId","onSelectCategory","categoryBlocksRef","useRef","carouselRef","useEffect","categoryBlock","current","carouselWidth","clientWidth","scrollLeft","offsetLeft","offsetWidth","scrollTo","left","behavior","scrollToCategoryBlock","Carousel","onGetRef","ref","id","CarouselItem","Chip","trackEvent","analyticsConstants.CATEGORY_SELECTED","handleSelectCategory","type","UIElementType","BORDERED_PRIMARY","active","el","calculateTotalPrice","price","quantity","vat","MenuAddonSelectType","getAddonTranslation","addon","getAddonOptionTranslation","getAddonOptionRawPrice","optionId","getProductTranslation","product","getProductRawPrice","getProductPrice","totalPrice","formattedTotalPrice","priceFormatter","getProductVariant","variantId","variants","getProductVariantRawPrice","variant","getProductVariantTranslation","getProductCartRawPrice","selectedAddons","noVat","optionsPrice","total","productData","selectedOptionsTotalPrice","addons","reduce","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getSelectedOptionsTotalPrice","ProductView","PlanType","getCartPrice","generateCartId","productId","Error","cartId","addonIdsPart","entries","optionIds","Array","isArray","Boolean","join","CartContext","cart","isCartOpen","addProduct","updateProduct","setIsCartOpen","removeAllProductVariants","CartProvider","setCart","updateCart","isAddOperation","currentCart","existingItem","newQuantity","updatedCart","acc","cartItem","contextValue","useMemo","useCartContext","en","az","Subtotal","Events","monthly","annually","tr","nl","et","ru","useTranslation","lang","locale","key","ProductsListItem","image160","volume","available","description","hasVariant","hasAddons","hasImage","isClickable","noImage","info","Text","color","notAvailableText","notAvailable","addToCart","IconButton","preventDefault","stopPropagation","analyticsConstants.PRODUCT_ADD_CART","Plus","DEFAULT","ProductsGridItem","image580","image1024","content","imageContainer","data","useTotalCartItemsCount","values","sum","Quantity","isDecreaseDisabled","onIncrease","onDecrease","quantityAction","isDisabled","Minus","quantityValue","ProductInCart","onModalClose","useProductQuantityInCartWithAllVariants","flex","Trash","DANGER","tooltip","ShoppingBag","SUCCESS","ProductVariants","selectedVariant","focusedSection","onSelectVariant","containerRef","isVariantsFocused","scrollIntoView","focused","variantsTitle","formattedTotalVariantPrice","getProductVariantPrice","title","Input","label","onChange","checked","InputType","RADIO","noMargin","variantPrice","ProductAddons","onOptionSelect","formattedTotalOptionPrice","getOptionPrice","optionTitle","isSingle","isRemove","CHECKBOX","optionPrice","ProductDetails","onClose","setQuantity","isUpdate","setIsUpdate","setSelectedVariant","setFocusedSection","setSelectedAddons","modalRef","productQuantityInCart","useProductQuantityInCart","formattedTotalCartPrice","getProductCartPrice","actionTitle","adjustQuantity","amount","Math","max","hasVariants","event","contains","Modal","noBodyPadding","details","choices","prevForm","previousSelection","updatedSelection","Set","close","Close","footer","Button","addAction","setTimeout","disabled","CartStepper","actionText","totalCount","cartTotalPrice","useCartTotalPrice","count","Cart","useProductById","products","ProductQuantity","min","useProductQuantity","GetCartItemOptionsInfo","getProductAddon","Number","optionTitles","addonTitle","CartItem","variantTitle","CartDrawer","contentRef","isCartEmpty","Drawer","noItems","Description","text","items","keys","PRIMARY","Products","memo","productBlocksRef","onCategoryInView","selectedProduct","setSelectedProduct","view","setView","LIST","views","List","Grid","GRID","handleSelectProduct","analyticsConstants.PRODUCT_DETAILS","observer","IntersectionObserver","viewportCenter","clientHeight","closestCategoryId","closestDistance","Infinity","forEach","entry","isIntersecting","rect","boundingClientRect","elementCenter","top","distanceToCenter","abs","getAttribute","threshold","categoryId","element","setAttribute","observe","disconnect","analyticsConstants.PRODUCT_VIEW_CHANGED","handleSelectView","categoryUtils.getCategoryTranslation","prevProps","nextProps","displayName","Branches","branches","rootPath","onBranchSelect","Parent","Container","Card","noBottomMargin","PublicMenu","branchId","categories","hostname","hasSingleBranch","productMap","visible","push","prepareCategoryAndProductMap","selectedBranch","getSelectedBranch","venueName","setSelectedCategoryId","canUserScroll","url","baseUrl","domain","getBaseUrl","productBlock","block","scrollToProductBlock","window","searchParams","URLSearchParams","location","search","categoryIdFromURL","get","categoryToSelect","selectCategoryFromURL","_Fragment","getCategoryNameById","analyticsConstants.CATEGORY_SCROLLED","PublicMenuWithContext","EventsToolbar","currentGoal","setGoal","closeDropdownRef","getGoalTitle","goal","handleChange","useCallback","DropDown","action","actionSize","closeRef","menu","toolbarMenu","analyticsConstants.GOALS","DropDownMenuItem","isLoading","loadingImage","toolbar","Loading","BarChart","PRICING","appetizer","mainCourse","chefsSpecial","PRICING_BENEFITS","APPETIZER","MAIN_COURSE","CHEFS_SPECIAL","PricingPlanAmount","plan","interval","discountedPrice","intervalPrice","undefined","originalPrice","Pricing","onPlanSelect","onIntervalSelect","selectedInterval","setSelectedInterval","plans","PlanParent","intervals","handleSelectInterval","benefits","benefit","Check"],"mappings":"+3BA0CO,SAASA,GAAOC,EAAGC,GACtB,IAAIC,EAAI,CAAA,EACR,IAAK,IAAIC,KAAKH,EAAOI,OAAOC,UAAUC,eAAeC,KAAKP,EAAGG,IAAMF,EAAEO,QAAQL,GAAK,IAC9ED,EAAEC,GAAKH,EAAEG,IACb,GAAS,MAALH,GAAqD,mBAAjCI,OAAOK,sBACtB,KAAIC,EAAI,EAAb,IAAgBP,EAAIC,OAAOK,sBAAsBT,GAAIU,EAAIP,EAAEQ,OAAQD,IAC3DT,EAAEO,QAAQL,EAAEO,IAAM,GAAKN,OAAOC,UAAUO,qBAAqBL,KAAKP,EAAGG,EAAEO,MACvER,EAAEC,EAAEO,IAAMV,EAAEG,EAAEO,IAF4B,CAItD,OAAOR,CACX,CA8DO,SAASW,GAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,GAAQ,CAAG,MAAOrB,GAAKmB,EAAOnB,GAAO,CAC3F,SAASwB,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAU,CAAC,MAAOrB,GAAKmB,EAAOnB,GAAO,CAC9F,SAASsB,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAO,KAIhBM,KAAKP,EAAWI,EAAY,CAC9GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAKS,OACtE,GACA,CA8MkD,mBAApBM,iBAAiCA,0ICxUxD,MAAMC,GAAiB,+BAEjBC,GAAkBC,GACzBA,EAEDA,EAAMC,SAAS,WAAaD,EAAME,WAAW,YAAoBF,EAE9D,GAAGF,MAAkBE,IAJT,GAOPG,GAAsBC,GAC7BA,EAEDA,EAAUH,SAAS,WAAaG,EAAUF,WAAW,YAAoBE,EAEtE,GAAGN,MAAkBM,IAJL,iDAOXC,GAAuBC,GAC9BA,EAEDA,EAAWL,SAAS,WAAaK,EAAWJ,WAAW,YAAoBI,EAExE,GAAGR,MAAkBQ,IAJJ,sDAOnBC,GAAS,oEAETC,GAAU,CAACC,EAAYC,EAAYC,IACxCJ,GAAOK,OAAOH,GAAM,GACpBF,GAAOK,QAAc,EAALH,IAAW,EAAMC,GAAM,GACvCH,GAAOK,QAAc,GAALF,IAAY,EAAMC,GAAM,GACxCJ,GAAOK,OAAY,GAALD,GChCFE,GAAY,gBAKZC,GAAU,CAACD,GAJC,gBACA,gBACA,iBCSZE,GAAiB,CAACC,EAAkBC,KAChD,MAAMC,EALe,CAACF,GACF,OAAbA,EAAoB,KAAO,KAItBG,CAAOH,GAEnB,MAAO,0BAA0BE,wBAA0BF,gBAAuBC,GAAQ,ECVrFG,GAAeC,EAA8B,IAKtCC,GAAgB,EAC5BC,WACAlC,YAKA,MAAMmC,EAAaC,EAAQpC,GAAU,CAAqB,EAAGA,EAI7D,OAHKmC,EAAWE,WAAUF,EAAWE,SAXb,OAYnBF,EAAWR,WAAUQ,EAAWR,SAXb,MAcvBW,EAACP,GAAaQ,UAASvC,MAAOoC,EAAQpC,GAAU,CAAA,EAAwBA,EACtEkC,SAAAA,GACsB,EAIbM,GAAkB,IAAMC,EAAWV,IC5B1CW,GAAiB,eAEVC,GAAoB,GAAGD,qBACvBE,GAAoB,GAAGF,qBACvBG,GAAkB,GAAGH,qBACrBI,GAAmB,GAAGJ,sBACtBK,GAAuB,GAAGL,0BAE1BM,GAAQ,CAACL,GAAmBC,GAAmBC,GAAiBC,ICJhEG,GAAyB,CACrCC,EACAvB,aAEA,OAAuC,QAA/BwB,EAAsB,QAAtBC,EAAAF,aAAQ,EAARA,EAAUG,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAACG,GAASA,EAAK5B,WAAaA,MAClE,CAAE,CAAA,oaCEJ,MAAM6B,GAASC,IACd,MACCC,SAAUC,EACVC,YAAaC,EACbC,QAASC,EACTC,YAAaC,EACbC,cAAeC,GAEZV,EADAW,EACA3F,GAAAgF,EAPE,CAAA,WAAA,cAAA,UAAA,cAAA,mBAQAY,SAAEA,GAAa7B,MAAqB,CAAE,EAE5C,GAAI6B,EAAU,CAGb,OACC/B,EAHwB+B,EAGZvF,OAAAwF,OAAA,CAAA,EACPb,EAAK,CACTK,QAASL,EAAMK,SAAW,IAC1BE,YAAY,OACZJ,aNIuBW,EMJC,INIUC,EMJL,GNIgBC,EMJZ,GNKpC,yCACCtD,GAAQ,EAAGoD,EAAGC,GAAKrD,GAAQsD,EAAG,IAAK,+CAFX,IAACF,EAAWC,EAAWC,EMChD,OAAOnC,EAAA,MAAAxD,OAAAwF,OAAA,CAAA,EAASF,GAAY,ynBC5B7B,MAAMM,GAAY,WACjB,MAAM/C,SAAEA,EAAQgD,UAAEA,EAASC,iBAAEA,GAAqBpC,MAC3CqC,EAAeC,GAAoBC,GAAS,GAE7CC,GAAcL,aAAA,EAAAA,EAAWtF,QAAS,EAClC4F,GAAkC,QAAjB7B,EAAAuB,aAAS,EAATA,EAAWO,cAAM,IAAA9B,OAAA,EAAAA,EAAAnE,KAAA0F,GAAG,EAAGQ,UAAWA,IAASxD,MAAa,GAEzEyD,EAAWD,GACT,0CAA0CA,QAOlD,OAAKH,EAGJ1C,EAAK,MAAA,CAAA+C,UAAWC,GAAOC,UAAWC,QAAS,IAAMV,GAAkBD,YAClEY,EAACC,EAAI,CAAAC,WAAW,SAASC,IAAK,YAC7BtD,EAACoD,GACAC,WAAW,SACXN,UAAWQ,EAAWP,GAAQ,CAC7BQ,SAAS,EACTC,OAAQlB,IAGR3C,SAAA+C,EAAee,KAAI,EAAGb,UACtB7C,SACC2D,IAAKb,EAAQD,GACbE,UAAWC,GAAOY,OAElBV,QAAS,IArBe,CAACL,IAC1BP,GAAkBA,EAAiBO,EAAK,EAoBxBgB,CAAsBhB,GACrCiB,IAAKjB,GAFAA,OAMR7C,EAAA,MAAA,CAAK2D,IAAKb,EAAQzD,GAAWyE,IAAKzE,GAAY,GAAI0D,UAAWC,GAAOe,uBAtB9C,IAwBlB,ECTFC,GAAS,EACdC,SACAtF,aACAF,YACAyF,OACAC,YACAC,WACAC,WACAC,WACAC,aAEA,MAAMC,QAAEA,EAAOC,SAAEA,EAAQC,UAAEA,EAASC,MAAEA,EAAKC,aAAEA,GAAiBX,GAAU,CAAE,EACpEY,EAAW/E,EAAQmE,GAEnBa,EAAgB,qCAAqCL,KAAYC,IAoCvE,OACCvB,EAAK,MAAA,CAAAJ,UAAWC,GACfpD,SAAA,CAAAI,EAACkB,GACA,CAAAyC,IAAKhF,EACLmF,IAAKI,EACLnB,UAAWC,GACX+B,MAAO,KACPC,OAAQ,IACR5D,UAAQ,EACR6D,MAAM,QACNrD,cAAc,OACdsD,QAAQ,UAETlF,EAAA,MAAA,CAAK+C,UAAWC,GAAcpD,SAAcI,EAAX6E,EAtBd,IACpB1B,EAACgC,EAAO,CAAAC,WAAU,EAAAC,cAAWhC,WAAW,SAASiC,eAAe,SAAQ1F,SAAA,CACvEI,EAACkB,GAAK,CAACyC,IAAKlF,EAAWqF,IAAKI,EAAMnB,UAAWC,GAAa+B,MAAO,GAAIC,OAAQ,KAC7EhF,SAAK+C,UAAWC,GAAWpD,SAC1BI,EAAI,KAAA,CAAA+C,UAAWC,GAAWpD,SAAGsE,SA7Bb,IAClBf,EAACoC,EAAI,CAACC,UAAU,MAAMlC,IAAK,EAAGD,WAAW,SAAS+B,uBACjDpF,EAACuF,EAAKE,KACL,CAAA7F,SAAAI,EAACkB,GAAK,CAACyC,IAAKlF,EAAWqF,IAAKI,EAAMnB,UAAWC,GAAa+B,MAAO,GAAIC,OAAQ,OAE9EhF,EAACuF,EAAKE,KAAK,CAAAC,QAAO,EAAA3C,UAAWC,GAAWpD,SACvCuD,EAACgC,EAAM,CAAC7B,IAAK,IAAI1D,SAAA,CAChBI,EAAI,KAAA,CAAA+C,UAAWC,GAAWpD,SAAGsE,IAE7BlE,EAAA,IAAA,CACC+C,UAAWC,GACX2C,KAAMb,EACNc,OAAO,SACPC,IAAI,sBAAqBjG,SAEzBuD,EAACC,EAAG,CAACC,WAAW,SAASC,IAAK,GAC7B1D,SAAA,CAAAI,EAAC8F,EAAO,CAACC,KAAMC,EAAWC,MAAM,SAChCjG,EAAM,OAAA,CAAA+C,UAAWC,GAAkBpD,SAAG4E,uBA+B1CxE,EAACoC,GAAS,CAAA,IACRyC,GACD7E,EAAA,MAAA,CAAK+C,UAAWC,GAAapD,SAC5BI,SAAK+C,UAAWC,GACfpD,SAAAI,EAACoD,EAAI,CAAAE,IAAK,EAAGD,WAAW,kBACvBF,EAACC,GAAIC,WAAW,SAASiC,eAAe,SAAShC,IAAK,GACpD1D,SAAA,GAAE+E,GACF3E,EAACkG,GACAH,KAAMI,EACNR,KAAM,QAAQhB,IACdyB,KAAK,KACLC,MAAM,SACNJ,MAAM,YAGL5B,GACFrE,EAACkG,GACAH,KAAMO,EACNX,KAAM,iBAAiBtB,IACvB+B,KAAK,KACLC,MAAM,SACNJ,MAAM,QACNL,OAAO,aAGNzB,GACFnE,EAACkG,EACA,CAAAH,KAAMQ,EACNZ,KAAMxB,EACNiC,KAAK,KACLC,MAAM,SACNJ,MAAM,QACNL,OAAO,aAGNtB,GACFtE,EAACkG,GACAH,KAAMS,EACNb,KAAMrB,EACN8B,KAAK,KACLC,MAAM,SACNJ,MAAM,QACNL,OAAO,aAGNrB,GACFvE,EAACkG,EAAQ,CACRH,KAAMU,EACNd,KAAMpB,EACN6B,KAAK,KACLC,MAAM,SACNJ,MAAM,QACNL,OAAO,aAGNxB,GACFpE,EAACkG,EACA,CAAAH,KAAMW,EACNf,KAAMvB,EACNgC,KAAK,KACLC,MAAM,SACNJ,MAAM,QACNL,OAAO,aAGNhB,GACF5E,EAAC2G,EAAQ,CAAAC,KAAMhC,EAAYhF,SAC1BI,SAAK+C,UAAWC,YACfhD,EAAC8F,GAAQC,KAAMc,EAAMT,KAAK,KAAKrD,UAAWC,oBAS7C,EClKF8D,GAAa,EAClBC,qBAAqB,GACrB1H,WACA2H,qBACAC,uBAEA,MAAMC,EAAoBC,EAAsB,IAC1CC,EAAcD,EAAuB,MA8B3C,OAJAE,GAAU,KACLL,GAzByB,YAC7B,MAAMM,EAA6C,QAA7BxG,EAAAoG,aAAA,EAAAA,EAAmBK,eAAU,IAAAzG,OAAA,EAAAA,EAAAkG,GACnD,IAAKM,IAAkBF,EAAYG,QAAS,OAE5C,MAAMC,EAAgBJ,EAAYG,QAAQE,YAIpCC,EAHeJ,EAAcK,WAGDH,EAAgB,EAF5BF,EAAcM,YAEkC,EACtER,EAAYG,QAAQM,SAAS,CAAEC,KAAMJ,EAAYK,SAAU,UAAW,EAgB9CC,EAAuB,GAC7C,CAAChB,IAGHhH,EAAA,MAAA,CAAK+C,UAAWC,GACfpD,SAAAI,EAACiI,EAAS,CAAA3E,IAAK,EAAG4E,SAXUC,KACxBA,aAAA,EAAAA,EAAKZ,WACVH,EAAYG,QAAUY,EAAIZ,QAAO,EASgB3H,UAC7CmH,GAAsB,IAAIrD,KAAI,EAAG0E,KAAIrH,mBACtC,MAAMmD,KAAEA,GAASnD,EAAaC,MAAMC,GAASA,EAAK5B,WAAaA,KAAa,CAAE,EAE9E,OACCW,EAACqI,EACA,CAAAzI,SAAAI,EAACsI,EACA,CAAApF,QAAS,IAzBa,EAACkF,EAAYlE,KACrCkE,IAAOpB,IAEXuB,EAAWC,GAAsC,CAAEtE,SACnD+C,EAAiBmB,GAAG,EAqBCK,CAAqBL,EAAIlE,GACxCwE,KAAMC,EAAcC,iBACpBC,OAAQT,IAAOpB,WAEfhH,EACC,MAAA,CAAAmI,IAAMW,IACDA,IAAI5B,EAAkBK,QAAQa,GAAMU,EAAE,EAC1ClJ,SAEAsE,OAXekE,EAcJ,OAIb,wLC9ED,MAAMW,GAAsB,CAACC,EAAgB,EAAGC,EAAmB,EAAGC,EAAc,IACnFF,EAAQC,GAAY,EAAIC,EAAM,KCDtC,IAAYC,IAAZ,SAAYA,GACXA,EAAA,OAAA,SACAA,EAAA,SAAA,UACA,CAHD,CAAYA,KAAAA,GAGX,CAAA,ICMM,MAAMC,GAAsB,CAACC,EAAkBhK,aACrD,OAAoC,QAA5BwB,EAAmB,QAAnBC,EAAAuI,aAAK,EAALA,EAAOtI,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAACG,GAASA,EAAK5B,WAAaA,MAC/D,CAAE,CAAA,EAGSiK,GAA4B,CACxC1F,EACAvE,aAEA,OAAqC,QAA7BwB,EAAoB,QAApBC,EAAA8C,aAAM,EAANA,EAAQ7C,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAACG,GAASA,EAAK5B,WAAaA,MAChE,CAAE,CAAA,EAoBSkK,GAAyB,CAACF,EAAkBG,WACxD,OAA+D,QAAxD1I,IAACuI,aAAA,EAAAA,EAAO7F,UAAW,IAAIxC,MAAK,EAAGoH,QAASA,IAAOoB,WAAS,IAAA1I,OAAA,EAAAA,EAAEkI,QAAS,CAAC,EC1B/DS,GAAwB,CAACC,EAAkBrK,aACvD,OAAsC,QAA9BwB,EAAqB,QAArBC,EAAA4I,aAAO,EAAPA,EAAS3I,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAACG,GAASA,EAAK5B,WAAaA,MACjE,CAAE,CAAA,EAGSsK,GAAqB,CAACD,EAAkBT,EAAmB,KACvE,MAAMD,MAAEA,EAAQ,EAACE,IAAEA,EAAM,GAAMQ,GAAW,CAAE,EAC5C,OAAOX,GAAoBC,EAAOC,EAAUC,EAAI,EAGpCU,GAAkB,CAC9BF,EACA3J,EACAV,EACA4J,EAAmB,KAEnB,MAAMY,EAAaF,GAAmBD,EAAST,GAE/C,MAAO,CACNY,WAAYA,EACZC,oBAAqBC,EAAeF,EAAY9J,EAAUV,GAC1D,EAGW2K,GAAoB,CAACN,EAAkBO,aACnD,OAA8B,QAAvBpJ,EAAiB,QAAjBC,EAAA4I,aAAO,EAAPA,EAASQ,gBAAQ,IAAApJ,OAAA,EAAAA,EAAEE,YAAI,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAAIG,GAASA,EAAKmH,KAAO6B,MAAe,CAAqB,CAAA,EAoC/EE,GAA4B,CACxCF,EACAP,EACAT,KAEA,MAAMmB,EAAUJ,GAAkBN,EAASO,IACrCf,IAAEA,GAAQQ,GAAW,CAAE,GACvBV,MAAEA,GAAUoB,GAAW,CAAE,EAC/B,OAAOrB,GAAoBC,EAAOC,EAAUC,EAAI,EAwBpCmB,GAA+B,CAC3CD,EACA/K,aAEA,OAAsC,QAA9BwB,EAAqB,QAArBC,EAAAsJ,aAAO,EAAPA,EAASrJ,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAlE,KAAAmE,GAACG,GAASA,EAAK5B,WAAaA,MACjE,CAAE,CAAA,EAGSiL,GAAyB,EACrCZ,UACAO,YACAhB,WAAW,EACXsB,iBACAC,SAAQ,MAQR,GAAI1K,EAAQ4J,GAAU,MAAO,CAAEV,MAAO,EAAGyB,aAAc,EAAGC,MAAO,GAEjE,MAAMC,EAA4BnO,OAAAwF,OAAAxF,OAAAwF,OAAA,CAAA,EAAA0H,IAASR,IAAKsB,EAAQ,EAAId,EAAQR,MAC9D0B,EAzFqC,EAC3ClB,EACAa,EAAiC,CAAA,EACjCtB,MAG4BS,aAAO,EAAPA,EAASmB,SAAU,IAAIjI,QAAQyG,GAC1D7M,OAAOC,UAAUC,eAAeC,KAAK4N,EAAgBlB,EAAMjB,MAIf0C,QAAO,CAACJ,EAAerB,KACnE,MAAQjB,GAAI2C,EAAOC,WAAEA,GAAe3B,EAGpC,GAAI2B,IAAe7B,GAAoB8B,OAAQ,CAC9C,MAAMC,EAAmBX,EAAeQ,GACxC,OAAOL,EAAQnB,GAAuBF,EAAO6B,GAU9C,OAAOR,GANoBH,EAAeQ,IAAY,IACPD,QAC9C,CAACK,EAAe3B,IAAa2B,EAAgB5B,GAAuBF,EAAOG,IAC3E,EAGkC,GACjC,GAEwBP,EA2DOmC,CACjCT,EACAJ,EACAtB,GAEKD,EAAQiB,EACXE,GAA0BF,EAAWU,EAAa1B,GAClDU,GAAmBgB,EAAa1B,GAEnC,MAAO,CACND,QACAyB,aAAcG,EACdF,MAAO1B,EAAQ4B,EACf,ECxGF,IAAYS,GCxCAC,IDwCZ,SAAYD,GACXA,EAAA,KAAA,OACAA,EAAA,KAAA,MACA,CAHD,CAAYA,KAAAA,GAGX,CAAA,IC3CD,SAAYC,GACXA,EAAA,UAAA,YACAA,EAAA,YAAA,aACAA,EAAA,cAAA,cACA,CAJD,CAAYA,KAAAA,GAIX,CAAA,ICGM,MAAMC,GAAe,CAACtK,EAAgBlB,EAAmB,MAAOV,EAAmB,QACzF,MAAM2J,MAAEA,EAAKE,IAAEA,EAAGD,SAAEA,EAAQwB,aAAEA,GAAiBxJ,GAAQ,CAAE,EAEnD4I,EADed,GAAoBC,EAAOC,EAAUC,GACxBuB,EAAexB,EAEjD,MAAO,CACNY,WAAYA,EACZC,oBAAqBC,EAAeF,EAAY9J,EAAUV,GAC1D,EAGWmM,GAAiB,CAC7BC,EACAxB,EACAM,KAEA,IAAKkB,EAAW,MAAM,IAAIC,MAAM,0BAGhC,IAAIC,EAAS,GAAGF,IACZxB,IACH0B,GAAU,IAAI1B,KAIf,MAAM2B,EAAepP,OAAOqP,QAAQtB,GAAkB,CAAE,GACtD7G,KAAI,EAAEqH,EAASnH,MACf,IAAKmH,IAAYnH,EAAQ,OAAO,KAChC,MAAMkI,EAAYC,MAAMC,QAAQpI,GAAUA,EAAOhB,OAAOqJ,SAASC,KAAK,KAAO,GAAGtI,IAChF,OAAKkI,EACE,GAAGf,KAAWe,IADE,IACS,IAEhClJ,OAAOqJ,SACPC,KAAK,KAOP,OAJIN,IACHD,GAAU,IAAIC,KAGRD,CAAM,ECtBRQ,GAAczM,EAA2B,CAC9C0M,KAAM,CAAE,EACRC,YAAY,EACZC,WAAY,OACZC,cAAe,OACfC,cAAe,OACfC,yBAA0B,SAGdC,GAAe,EAAG9M,eAC9B,MAAOwM,EAAMO,GAAWlK,EAAe,CAAA,IAChC4J,EAAYG,GAAiB/J,GAAkB,GAEhDmK,EAAa,EAClBlD,UACAT,WACA4D,iBACA5C,YACAM,qBAEA,GAAIzK,EAAQ4J,IAAYT,EAAW,EAAG,OAEtC,MAAMb,GAAEA,EAAEc,IAAEA,EAAM,GAAMQ,EAClBiC,EAASH,GAAepD,EAAI6B,EAAWM,IACvCvB,MAAEA,EAAKyB,aAAEA,GAAiBH,GAAuB,CACtDZ,UACAO,YACAhB,SAAU,EACVsB,iBACAC,OAAO,IAGRmC,GAASG,IACR,MAAMC,EAAeD,EAAYnB,GAC3BqB,EAAcH,IAAkBE,aAAY,EAAZA,EAAc9D,WAAY,GAAKA,EAAWA,EAGhF,GAAI+D,GAAe,EAAG,CACrB,MAA0ClM,EAAAgM,EAAlCjM,EAAC8K,EAAU7K,EAAAD,GACnB,OADM1E,GAAA2E,EAAA,CAAA,iBAAAD,EAAAA,EAAAA,EAAA,KAKP,OAAArE,OAAAwF,OAAAxF,OAAAwF,OAAA,CAAA,EACI8K,GAAW,CACdnB,CAACA,GAAS,CACTF,UAAWrD,EACXY,QACAyB,eACAxB,SAAU+D,EACV9D,MACAe,YACAM,mBAEA,GACD,EAGG+B,EAAa,EAClB5C,UACAT,WAAW,EACXgB,YACAM,oBAEOqC,EAAW,CAAElD,UAAST,WAAUgB,YAAWM,iBAAgBsC,gBAAgB,IAG7EN,EAAgB,EACrB7C,UACAT,WAAW,EACXgB,YACAM,oBAEOqC,EAAW,CAAElD,UAAST,WAAUgB,YAAWM,iBAAgBsC,gBAAgB,IAG7EJ,EAA4BhB,IACjC,IAAKA,GAAa3L,EAAQsM,GAAO,OAGjC,MAAMa,EAAczQ,OAAOqP,QAAQO,GAAMtB,QAAO,CAACoC,GAAMvB,EAAQwB,MAC1DA,EAAS1B,YAAcA,IAC1ByB,EAAIvB,GAAUwB,GAERD,IACL,IAGHP,EAAQM,EAAY,EAGfG,EAAeC,GACpB,KAAO,CACNjB,OACAC,aACAC,aACAC,gBACAC,gBACAC,8BAED,CAACL,EAAMC,IAGR,OAAOrM,EAACmM,GAAYlM,SAAQ,CAACvC,MAAO0P,EAAYxN,SAAGA,GAAgC,EAGvE0N,GAAiB,IAAMnN,EAAWgM,y8BCnIxC,MAAMpL,GAAe,CAC3BwM,GAAQ,CAAE,EACVC,GAAQ,CACP,aAAc,kBACd,oBAAqB,iBACrB,eAAgB,kBAChB,eAAgB,oBAChB,aAAc,cACdC,SAAU,QACV,cAAe,cACf,yCAA0C,sCAC1C,YAAa,kBACbC,OAAQ,aACR,uBAAwB,0BACxB,oBAAqB,qBACrB,kBAAmB,0BACnB,wBAAyB,sBACzB,kBAAmB,WACnB,WAAY,YACZ,gBAAiB,eAEjB,cAAe,aACf,cAAe,cACf,gBAAiB,kBACjB,cAAe,gBACf,iBAAkB,oBAClB,qBAAsB,kBACtB,uBAAwB,sBACxB,mBAAoB,qBACpB,kBAAmB,mBACnB,gBAAiB,iBACjB,eAAgB,cAChB,oBAAqB,UACrB,mBAAoB,8BACpB,mBAAoB,2BACpB,gCAAiC,6CACjC,sBAAuB,YACvB,sBAAuB,iCACvB,oCAAqC,2CACrC,4BAA6B,2BAC7B,mBAAoB,sBACpB,kBAAmB,sBACnB,UAAW,OACXC,QAAS,aACTC,SAAU,aACV,kEACC,+DACD,mHACC,iHAEFC,GAAQ,CACP,aAAc,qBACd,oBAAqB,oBACrB,eAAgB,oBAChB,eAAgB,gBAChB,aAAc,cACd,cAAe,cACf,yCAA0C,iCAC1C,YAAa,YACbJ,SAAU,SACVC,OAAQ,UACR,kBAAmB,aACnB,WAAY,YACZ,gBAAiB,eAEjB,cAAe,cACf,cAAe,cACf,gBAAiB,iBACjB,cAAe,gBACf,iBAAkB,iBAClB,kBAAmB,qBACnB,qBAAsB,gBACtB,uBAAwB,oBACxB,mBAAoB,iBACpB,kBAAmB,mBACnB,gBAAiB,eACjB,eAAgB,qBAChB,oBAAqB,gBACrB,mBAAoB,gBACpB,mBAAoB,mBACpB,gCAAiC,yCACjC,sBAAuB,sBACvB,sBAAuB,yBACvB,oCAAqC,wCACrC,4BAA6B,0BAC7B,mBAAoB,oBACpB,UAAW,OACXC,QAAS,QACTC,SAAU,SACV,mHACC,0HACD,kEACC,gFAEFE,GAAQ,CACP,aAAc,sBACd,oBAAqB,6BACrB,eAAgB,uBAChB,eAAgB,2BAChB,aAAc,gBACd,cAAe,kBACf,yCAA0C,sCAC1C,YAAa,kBACbL,SAAU,SACVC,OAAQ,iBACR,kBAAmB,gBACnB,WAAY,gBACZ,gBAAiB,mBAEjB,cAAe,WACf,cAAe,gBACf,gBAAiB,iBACjB,cAAe,cACf,iBAAkB,eAClB,qBAAsB,uBACtB,uBAAwB,yBACxB,kBAAmB,wBACnB,mBAAoB,mBACpB,kBAAmB,gBACnB,gBAAiB,mBACjB,eAAgB,qBAChB,oBAAqB,uBACrB,mBAAoB,cACpB,mBAAoB,cACpB,gCAAiC,0CACjC,sBAAuB,qBACvB,sBAAuB,kBACvB,oCAAqC,yBACrC,4BAA6B,2BAC7B,mBAAoB,yBACpB,UAAW,UACXC,QAAS,cACTC,SAAU,YACV,mHACC,uIACD,kEACC,8EAEFG,GAAQ,CACP,aAAc,kBACd,oBAAqB,sBACrB,eAAgB,mBAChB,eAAgB,mBAChB,aAAc,gBACd,cAAe,gBACf,yCAA0C,mCAC1C,YAAa,eACbN,SAAU,QACVC,OAAQ,YACR,kBAAmB,eACnB,WAAY,aACZ,gBAAiB,kBAEjB,cAAe,WACf,cAAe,aACf,gBAAiB,mBACjB,cAAe,cACf,iBAAkB,mBAClB,qBAAsB,mBACtB,uBAAwB,wBACxB,mBAAoB,iBACpB,kBAAmB,gBACnB,gBAAiB,gBACjB,eAAgB,YAChB,oBAAqB,gBACrB,mBAAoB,qBACpB,mBAAoB,uBACpB,gCAAiC,2CACjC,sBAAuB,mBACvB,sBAAuB,iBACvB,oCAAqC,yCACrC,4BAA6B,+BAC7B,mBAAoB,sBACpB,kBAAmB,2BACnB,UAAW,SACXC,QAAS,WACTC,SAAU,cACV,kEACC,uEACD,mHACC,2HAEFI,GAAQ,CACP,aAAc,mBACd,oBAAqB,oBACrB,eAAgB,iBAChB,eAAgB,mBAChB,aAAc,YACd,cAAe,eACf,yCAA0C,6BAC1C,YAAa,kBACbP,SAAU,QACVC,OAAQ,UACR,kBAAmB,kBACnB,WAAY,WACZ,gBAAiB,cAEjB,cAAe,SACf,cAAe,gBACf,gBAAiB,wBACjB,cAAe,eACf,iBAAkB,iBAClB,kBAAmB,8BACnB,qBAAsB,0BACtB,uBAAwB,2BACxB,mBAAoB,qBACpB,kBAAmB,wBACnB,gBAAiB,oBACjB,eAAgB,6BAChB,oBAAqB,yBACrB,mBAAoB,qBACpB,mBAAoB,sBACpB,gCAAiC,kDACjC,sBAAuB,YACvB,sBAAuB,uBACvB,oCAAqC,wCACrC,4BAA6B,+BAC7B,mBAAoB,2BACpB,UAAW,UACXC,QAAS,mBACTC,SAAU,eACV,kEACC,kEACD,mHACC,+IC7NUK,GAAkBC,IAC9B,MAAM7O,SAAEA,GAAaa,KACfiO,EAASD,GAAQ7O,EAIvB,MAAO,CAAE/C,EAFE8R,IAAe,IAAAtN,EAAC,OAAuB,QAAvBA,EAAAC,GAAaoN,UAAU,IAAArN,OAAA,EAAAA,EAAAsN,KAAQA,CAAG,EAEjD,ECcPC,GAAmB,EAAG3E,UAAS3J,WAAUV,WAAU6D,sBACxD,MAAMoJ,WAAEA,GAAegB,MACjBgB,SAAEA,EAAQC,OAAEA,EAAMC,UAAEA,GAAc9E,GAAW,CAAE,GAC/CxF,KAAEA,EAAIuK,YAAEA,GAAgBpB,GAC7B,IAAM5D,GAAsBC,EAASrK,IACrC,CAACqK,EAASrK,KAELyK,oBAAEA,GAAwBuD,GAC/B,IAAMzD,GAAgBF,EAAS3J,EAAUV,IACzC,CAACqK,EAAS3J,EAAUV,KAEf/C,EAAEA,GAAM2R,KAERS,GAA8B,QAAjB5N,EAAA4I,aAAA,EAAAA,EAASQ,gBAAQ,IAAApJ,OAAA,EAAAA,EAAE/D,QAAS,EACzC4R,GAA2B,QAAf9N,EAAA6I,aAAA,EAAAA,EAASmB,cAAM,IAAAhK,OAAA,EAAAA,EAAE9D,QAAS,EACtC6R,IAAaN,EAYnB,OACCnL,EACC,MAAA,CAAAJ,UAAWQ,EAAWP,GAAQ,CAC7BC,WAAW,EACX4L,cAAe3L,EACf4L,SAAUF,IAEX1L,QAASA,YAETC,EAACC,EAAI,CAAAkC,eAAe,gBAAgBhC,IAAK,EAAC1D,SAAA,CACzCI,EAAK,MAAA,CAAA+C,UAAWC,GAAO+L,cACtB5L,EAACgC,EAAO,CAAA7B,IAAK,IACZ1D,SAAA,CAAAI,EAAA,KAAA,CAAI+C,UAAWC,GAAOkB,KAAOtE,SAAAsE,IAC7BlE,OAAG+C,UAAWC,GAAOyL,YAAW7O,SAAG6O,IACnCtL,EAACC,EAAI,CAAAL,UAAWC,GAAOgG,MAAO1F,IAAK,GAAK8B,WAAU,EAAAE,eAAe,0BAChEtF,EAAO,OAAA,CAAAJ,SAAAkK,MACJyE,GAAUvO,EAACgP,EAAI,CAACC,MAAM,QAAOrP,SAAE2O,QAEjCC,GACDxO,EAACgP,EAAI,CAAC5I,KAAK,KAAK6I,MAAM,SAASlM,UAAWC,GAAOkM,iBAAgBtP,SAC/DtD,EAAE,wBAKNsS,GACA5O,EAACkB,GACA,CAAAyC,IAAKvF,GAAekQ,GACpBxK,IAAKI,GAAQ,OACbnB,UAAWQ,EAAWP,GAAQ,CAC7B3E,OAAO,EACP8Q,cAAeX,IAEhBtJ,QAAQ,OACRH,MAAO,IACPC,OAAQ,QAIVwJ,GACAxO,EAAK,MAAA,CAAA+C,UAAWC,GAAOoM,UAASxP,SAC/BI,EAACqP,EAAU,CAACnM,QAnDS7G,IAIxB,GAHAA,EAAEiT,iBACFjT,EAAEkT,mBAEGb,GAAcC,IAAczL,EAAS,OAAOA,IAEjDoJ,EAAW,CAAE5C,YACbnB,EAAWiH,GAAqC,CAAEtL,OAAM+E,SAAU,GAAI,EA4C7BlD,KAAM0J,EAAM/G,KAAMC,EAAc+G,cAGnE,ipCCvER,MAAMC,GAAmB,EAAGjG,UAAS3J,WAAUV,WAAU6D,sBACxD,MAAMoJ,WAAEA,GAAegB,MACjBiB,OAAEA,EAAMqB,SAAEA,EAAQtB,SAAEA,EAAQuB,UAAEA,EAASrB,UAAEA,GAAc9E,GAAW,CAAE,EACpErL,EAAQuR,GAAYC,GAAavB,GACjCpK,KAAEA,EAAIuK,YAAEA,GAAgBpB,GAC7B,IAAM5D,GAAsBC,EAASrK,IACrC,CAACqK,EAASrK,KAELyK,oBAAEA,GAAwBuD,GAC/B,IAAMzD,GAAgBF,EAAS3J,EAAUV,IACzC,CAACqK,EAAS3J,EAAUV,KAEf/C,EAAEA,GAAM2R,KAERS,GAA8B,QAAjB5N,EAAA4I,aAAA,EAAAA,EAASQ,gBAAQ,IAAApJ,OAAA,EAAAA,EAAE/D,QAAS,EACzC4R,GAA2B,QAAf9N,EAAA6I,aAAA,EAAAA,EAASmB,cAAM,IAAAhK,OAAA,EAAAA,EAAE9D,QAAS,EAY5C,OACCiD,EAAA,MAAA,CAAK+C,UAAWC,GAAOC,UACtBrD,SAAAuD,EAAA,MAAA,CACCJ,UAAWQ,EAAWP,GAAQ,CAC7B8M,SAAS,EACTjB,cAAe3L,EACf4L,SAAUzQ,IAEX6E,QAASA,EAAOtD,SAAA,CAEfvB,GACA2B,EAAK,MAAA,CAAA+C,UAAWC,GAAO+M,eAAcnQ,SACpCI,EAACkB,GAAK,CACLyC,IAAKvF,GAAeC,GACpByF,IAAKI,GAAQ,OACbnB,UAAWQ,EAAWP,GAAQ,CAC7B3E,OAAO,EACP8Q,cAAeX,IAEhBtJ,QAAQ,OACRH,MAAO,IACPC,OAAQ,QAIXhF,SAAK+C,UAAWC,GAAO+L,KACtBnP,SAAAI,EAAA,MAAA,CAAK+C,UAAWC,GAAOgN,KACtBpQ,SAAAuD,EAACgC,EAAO,CAAA7B,IAAK,IAAI1D,SAAA,CAChBI,QAAI+C,UAAWC,GAAOkB,KAAOtE,SAAAsE,IAC7BlE,OAAG+C,UAAWC,GAAOyL,YAAc7O,SAAA6O,IAEnCtL,EAACC,EAAI,CAAAL,UAAWC,GAAOgG,MAAO1F,IAAK,GAAK8B,WAAS,EAACE,eAAe,gBAChE1F,SAAA,CAAAI,EAAA,OAAA,CAAAJ,SAAOkK,MACJyE,GACFvO,EAACgP,EAAI,CAACC,MAAM,QAAQlM,UAAWC,GAAOuL,OAAM3O,SAC1C2O,QAIFC,GACDxO,EAACgP,EAAK,CAAAC,MAAM,QAAQ7I,KAAK,KAAKrD,UAAWC,GAAOkM,iBAC9CtP,SAAAtD,EAAE,0BAMPkS,GACAxO,SAAK+C,UAAWC,GAAOoM,mBACtBpP,EAACqP,EAAW,CAAAnM,QA3DQ7G,IAIxB,GAHAA,EAAEiT,iBACFjT,EAAEkT,mBAEGb,GAAcC,IAAczL,EAAS,OAAOA,IAEjDoJ,EAAW,CAAE5C,YACbnB,EAAWiH,GAAqC,CAAEtL,OAAM+E,SAAU,GAAI,EAoD5BlD,KAAM0J,EAAM/G,KAAMC,EAAc+G,gBAIpE,mkBC/FD,MAAMO,GAAyB,KACrC,MAAM7D,KAAEA,GAASkB,KAEjB,OAAO9Q,OAAO0T,OAAO9D,GAAQ,CAAA,GAAItB,QAAO,CAACqF,EAAKlP,IAASkP,EAAMlP,EAAKgI,UAAU,EAAE,orBCG/E,MAAMmH,GAAW,EAChBC,sBAAqB,EACrBpH,WAAW,EACX7C,OAAO,KACPkK,aACAC,gBAGCpN,EAACC,EAAG,CACHL,UAAWQ,EACVP,GACA,CACCC,WAAW,GAEZ,CAACD,GAAOoD,KAETd,eAAe,gBACfhC,IAAK,EAEL1D,SAAA,CAAAI,EAAA,MAAA,CACC+C,UAAWQ,EAAWP,GAAQ,CAC7BwN,gBAAgB,EAChBC,WAAYJ,IAEbnN,QAASqN,WAETvQ,EAAC8F,GAAQC,KAAM2K,MAEhB1Q,EAAK,MAAA,CAAA+C,UAAWC,GAAO2N,cAAgB/Q,SAAAqJ,IACvCjJ,EAAA,MAAA,CAAK+C,UAAWC,GAAOwN,eAAgBtN,QAASoN,WAC/CtQ,EAAC8F,GAAQC,KAAM0J,+FC9BnB,MAAMmB,GAAgB,EAAGnF,YAAWoF,mBACnC,MAAMrE,cAAEA,EAAaC,yBAAEA,GAA6Ba,MAC9ChR,EAAEA,GAAM2R,KACRhF,EF6BgD,CAACwC,IACvD,MAAMW,KAAEA,GAASkB,KACjB,OAAIxN,EAAQsM,KAAUX,EAAkB,EAGtBjP,OAAO0T,OAAO9D,GAAMxJ,QAAQ3B,GAASA,EAAKwK,YAAcA,IAG1CX,QAAO,CAACqF,EAAKlP,IAASkP,EAAMlP,EAAKgI,UAAU,EAEvD,EEvCH6H,CAAwCrF,GAWzD,OAAIxC,GAAY,EAAU,KAGzB9F,EAACoC,EAAK,CAAAxC,UAAWC,GAAkBoC,WAAS,EAACE,eAAe,gBAAgBjC,WAAW,mBACtFF,EAACoC,EAAKE,KAAK,CAAAsL,KAAM,EAAGhO,UAAWC,GAC7BpD,SAAA,CAAAtD,EAAE,YAAW,KAAI2M,EACP,OAEZjJ,EAACuF,EAAKE,MAAKsL,KAAM,EAACnR,SACjBuD,EAACC,aACApD,EAACqP,EACA,CAAAtJ,KAAMiL,EACN9N,QAhB2B,KAC/BuJ,EAAyBhB,EAAU,EAgB/B/C,KAAMC,EAAcsI,OACpBC,QAAS5U,EAAE,uBAEZ0D,EAACqP,GACAtJ,KAAMoL,EACNjO,QA3BkB,KACtBsJ,GAAc,GACVqE,GAAcA,GAAc,EA0B5BnI,KAAMC,EAAcyI,QACpBF,QAAS5U,EAAE,uBAIR,upBClCT,MAAM+U,GAAkB,EAAG3H,UAAS4H,kBAAiBC,iBAAgBC,sBACpE,MAAMnS,SAAEA,EAAQU,SAAEA,GAAaG,MACzB5D,EAAEA,GAAM2R,KACRwD,EAAetK,EAAuB,OAEtC+C,SAAEA,GAAaR,GAAW,CAAE,EAE5BgI,EAAuC,YAAnBH,EAQ1B,OANAlK,GAAU,KACLqK,GAAqBD,EAAalK,SACrCkK,EAAalK,QAAQoK,eAAe,CAAE5J,SAAU,aAE/C,CAACwJ,IAGHpO,EAACgC,EAAM,CACNpC,UAAWQ,EAAWP,GAAQ,CAC7BC,WAAW,EACX2O,QAASF,IAEVpO,IAAK,EACL8B,WAAS,EAAAxF,SAAA,CAETI,EAAK,MAAA,CAAA+C,UAAWC,GAAO6O,cAAe1J,IAAKsJ,EACzC7R,SAAAtD,EAAE,sBAEF4N,GAAY,IAAIxG,KAAK0G,IACtB,MAAMhC,GAAEA,GAAOgC,GAAW,CAAE,GACpBN,oBAAqBgI,GZuCK,GACrC7H,YACAlK,WAAW,MACXV,WAAW,KACXqK,UACAT,WAAW,MAQX,MAAMY,EAAaM,GAA0BF,EAAWP,EAAST,GAEjE,MAAO,CACNY,WAAYA,EACZC,oBAAqBC,EAAeF,EAAY9J,EAAUV,GAC1D,EYzD8D0S,CAAuB,CAClF9H,UAAW7B,EACX/I,WACAU,WACA2J,aAGKsI,MAAEA,GAAU3H,GAA6BD,EAAS/K,GAExD,OACC8D,EAACC,EAEA,CAAAkC,eAAe,gBACfpC,QAAS,IAAMsO,EAAgBpJ,GAC/BrF,UAAWC,GAAOoH,QAElBxK,SAAA,CAAAI,EAACiS,EACA,CAAAC,MAAOF,EACP9N,KAAK,UACLiO,SAAU,IAAMX,EAAgBpJ,GAChCgK,QAASd,IAAoBlJ,EAC7BM,KAAM2J,EAAUC,MAChBlM,KAAK,QACLmM,UAAQ,IAETvS,EAAA,MAAA,CAAK+C,UAAWC,GAAOwP,sBAAeV,MAdjC1J,EAeA,MAGA,6DCxDX,MAAMqK,GAAgB,EAAG/I,UAASa,iBAAgBmI,qBACjD,MAAMrT,SAAEA,EAAQU,SAAEA,GAAaG,MAEzB2K,OAAEA,GAAWnB,GAAW,CAAE,EAChC,OACC1J,EAACmF,EAAO,CAAApC,UAAWC,GAAOC,UAAWK,IAAK,IAAK8B,WAC7C,EAAAxF,UAACiL,GAAU,IAAInH,KAAK2F,IACpB,MAAQjB,GAAI2C,EAAOvH,QAAEA,EAAOwH,WAAEA,GAAe3B,GAAS,CAAE,GAClD2I,MAAEA,GAAU5I,GAAoBC,EAAOhK,GAE7C,OACC8D,EAACgC,EAAM,CAAAvF,SAAA,CACNI,EAACgP,EAAI,CAAC5E,QAAQ,OAAQxK,SAAAoS,IACtBhS,EAACmF,EAAM,CAAC7B,IAAK,EAAG8B,WAAS,EAAAxF,UACtB4D,GAAW,IAAIE,KAAKE,IACrB,MAAQwE,GAAIoB,GAAa5F,GAAU,CAAE,GAE7BkG,oBAAqB6I,GdfP,GAC7B/O,SACA7D,WAAW,MACXV,WAAW,SAMX,MAAM2J,MAAEA,GAAUpF,GAAU,CAAE,EAE9B,MAAO,CACNiG,WAAYb,EACZc,oBAAqBC,EAAef,EAAOjJ,EAAUV,GACrD,EcCiEuT,CAAe,CACzEhP,SACAvE,WACAU,cAEOiS,MAAOa,GAAgBvJ,GAA0B1F,EAAQvE,GAC3DyT,EAAW9H,IAAe7B,GAAoB8B,OAC9CmH,EAAUU,EACbvI,EAAeQ,KAAavB,GAC1Be,EAAeQ,IAAY,IAAiBzM,SAASkL,GAE1D,OACCrG,EAACC,EAAG,CAAgBkC,eAAe,gBAAgBvC,UAAWC,GAAOY,iBACpE5D,EAACiS,EACA,CAAAC,MAAOW,EACP3O,KAAM,UAAU6G,IAChBoH,SAAU,IACTO,EAAe,CACd3H,UACAvB,WACAsJ,WACAC,UAAWD,GAAYV,IAGzBA,QAASA,EACT1J,KAAMoK,EAAWT,EAAUC,MAAQD,EAAUW,SAC7C5M,KAAK,QACLmM,UACC,IACFvS,SAAK+C,UAAWC,GAAOiQ,qBAAcN,MAjB5BnJ,EAkBJ,QApCGuB,EAwCJ,KAGH,EC7CLmI,GAAiB,EAAGxJ,UAASyJ,cAClC,MAAM9T,SAAEA,EAAQU,SAAEA,GAAaG,MACzBoM,WAAEA,EAAUC,cAAEA,GAAkBe,MAC/BrE,EAAUmK,GAAe3Q,EAAiB,IAC1C4Q,EAAUC,GAAe7Q,GAAkB,IAC3C6O,EAAiBiC,GAAsB9Q,EAAwB,OAC/D8O,EAAgBiC,GAAqB/Q,EAAwB,OAC7D8H,EAAgBkJ,GAAqBhR,EAAyB,CAAA,GAC/DiR,EAAWvM,EAAuB,OAClC7K,EAAEA,GAAM2R,KAER0F,ELXiC,GACvClI,YACAxB,YACAM,2BAMA,MAAM6B,KAAEA,GAASkB,KACjB,OAAIxN,EAAQsM,KAAUX,EAAkB,GAInB,QAAd3K,EAAAsL,EAFQZ,GAAeC,EAAWxB,EAAWM,WAE/B,IAAAzJ,OAAA,EAAAA,EAAAmI,WAAY,CAAC,EKHJ2K,CAAyB,CACtDnI,UAAW/B,aAAA,EAAAA,EAAStB,GACpB6B,UAAWqH,EACX/G,oBAEKrG,KAAEA,EAAIuK,YAAEA,GAAgBpB,GAC7B,IAAM5D,GAAsBC,EAASrK,IACrC,CAACqK,EAASrK,KAELyK,oBAAEA,GAAwBuD,GAC/B,IAAMzD,GAAgBF,EAAS3J,EAAUV,IACzC,CAACqK,EAAS3J,EAAUV,KAGbyK,oBAAqB+J,GAA4BxG,GACxD,Id4FiC,GAClC3D,UACAO,YACAhB,WAAW,EACXlJ,WACAV,WACAkL,iBACAC,SAAQ,MAUR,MAAME,MAAEA,GAAUJ,GAAuB,CACxCZ,UACAO,YACAhB,WACAsB,iBACAC,UAGD,MAAO,CACNX,WAAYa,EACZZ,oBAAqBC,EAAeW,EAAO3K,EAAUV,GACrD,EcvHCyU,CAAoB,CACnBpK,UACAT,WACA5J,WACAU,WACAkK,UAAWqH,EACX/G,oBAEF,CAACb,EAAST,EAAU5J,EAAUU,EAAUuR,EAAiB/G,IAGpD8F,EAAqBgD,EAAwB,IAAbpK,EAA8B,IAAbA,EACjD8K,EAAc1G,GACnB,IAC8B/Q,EAA7B+W,EAAyB,IAAbpK,EAAmB,oBAAyB,eAAqB,iBAC9E,CAACoK,EAAUpK,IAGZ5B,GAAU,KACT+L,EAAYO,EAAwB,EAAIA,EAAwB,GAChEL,EAAYK,EAAwB,EAAE,GACpC,CAACA,EAAuBjK,IAE3BrC,GAAU,KACTkM,EAAmB,MACnBE,EAAkB,CAAA,EAAG,GACnB,CAAC/J,IAEJ,MA4BMsK,EAAkBC,KACR,IAAXA,GAAiB5D,GAErB+C,GAAa7L,GAAY2M,KAAKC,IAAI,EAAG5M,EAAU0M,IAAQ,EAiCxD,GAAInU,EAAQ4J,GAAU,OAAO,KAE7B,MAAMmG,UAAEA,EAAStB,OAAEA,EAAMrE,SAAEA,EAAQW,OAAEA,EAAM2D,UAAEA,GAAc9E,EACrD0K,GAAclK,aAAA,EAAAA,EAAUnN,QAAS,EACjC4R,GAAY9D,aAAA,EAAAA,EAAQ9N,QAAS,EAEnC,OACCiD,EAAK,MAAA,CAAA+C,UAAWC,GAAOC,UAAWC,QAvEPmR,aACQ,QAA9BxT,EAAiB,QAAjBC,EAAA4S,aAAQ,EAARA,EAAUnM,eAAO,IAAAzG,OAAA,EAAAA,EAAEwT,gBAAW,IAAAzT,OAAA,EAAAA,EAAAlE,KAAAmE,EAAAuT,aAAA,EAAAA,EAAOzO,UACrCuN,GAASA,KAqE+CvT,SAC5DI,EAACuU,EAAK,CACLpB,QAASA,EACThL,IAAKuL,EACLc,eACA,EAAApO,KAAK,QACL0J,QACC3M,EAAA,MAAA,CAAKJ,UAAWC,GAAO8M,QAAOlQ,SAAA,CAC7BuD,EAACgC,EAAM,CAAC7B,IAAK,EACX1D,SAAA,CAAAiQ,GACA7P,EAACkB,GACA,CAAAyC,IAAKvF,GAAeyR,GACpB9K,MAAO,KACPC,OAAQ,IACRlB,IAAKI,GAAQ,UACbnB,UAAWC,GAAO3E,QAGpB8E,EAACgC,GAAOpC,UAAWC,GAAOyR,QAASnR,IAAK,EAAC1D,SAAA,CACxCI,QAAI+C,UAAWC,GAAOkB,cAAOA,IAC7Bf,EAACC,GAAIkC,eAAe,gBACnB1F,SAAA,CAAAI,EAAA,MAAA,CAAK+C,UAAWC,GAAOgG,eAAQc,IAC/B9J,EAAK,MAAA,CAAA+C,UAAWC,GAAOuL,OAAS3O,SAAA2O,OAEjCvO,SAAK+C,UAAWC,GAAOyL,YAAc7O,SAAA6O,QAEpC2F,GAAezF,IAChBxL,EAACgC,GAAO7B,IAAK,EAAGP,UAAWC,GAAO0R,QAChC9U,SAAA,CAAAwU,GACApU,EAACqR,GACA,CAAA3H,QAASA,EACT4H,gBAAiBA,EACjBC,eAAgBA,EAChBC,gBAAiB+B,IAIlB5E,GACA3O,EAACyS,GAAa,CACb/I,QAASA,EACTa,eAAgBA,EAChBmI,eA9EiB,EAC1B3H,UACAvB,WACAsJ,WACAC,YAAW,MAOXU,GAAmBkB,IAElB,GAAI7B,EACH,OAAAtW,OAAAwF,OAAAxF,OAAAwF,OAAA,CAAA,EAAY2S,GAAU,CAAA5J,CAACA,GAAUvB,IAIlC,MAAMoL,EAAqBD,EAAS5J,IAAY,GAC1C8J,EAAmB9B,EACtB6B,EAAkBhS,QAAQwF,GAAOA,IAAOoB,IACxC,IAAI,IAAIsL,IAAI,IAAIF,EAAmBpL,KAEtC,OAAAhN,OAAAwF,OAAAxF,OAAAwF,OAAA,CAAA,EACI2S,GACH,CAAA5J,CAACA,GAAU8J,GACV,GACD,UAyDE7U,SAAK+C,UAAWC,GAAO+R,eACtB/U,EAACqP,GAAWnM,QAASiQ,EAASpN,KAAMiP,SAIvCC,OACC9R,EAACgC,EAAM,CAAAvF,SAAA,CACNI,EAAC4Q,GAAa,CAACnF,UAAW/B,aAAO,EAAPA,EAAStB,GAAIyI,aAAcsC,IACrDhQ,EAACC,EAAG,CAACL,UAAWC,GAAOoM,UAAW9L,IAAK,aACtCtD,EAACoQ,IACAC,mBAAoBA,EACpBE,WAAY,IAAMyD,GAAe,GACjC1D,WAAY,IAAM0D,EAAe,GACjC/K,SAAUA,IAEXjJ,EAACkV,EACA,CAAAnS,UAAWC,GAAOmS,UAClBjD,MACC1D,EACCrL,EAACC,EAAG,CAACgC,WAAU,EAAAE,eAAe,gBAAe1F,SAAA,CAC5CI,EAAM,OAAA,CAAA+C,UAAWC,GAAO+Q,YAAcnU,SAAAmU,IACtC/T,EAAA,OAAA,CAAAJ,SAAOiU,OAGRvX,EAAE,iBAGJ4G,QAnIc,WAGpB,IAFoC,QAAjBpC,EAAA4I,aAAA,EAAAA,EAASQ,gBAAQ,IAAApJ,OAAA,EAAAA,EAAE/D,QAAS,IAE5BuU,EAAiB,OAVpCkC,EAUmE,gBARnE4B,YAAW,KACV5B,EAAkB,KAAK,GACrB,KAQCH,EACH9G,EAAc,CAAE7C,UAAST,WAAUgB,UAAWqH,EAAiB/G,oBAE/D+B,EAAW,CAAE5C,UAAST,WAAUgB,UAAWqH,EAAiB/G,mBAC5DhC,EAAWiH,GAAqC,CAAEtL,OAAM+E,cAErDkK,GAASA,GAAS,EAyHhB/M,KAAK,KACLhB,WAAS,EACTiQ,UAAW7G,aAMX,ytBClOR,MAAM8G,GAAc,EAAGC,aAAYrS,cAClC,MAAMsS,EAAavF,MACbnG,oBAAEA,GNAwB,MAChC,MAAMsC,KAAEA,GAASkB,MACXvN,SAAEA,EAAQV,SAAEA,GAAaa,KAEzBuV,EAAiBjZ,OAAO0T,OAAO9D,GAAQ,CAAE,GAAEtB,QAAO,CAACqF,EAAKlP,KAC7D,MAAM4I,WAAEA,GAAe0B,GAAatK,GACpC,OAAOkP,EAAMtG,CAAU,GACrB,GAEH,MAAO,CACNA,WAAY4L,EACZ3L,oBAAqBC,EAAe0L,EAAgB1V,EAAUV,GAC9D,EMZ+BqW,GAEhC,OACCvS,EAACoC,EAAI,CACJxC,UAAWQ,EAAWP,GAAQ,CAC7BC,WAAW,EACX4L,cAAe3L,IAEhBoC,eAAe,gBACfjC,WAAW,SACXH,QAASA,EAAOtD,SAAA,CAEhBI,EAACuF,EAAKE,KAAI,CAACsL,KAAM,EAACnR,SACjBuD,EAACC,EAAG,CAACC,WAAW,SACfzD,SAAA,CAAAI,EAAA,MAAA,CAAK+C,UAAWC,GAAO2S,MAAQ/V,SAAA4V,IAC/BxV,EAAK,MAAA,CAAA+C,UAAWC,GAAOuS,WAAU3V,SAAG2V,SAGtCvV,EAACuF,EAAKE,KAAK,CAAA1C,UAAWC,GAAO6G,WAAYkH,KAAM,EAC7CnR,SAAAkK,MAEI,EC3BH8L,GAAO,KACZ,MAAMpJ,cAAEA,GAAkBc,MACpBhR,EAAEA,GAAM2R,KAGd,OAFmBgC,MAED,EAAU,KAG3BjQ,EAAK,MAAA,CAAA+C,UAAWC,GAAgBpD,SAC/BI,EAAK,MAAA,CAAA+C,UAAWC,GACfpD,SAAAI,EAACsV,GAAY,CAAApS,QAAS,IAAMsJ,GAAc,GAAO+I,WAAYjZ,EAAE,mBAE3D,iRCdD,MAAMuZ,GAAkBpK,UAC9B,MAAMqK,SAAEA,GAAa5V,KAGrB,OAF8B,QAAdY,EAAAgV,aAAQ,EAARA,EAAU9U,YAAI,IAAAF,OAAA,EAAAA,EAAAnE,KAAAmZ,GAAG,EAAG1N,QAASA,IAAOqD,MAEjC,CAAE,CAAA,ECMhBsK,GAAkB,EAAGtK,YAAWxB,YAAW+L,MAAM,EAAG5P,OAAO,KAAMmE,qBACtE,MAAMtB,EDJ2B,GACjCwC,YACAxB,YACAM,qBAMA,MAAM6B,KAAEA,GAASkB,KAEXrM,EAAOmL,EADEZ,GAAeC,EAAWxB,EAAWM,IAGpD,OAAOtJ,aAAI,EAAJA,EAAMgI,WAAY,CAAC,ECTTgN,CAAmB,CAAExK,YAAWxB,YAAWM,mBACtDb,EAAUmM,GAAepK,IACzBc,cAAEA,GAAkBe,KAI1B,OACCtN,EAACoQ,GAAQ,CACRC,mBAJyBpH,IAAa+M,EAKtCzF,WAAY,IACXhE,EAAc,CAAE7C,UAAST,SAAUA,EAAW,EAAGgB,YAAWM,mBAE7D+F,WAAY,IACX/D,EAAc,CAAE7C,UAAST,SAAUA,EAAW,EAAGgB,YAAWM,mBAE7DtB,SAAUA,EACV7C,KAAMA,GACL,ECzBE8P,GAAyB,EAC9BjV,OACAyI,UACArK,eAMA,MAAMkL,eAAEA,GAAmBtJ,GAAQ,CAAE,EAErC,OACCjB,cACExD,OAAOqP,QAAQtB,GAAkB,CAAE,GAClC7G,KAAI,EAAEqH,EAASvB,MACf,MAAMH,EnB0JoB,EAACK,EAAkBqB,MACzCrB,aAAO,EAAPA,EAASmB,SAAU,IAAI7J,MAAK,EAAGoH,QAASA,IAAO2C,KAAa,CAAgB,EmB3JlEoL,CAAgBzM,EAAS0M,OAAOrL,IAC9C,GAAIjL,EAAQuJ,IAAUvJ,EAAQuJ,EAAM7F,WAAauI,MAAMC,QAAQ3C,EAAM7F,SACpE,OAAO,KAGR,IAAI6S,EAAe,GAEnB,GAAItK,MAAMC,QAAQxC,GAAW,CAC5B,MAAMhG,EAAU6F,EAAM7F,QAAQZ,QAAO,EAAGwF,QAASoB,EAASlL,SAAS8J,KACnE,GAAItI,EAAQ0D,GAAU,OAAO,KAE7B6S,EAAe7S,EACbE,KAAKE,IACL,MAAQoO,MAAOa,GAAgBvJ,GAA0B1F,EAAQvE,GAEjE,OAAOwT,CAAW,IAElBjQ,OAAOqJ,SACPC,KAAK,UACD,CACN,MAAMtI,EAASyF,EAAM7F,QAAQxC,MAAK,EAAGoH,QAASA,IAAOoB,IACrD,GAAI1J,EAAQ8D,GAAS,OAAO,KAC5B,MAAMoO,MAAEA,GAAU1I,GAA0B1F,EAAQvE,GACpDgX,EAAerE,EAGhB,MAAQA,MAAOsE,GAAelN,GAAoBC,EAAOhK,GAEzD,OACC8D,EAAC6L,GAAKC,MAAM,QAAQ7I,KAAK,KAAIxG,SAAA,CAC3B0W,EAAc,KAAAD,IADmBtL,EAE5B,IAGRnI,OAAOqJ,UACP,ECnCCsK,GAAW,EAAGtV,WACnB,MAAMwK,UAAEA,EAASxB,UAAEA,EAASM,eAAEA,GAAmBtJ,GAAQ,CAAE,EACrDyI,EAAUmM,GAAepK,GACzBrB,EAAUJ,GAAkBN,EAASO,IACrC5K,SAAEA,EAAQU,SAAEA,GAAaG,MACzBoO,SAAEA,GAAa5E,GACbsI,MAAOwE,GAAiBnM,GAA6BD,EAAS/K,IAChE6E,KAAEA,GAASmJ,GAAQ,IAAM5D,GAAsBC,EAASrK,IAAW,CAACqK,EAASrK,KAC7EyK,oBAAEA,GAAwBuD,GAC/B,IAAM9B,GAAatK,EAAMlB,EAAUV,IACnC,CAAC4B,EAAMlB,EAAUV,IAGlB,OACC8D,EAACC,EAAG,CAACL,UAAWC,GAAkBM,IAAK,EAAGD,WAAW,aACnDzD,SAAA,CAAA0O,GACAtO,EAACkB,GAAK,CACLyC,IAAKvF,GAAekQ,GACpBxK,IAAKI,GAAQ,OACbnB,UAAWC,GACXkC,QAAQ,OACRH,MAAO,GACPC,OAAQ,KAGV7B,EAAK,MAAA,CAAAJ,UAAWC,GAAWpD,SAAA,CAC1BI,SAAK+C,UAAWC,GAAcpD,SAAAsE,IAC9Bf,EAACgC,EAAM,CAAC7B,IAAK,EAAC1D,SAAA,GACV4W,GACFxW,EAACgP,GAAKC,MAAM,QAAQ7I,KAAK,KACvBxG,SAAA4W,IAGHxW,EAACkW,IAAuBjV,KAAMA,EAAMyI,QAASA,EAASrK,SAAUA,OAEjEW,SAAK+C,UAAWC,GAAepD,SAAAkK,OAEhC9J,EAAC+V,GACA,CAAAtK,UAAWA,EACXxB,UAAWA,EACXM,eAAgBA,EAChBnE,KAAK,KACL4P,IAAK,MAED,ECxDFS,GAAa,KAClB,MAAMpK,WAAEA,EAAUD,KAAEA,EAAII,cAAEA,GAAkBc,KACtCoJ,EAAavP,EAAuB,OACpC7K,EAAEA,GAAM2R,KAER0I,EAAc7W,EAAQsM,GAEtB2I,EAAQ,IAAMvI,GAAc,GAsBlC,OAAKH,EAGJrM,EAAA,MAAA,CAAK+C,UAAWC,GAAOC,UAAWC,QAvBPmR,aACU,QAAhCxT,EAAmB,QAAnBC,EAAA4V,aAAU,EAAVA,EAAYnP,eAAO,IAAAzG,OAAA,EAAAA,EAAEwT,gBAAW,IAAAzT,OAAA,EAAAA,EAAAlE,KAAAmE,EAAAuT,aAAA,EAAAA,EAAOzO,UAC3CmP,KAqB4DnV,SAC5DI,EAAC4W,GACAzO,IAAKuO,EACLvD,QAAS4B,EACTtR,OAAQ4I,EACR2F,MAAO1V,EAAE,cACTwT,QACC9P,EAAK,MAAA,CAAA+C,UAAWC,GAAO8M,iBACrB6G,EACA3W,GA1BU,IACfmD,EAACgC,EAAM,CACNpC,UAAWC,GAAO6T,QAClBzR,WACA,EAAAC,YACA,EAAAhC,WAAW,SACXiC,eAAe,SACfhC,IAAK,EAAC1D,SAAA,CAENI,EAACgP,EAAK,CAAA5E,QAAQ,KAAMxK,SAAAtD,EAAE,iBACtB0D,EAAC8W,EAAY,CAAAC,KAAMza,EAAE,gDAgBN,CAAA,GAEX0D,EAAA,MAAA,CAAK+C,UAAWC,GAAOgU,eACrBxa,OAAOya,KAAK7K,GAAQ,CAAA,GAAI1I,KAAK+H,GAC7BzL,EAACuW,GAAyB,CAAAtV,KAAMmL,EAAKX,IAAtBA,SAMpBwJ,OACC0B,EACC3W,EAACkV,EAAM,CACNhD,MAAO5V,EAAE,aACT4G,QAAS6R,EACTrM,KAAMC,EAAcuO,QACpB9Q,KAAK,KACLhB,WACC,IAEFpF,EAACsV,GAAW,CAACC,WAAYjZ,EAAE,kBAhCR,IAoCjB,EChDF6a,GAAWC,GAChB,EACCrQ,qBAAqB,GACrBhH,WACAV,WACAgY,mBACA5F,eACA6F,uBAEA,MAAOC,EAAiBC,GAAsB/U,EAAyB,OAChEgV,EAAMC,GAAWjV,EAAsB4I,GAAYsM,MAEpDC,EAAQ,CACb,CACC7R,KAAM8R,EACNnP,KAAM2C,GAAYsM,MAEnB,CACC5R,KAAM+R,GACNpP,KAAM2C,GAAY0M,OASdC,EAAuBtO,IAC5B,MAAMxF,KAAEA,GAASuF,GAAsBC,EAASrK,GAChDkJ,EAAW0P,GAAoC,CAAE/T,SAEjDsT,EAAmB9N,EAAQ,EAmD5B,OAhDArC,GAAU,KAET,MAAM6Q,EAAW,IAAIC,sBACnBtM,UAEA,MAAMuM,YAAkBtX,EAAA2Q,aAAY,EAAZA,EAAclK,8BAAS8Q,eAAgB,KAAQ,EAEvE,IAAIC,EAAmC,KACnCC,EAAkBC,IAEtB3M,EAAQ4M,SAASC,IAChB,GAAIA,EAAMC,eAAgB,CACzB,MAAMC,EAAOF,EAAMG,mBACbC,EAAgBF,EAAKG,IAAMH,EAAK5T,OAAS,EACzCgU,EAAmB9E,KAAK+E,IAAIH,EAAgBV,GAG9CY,EAAmBT,IACtBA,EAAkBS,EAClBV,EAAoBI,EAAM9S,OAAOsT,aAAa,yBAM7CZ,GACHhB,EAAiBlB,OAAOkC,MAG1B,CACCa,UAAW,KAYb,OAPA3c,OAAOqP,QAAQwL,EAAiB9P,SAAW,CAAA,GAAIkR,SAAQ,EAAEW,EAAYC,MAChEA,IACHA,EAAQC,aAAa,mBAAoBF,GACzClB,EAASqB,QAAQF,OAIZ,KAENnB,EAASsB,YAAY,CACrB,GACC,CAACnC,EAAkB5F,IAGrBzR,EAAC0M,GAAY,CAAA9M,SACZuD,SAAKJ,UAAWC,aACfhD,EAACoD,GAAIL,UAAWC,GAAaK,WAAW,SACtCzD,SAAAgY,EAAMlU,KAAI,EAAGqC,OAAM2C,UACnB1I,EAACqP,GAEAtJ,KAAMA,EACN7C,QAAS,IApEU,CAACwF,IACzBgP,EAAQhP,GACRH,EAAWkR,GAAyC,CAAEvV,KAAMwE,GAAO,EAkE/CgR,CAAiBhR,GAChCA,KAAMA,IAAS+O,EAAO9O,EAAcuO,QAAUvO,EAAc+G,SAHvDhH,OAOR1I,EAACmF,EAAM,CAAAvF,UACJmH,GAAsB,IAAIrD,KAAK9C,IAChC,MAAMsD,KAAEA,GAASyV,GAAqC/Y,EAAUvB,IAC1D+I,GAAEA,EAAE0N,SAAEA,GAAalV,EACzB,OACCuC,EAAA,MAAA,CACCJ,UAAWC,GAEXmF,IAAMW,IACDA,IACHuO,EAAkB9P,QAASa,GAAMU,uBAGjBV,EAAExI,SAAA,CAEpBI,EAAI,KAAA,CAAA+C,UAAWC,GAAepD,SAAGsE,IACjClE,SAAK+C,UAAWC,GACfpD,SAAAI,EAACmF,EAAO,CAAA7B,IAAK,YACVwS,GAAY,IAAIpS,KAAKgG,GAClB+N,IAASpM,GAAY0M,KAEvB/X,EAAC2P,GAAgB,CAChBjG,QAASA,EACT3J,SAAUA,EACVV,SAAUA,EAEV6D,QAAS,IAAM8U,EAAoBtO,IAD9BA,EAAQtB,IAOfpI,EAACqO,GAAgB,CAChB3E,QAASA,EACT3J,SAAUA,EACVV,SAAUA,EAEV6D,QAAS,IAAM8U,EAAoBtO,IAD9BA,EAAQtB,YA7BbA,EAoCA,MAITpI,EAACkT,GAAc,CAACxJ,QAAS6N,EAAiBpE,QAAS,IAAMqE,EAAmB,QAC5ExX,EAAC4V,GAAI,CAAA,GACL5V,EAACyW,GAAU,CAAA,OAEE,IAGjB,CAACmD,EAAWC,IAEVD,EAAU7S,qBAAuB8S,EAAU9S,oBAC3C6S,EAAU7Z,WAAa8Z,EAAU9Z,UACjC6Z,EAAUva,WAAawa,EAAUxa,WAKpC8X,GAAS2C,YAAc,sHC/KvB,MAAMC,GAAW,EAAGC,WAAW,GAAIC,WAAW,GAAIC,qBACjD,MAAMC,EAAS,EAAGva,WAAUwI,QACvB8R,EAAuBla,EAAK,MAAA,CAAAkD,QAAS,IAAMgX,EAAe9R,GAAMxI,SAAAA,IAE7DI,EAAA,IAAA,CAAG2F,KAAM,GAAGsU,KAAY7R,IAAIxI,SAAGA,IAGvC,OACCI,EAAA,MAAA,CAAK+C,UAAWC,GACfpD,SAAAI,EAACoa,EAAU,CAAArX,UAAWC,GAAWpD,SAC/Boa,EAAStW,KAAI,EAAG0E,KAAIlE,UACpBlE,EAACma,EAAM,CAAU/R,GAAIA,EACpBxI,SAAAI,EAACqa,EAAK,CAAAC,gBACL,EAAA1a,SAAAI,EAACuF,EAAK,CAAAD,eAAe,SAASjC,WAAW,SAASgC,YACjD,EAAAzF,SAAAI,EAAA,KAAA,CAAI+C,UAAWC,GAAcpD,SAAAsE,SAHnBkE,QASV,ECTFmS,GAAa,EAAGvK,iBACrB,MAAM9L,KACLA,EAAIvF,WACJA,EAAUF,UACVA,EAASub,SACTA,EAAW,GAAEQ,SACbA,EAAQnb,SACRA,EAAQob,WACRA,EAAU3E,SACVA,EAAQ/V,SACRA,EAAQoE,UACRA,EAASC,SACTA,EAAQC,SACRA,EAAQC,SACRA,EAAQC,OACRA,EAAM0V,SACNA,EAAQS,SACRA,EAAQR,eACRA,GACGlK,GAAQ,CAAE,EAER2K,EAAkBX,EAASjd,QAAU,EACrCgK,EC5CqC,EAC3C0T,EACA3E,KAEA,MAAM8E,EAAa9E,EAAShL,QAAkC,CAACpH,EAAKgG,KACnE,IAAKA,EAAQmR,QAAS,OAAOnX,EAE7B,MAAM0V,EAAahD,OAAO1M,EAAQ0P,YAKlC,OAJK1V,EAAI0V,KACR1V,EAAI0V,GAAc,IAEnB1V,EAAI0V,GAAY0B,KAAKpR,GACdhG,CAAG,GACR,IAEH,OAAO+W,EACL/W,KAAK9C,GACFpE,OAAAwF,OAAAxF,OAAAwF,OAAA,CAAA,EAAApB,GACH,CAAAkV,SAAW8E,EAAWxE,OAAOxV,EAASwH,MAAQ,OAE9CxF,QAAQhC,IAAa,IAAAE,EAAA,OAAoB,QAApBA,EAAAF,aAAA,EAAAA,EAAUkV,gBAAU,IAAAhV,OAAA,EAAAA,EAAA/D,QAAS,CAAC,GAAC,EDwB3Bge,CAA6BN,EAAY3E,GAY9DkF,EAVoB,YACzB,OAAIL,GACc,QAAb7Z,EAAAkZ,aAAQ,EAARA,EAAW,UAAE,IAAAlZ,OAAA,EAAAA,EAAEsH,IAAW4R,EAAS,GAEhC,CAAyB,EAG1BA,EAAShZ,MAAMC,GAASA,EAAKmH,KAAOgO,OAAOoE,IAAU,EAGtCS,GACjBC,EAAYP,KAAoBK,aAAc,EAAdA,EAAgB9W,MAAOA,GAAO8W,aAAc,EAAdA,EAAgB9W,OAAQ,IAErF8C,EAAoBmU,GAAyB1Y,EAAkC,QAAjB3B,EAAA2Z,aAAU,EAAVA,EAAa,UAAI,IAAA3Z,OAAA,EAAAA,EAAAsH,IAChFiP,EAAmBlQ,EAAsB,IACzCsK,EAAetK,EAAuB,MACtCiU,EAAgBjU,GAAgB,IAC9BkU,IAAKC,EAAOC,OAAEA,GnC/DG,EAACb,EAAkBrb,KAC5C,MAAMkc,EAASpc,GAAQb,SAASoc,GAAYA,EAAWxb,GAEvD,MAAO,CAAEmc,IAAK,WAAWE,KADVlc,GAAY,OACkBkc,SAAQ,EmC4DpBC,CAAWd,EAAUrb,GAgBhDoJ,EAA8B2Q,GAAsBnc,QAAA,OAAA,OAAA,GAAA,YACzDme,EAAc7T,SAAU,EACxB4T,EAAsB/B,GAhBM,CAACA,UAC7B,MAAMqC,EAA2C,QAA5B3a,EAAAuW,aAAA,EAAAA,EAAkB9P,eAAU,IAAAzG,OAAA,EAAAA,EAAAsY,GAE5CqC,IAELrG,YAAW,KACVqG,EAAa9J,eAAe,CAAE5J,SAAU,SAAU2T,MAAO,SAAU,GACjE,KAEHtG,YAAW,KACVgG,EAAc7T,SAAU,CAAI,GAC1B,KAAK,EAORoU,CAAqBvC,EACtB,IA0BA,OAJA/R,GAAU,KAboB,MAC7B,GAAsB,oBAAXuU,OAAwB,OAEnC,MAAMC,EAAe,IAAIC,gBAAgBF,OAAOG,SAASC,QACnDC,EAAoB7F,OAAOyF,EAAaK,IAAI,aAClD,IAAKD,EAAmB,OAExB,MAAME,GAAoB1B,GAAc,IAAIzZ,MAAK,EAAGoH,QAASA,IAAO6T,IAChEnc,EAAQqc,IAEZ1T,EAAqBwT,EAAkB,EAIvCG,EAAuB,GACrB,IAGFjZ,EAAK,MAAA,CAAAJ,UAAWC,GAAkBmF,IAAKsJ,EACtC7R,SAAA,CAAAI,EAACgE,GACA,CAAAC,OAAQ+W,EACR9W,KAAMgX,EACNvc,WAAYD,GAAoBC,GAChCF,UAAWD,GAAmBC,GAC9B0F,UAAWA,EACXC,SAAUA,EACVC,SAAUA,EACVC,SAAUA,EACVC,OAAQA,IAEPoW,GAAoBH,EAGrBrX,EAAAkZ,EAAA,CAAAzc,SAAA,CACCI,EAAC8G,IACAC,mBAAoBA,EACpB1H,SAAUA,EACV2H,mBAAoBA,EACpBC,iBAAkBwB,IAEnBzI,EAACmX,GACA,CAAApX,SAAUA,EACVV,SAAUA,EACVgY,iBAAkBA,EAClB5F,aAAcA,EACd1K,mBAAoBA,EACpBuQ,iBArDyB8B,IAC7B,KAAKgC,aAAA,EAAAA,EAAe7T,SAAS,OAC7B,MAAMrD,EhC9E2B,EAClCkV,EACAqB,EACApb,WAEA,MAAMuB,EAA2B,QAAhBE,EAAA2Z,aAAU,EAAVA,EAAYzZ,YAAI,IAAAF,OAAA,EAAAA,EAAAnE,KAAA8d,GAAG,EAAGrS,QAASA,IAAOgR,IAEvD,GAAItZ,EAAQc,GAAW,MAAO,GAE9B,MAAMsD,KAAEA,GAASvD,GAAuBC,EAAUvB,GAElD,OAAO6E,CAAI,EgCmEGoY,CAAoBlD,EAAYqB,EAAYpb,GACzDkJ,EAAWgU,GAAsC,CAAErY,SACnDiX,EAAsB/B,EAAW,OAkC/BpZ,EAAC+Z,IAASC,SAAUA,EAAUE,eAAgBA,EAAgBD,SAAUA,MAoBtES,GACF1a,EAAA,IAAA,CAAG6F,IAAI,sBAAsBD,OAAO,SAASD,KAAM2V,EAASvY,UAAWC,GACrEpD,SAAA2b,MAGE,EAIFiB,GAAwB,EAAGxM,UAE/BhQ,EAACL,GAAc,CAAAjC,MAAOsS,EAAIpQ,SACzBI,EAACua,IAAWvK,KAAMA,gBEhJrB,MAAMyM,GAAgB,EAAGC,cAAard,WAAUsd,cAC/C,MAAMrgB,EAAEA,GAAM2R,GAAe5O,GACvBud,EAAmBzV,EAAyB,IAE5C0V,EAAgBC,IACrB,OAAQA,GACP,KAAKP,GACJ,OAAOjgB,EAAE,wBACV,KAAKkM,GACJ,OAAOlM,EAAE,qBACV,KAAK2b,GACJ,OAAO3b,EAAE,mBACV,KAAKkT,GACJ,OAAOlT,EAAE,yBAEV,QACC,MAAO,KAIJygB,EAAeC,GACnBF,YACAH,EAAQG,GACwB,QAAhCjc,EAAyB,QAAzBC,EAAA8b,aAAgB,EAAhBA,EAAkBrV,eAAO,IAAAzG,OAAA,EAAAA,EAAEiU,aAAK,IAAAlU,GAAAA,EAAAlE,KAAAmE,EAAI,GAErC,CAAC6b,IAGF,OACC3c,EAACid,EAAQ,CACRC,OAAQL,EAAaH,GACrBS,WAAW,QACXzU,KAAMC,EAAcC,iBACpBwU,SAAUR,EACVS,KACCrd,SAAK+C,UAAWC,GAAOsa,YACrB1d,SAAA2d,GAAyB7Z,KAAKoZ,GAC9B9c,EAACwd,EAAgB,CAAYta,QAAS,IAAM6Z,EAAaD,GACvDld,SAAAid,EAAaC,IADQA,QAMzB,EC1CEpP,GAAS,EAAGsC,OAAMyN,aAAY,EAAOC,eAAcre,WAAUyd,OAAMH,cACxE,MAAMrgB,EAAEA,GAAM2R,GAAe5O,GAE7B,OACCW,EAACqa,EACA,CAAArI,MAAO1V,EAAE,UACTqhB,QAAS3d,EAACyc,GAAc,CAAApd,SAAUA,EAAUqd,YAAaI,EAAMH,QAASA,IAAW/c,SAElF6d,EAAYzd,EAAC4d,EAAO,CAACvf,MAAOqf,IAAmB1d,EAAC6d,EAAS,CAAA7N,KAAMA,KAC1D,i6BCtBF,MAAM8N,GAAwB,CACpCC,UAAW,CACV/L,MAAO,YACPhJ,MAAO,CACN2E,QAAS,EACTC,SAAU,IAIZoQ,WAAY,CACXhM,MAAO,cACPhJ,MAAO,CACN2E,QAAS,GACTC,SAAU,KAIZqQ,aAAc,CACbjM,MAAO,iBACPhJ,MAAO,CACN2E,QAAS,GACTC,SAAU,MAMAsQ,GAAmB,CAC/B,CACClM,MAAO,gBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,cACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,iBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,kBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,qBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,uBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,mBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,kBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,eACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,gBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,oBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,mBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,mBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,sBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,gCACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAE3B,CACCrM,MAAO,sBACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,GAc3B,CACCrM,MAAO,oCACP,CAAC1G,GAAS6S,YAAY,EACtB,CAAC7S,GAAS8S,cAAc,EACxB,CAAC9S,GAAS+S,gBAAgB,IC9HtBC,GAAoB,EAAGC,OAAMlf,WAAUmf,WAAUze,eACtD,MAAMzD,EAAEA,GAAM2R,GAAe5O,IAEvB2J,MAAEA,EAAKyV,gBAAEA,GAAoBX,GAAQS,GACrCG,EAAgB1V,EAAMwV,GAE5B,YAAwBG,IAApBF,EAEFtb,EAACgC,EAAM,CAAC7B,IAAK,EAAC1D,SAAA,CACbuD,EAACC,EACA,CAAAxD,SAAA,CAAAI,EAAA,OAAA,CAAM+C,UAAWC,GAAOyb,gBAAe7e,SACrCmK,EAAe0U,EAAiB1e,EAAUV,KAE5CW,EAAM,OAAA,CAAA+C,UAAWC,GAAO4b,cACtBhf,SAAAmK,EAAe2U,EAAe3e,EAAUV,QAG3CW,EAACgP,EAAK,CAAA5I,KAAK,KAAMxG,SAAAtD,EAAE,gBAKrB6G,EAACC,GAAIE,IAAK,GACT1D,SAAA,CAAAI,EAACgP,EAAK,CAAA5I,KAAK,MAAMgE,QAAQ,gBACvBL,EAAe2U,EAAe3e,EAAUV,KAE1CW,EAACgP,EAAK,CAAA5I,KAAK,KAAIxG,SAAEtD,EAAE,eACd,ECtBFuiB,GAAU,EAAG9e,WAAUV,WAAUyf,eAAcC,uBACpD,MAAOC,EAAkBC,GAAuBxc,EAA0B,aACpEnG,EAAEA,GAAM2R,GAAe5O,GAEvB6f,EAAoB,CAAC5T,GAAS6S,UAAW7S,GAAS8S,YAAa9S,GAAS+S,eAExEtK,EAAc+K,EAAe,cAAgB,cAS7CK,EAAa,EAAGvf,WAAU2e,UAC3BO,EAEF9e,EACC,MAAA,CAAA+C,UAAWC,GAAOub,KAClBrb,QAAS,KACR4b,EAAaP,EAAK,EAGlB3e,SAAAA,IAMHI,EAAA,IAAA,CACC+C,UAAWC,GAAOub,KAClB5Y,KAAMvG,GAAeC,EAAU,WAAWkf,KAC1C3Y,OAAO,SACPC,IAAI,sBAAqBjG,SAExBA,IAKJ,OACCuD,EAAA,MAAA,CAAKJ,UAAWC,GAAOC,UAASrD,SAAA,CAC/BI,EAAK,MAAA,CAAA+C,UAAWC,GAAOoc,UAASxf,SAtCQ,CAAC,WAAY,WAuCzC8D,KAAK8a,GACfxe,EAAA,MAAA,CAEC+C,UAAWQ,EAAWP,GAAQ,CAC7Bwb,UAAU,EACV3V,OAAQmW,IAAqBR,IAE9Btb,QAAS,IA3Ce,CAACsb,IAC7BS,EAAoBT,GAChBO,GACHA,EAAiBP,IAwCCa,CAAqBb,GAAS5e,SAE5CtD,EAAEkiB,IAPEA,OAWRxe,EAAA,MAAA,CAAK+C,UAAWC,GAAOkc,MAAKtf,SAC1Bsf,EAAMxb,KAAK6a,GACXve,EAACmf,EAAU,CAAYZ,KAAMA,EAAI3e,SAChCuD,EAACkX,EACA,CAAAza,SAAA,CAAAI,EAAA,MAAA,CAAK+C,UAAWC,GAAOgP,MAAKpS,SAAGke,GAAQS,GAAMvM,QAC7ChS,EAAA,MAAA,CAAK+C,UAAWC,GAAOgG,MAAKpJ,SAC3BI,EAACse,GACA,CAAAC,KAAMA,EACNlf,SAAUA,EACVmf,SAAUQ,EACVjf,SAAUA,MAGZC,EAAA,MAAA,CAAK+C,UAAWC,GAAOka,OAAMtd,SAC5BI,EAACkV,EACA,CAAAhD,MAAO5V,EAAEyX,GACT3O,WAAS,EACTgB,KAAK,KACLsC,KACC6V,IAASjT,GAAS8S,YACfzV,EAAcuO,QACdvO,EAAcC,iBAElB1F,QAAS,WAGXlD,EAAA,MAAA,CAAK+C,UAAWC,GAAOsc,SAAQ1f,SAC7Bse,GAAiBxa,KAAK6b,GACtBpc,EAAA,MAAA,CAAyBJ,UAAWC,GAAOuc,QAAO3f,SAAA,CACjDI,EAAC8F,EAAO,CAACC,KAAMwZ,EAAQhB,GAAQiB,GAAQ9O,EAAOtK,KAAK,OAAQ,IAC3DpG,EAAA,OAAA,CAAAJ,SAAOtD,EAAEijB,EAAQvN,WAFRuN,EAAQvN,eA1BLuM,SAoCd","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/utils/image.ts","../src/utils/constants.ts","../src/utils/url.ts","../src/store/index.tsx","../src/constants/analytics.ts","../src/utils/category.ts","../src/components/Image/Image.tsx","../src/components/PublicMenu/Header/Languages/Languages.tsx","../src/components/PublicMenu/Header/Header.tsx","../src/components/PublicMenu/Categories.tsx","../src/utils/common.ts","../src/models/addon.ts","../src/utils/addon.ts","../src/utils/product.ts","../src/models/product.ts","../src/models/pricing.ts","../src/utils/cart.ts","../src/store/cart.tsx","../src/constants/translations.ts","../src/hooks/translation.ts","../src/components/PublicMenu/ProductsListItem/ProductsListItem.tsx","../src/components/PublicMenu/ProductsGridItem/ProductsGridItem.tsx","../src/hooks/cart.ts","../src/components/Quantity/Quantity.tsx","../src/components/PublicMenu/ProductInCart/ProductInCart.tsx","../src/components/PublicMenu/ProductVariants/ProductVariants.tsx","../src/components/PublicMenu/ProductAddons/ProductAddons.tsx","../src/components/PublicMenu/ProductDetails/ProductDetails.tsx","../src/components/PublicMenu/CartStepper/CartStepper.tsx","../src/components/PublicMenu/Cart/Cart.tsx","../src/hooks/product.ts","../src/components/PublicMenu/ProductQuantity/ProductQuantity.tsx","../src/components/PublicMenu/CartItem/OptionsInfo/OptionsInfo.tsx","../src/components/PublicMenu/CartItem/CartItem.tsx","../src/components/PublicMenu/CartDrawer/CartDrawer.tsx","../src/components/PublicMenu/Products/Products.tsx","../src/components/PublicMenu/Branches/Branches.tsx","../src/components/PublicMenu/PublicMenu.tsx","../src/utils/menu.ts","../src/components/Events/EventsToolbar.tsx","../src/components/Events/Events.tsx","../src/constants/pricing.ts","../src/components/Pricing/PricingPlanAmount.tsx","../src/components/Pricing/Pricing.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","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { createContext, ReactElement, useContext } from \"react\";\n\nimport { PublicMenuData } from \"src/models\";\n\nconst StoreContext = createContext<PublicMenuData>({} as PublicMenuData);\n\nconst DEFAULT_CURRENCY = \"AZN\";\nconst DEFAULT_LANGUAGE = \"az\";\n\nexport const StoreProvider = ({\n\tchildren,\n\tvalue,\n}: {\n\tchildren: ReactElement;\n\tvalue: PublicMenuData;\n}) => {\n\tconst storeValue = isEmpty(value) ? ({} as PublicMenuData) : value;\n\tif (!storeValue.currency) storeValue.currency = DEFAULT_CURRENCY;\n\tif (!storeValue.language) storeValue.language = DEFAULT_LANGUAGE;\n\n\treturn (\n\t\t<StoreContext.Provider value={isEmpty(value) ? ({} as PublicMenuData) : value}>\n\t\t\t{children}\n\t\t</StoreContext.Provider>\n\t);\n};\n\nexport const useStoreContext = () => useContext(StoreContext);\n","const GOAL_BASE_NAME = \"digital_menu\";\n\nexport const CATEGORY_SELECTED = `${GOAL_BASE_NAME}_category_select`;\nexport const CATEGORY_SCROLLED = `${GOAL_BASE_NAME}_category_scroll`;\nexport const PRODUCT_DETAILS = `${GOAL_BASE_NAME}_product_details`;\nexport const PRODUCT_ADD_CART = `${GOAL_BASE_NAME}_product_add_cart`;\nexport const PRODUCT_VIEW_CHANGED = `${GOAL_BASE_NAME}_product_view_changed`;\n\nexport const GOALS = [CATEGORY_SELECTED, CATEGORY_SCROLLED, PRODUCT_DETAILS, PRODUCT_ADD_CART];\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","import { useStoreContext } from \"src/store\";\nimport { rgbDataURL } from \"src/utils/image\";\n\ninterface Props\n\textends React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement> {\n\tplaceholder?: \"blur\" | \"empty\" | `data:image/${string}`;\n\tblurDataURL?: string;\n\tpriority?: boolean;\n\tquality?: number | `${number}`;\n}\n\nconst Image = (props: Props) => {\n\tconst {\n\t\tpriority: _,\n\t\tblurDataURL: __,\n\t\tquality: ___,\n\t\tplaceholder: ____,\n\t\tfetchPriority: _____,\n\t\t...imgProps\n\t} = props;\n\tconst { imageTag } = useStoreContext() || {};\n\n\tif (imageTag) {\n\t\tconst CustomImage: any = imageTag;\n\n\t\treturn (\n\t\t\t<CustomImage\n\t\t\t\t{...props}\n\t\t\t\tquality={props.quality || 100}\n\t\t\t\tplaceholder=\"blur\"\n\t\t\t\tblurDataURL={rgbDataURL(235, 59, 90)}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn <img {...imgProps} />;\n};\n\nexport default Image;\n","import { useState } from \"react\";\nimport { classNames, Row } from \"@sorocraft/ui\";\n\nimport styles from \"./Languages.module.scss\";\n\nimport { useStoreContext } from \"src/store\";\n\nconst Languages = () => {\n\tconst { language, languages, onLanguageSelect } = useStoreContext();\n\tconst [isOptionsOpen, setIsOptionsOpen] = useState(false);\n\n\tconst isBilingual = languages?.length > 1;\n\tconst otherLanguages = languages?.filter?.(({ code }) => code !== language) || [];\n\n\tconst getFlag = (code: string) => {\n\t\treturn `https://images.restaround.co/languages/${code}.svg`;\n\t};\n\n\tconst handleSelectLanguages = (code: string) => {\n\t\tif (onLanguageSelect) onLanguageSelect(code);\n\t};\n\n\tif (!isBilingual) return null;\n\n\treturn (\n\t\t<div className={styles.container} onClick={() => setIsOptionsOpen(!isOptionsOpen)}>\n\t\t\t<Row alignItems=\"center\" gap={0}>\n\t\t\t\t<Row\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\toptions: true,\n\t\t\t\t\t\tisOpen: isOptionsOpen,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t{otherLanguages.map(({ code }) => (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={getFlag(code)}\n\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\tkey={code}\n\t\t\t\t\t\t\tonClick={() => handleSelectLanguages(code)}\n\t\t\t\t\t\t\talt={code}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</Row>\n\t\t\t\t<img src={getFlag(language)} alt={language || \"\"} className={styles.currentLanguage} />\n\t\t\t</Row>\n\t\t</div>\n\t);\n};\nexport default Languages;\n","import { Column, Flex, IconLink, Row, SVGIcon, Tooltip } from \"@sorocraft/ui\";\nimport {\n\tMarkerPin,\n\tPhone,\n\tWifi,\n\tInstagram,\n\tWhatsapp,\n\tTiktok,\n\tFacebook,\n\tTelegram,\n} from \"@sorocraft/ui/icons\";\nimport { isEmpty } from \"@sorocraft/js-utils\";\n\nimport styles from \"./Header.module.scss\";\n\nimport * as branchModels from \"src/models/branch\";\nimport * as menuModels from \"src/models/menu\";\n\nimport Image from \"src/components/Image\";\n\nimport Languages from \"./Languages\";\n\ninterface Props\n\textends Pick<\n\t\tmenuModels.PublicMenuData,\n\t\t| \"coverImage\"\n\t\t| \"logoImage\"\n\t\t| \"name\"\n\t\t| \"instagram\"\n\t\t| \"facebook\"\n\t\t| \"whatsapp\"\n\t\t| \"telegram\"\n\t\t| \"tiktok\"\n\t> {\n\tbranch?: branchModels.Branch;\n}\n\nconst Header = ({\n\tbranch,\n\tcoverImage,\n\tlogoImage,\n\tname,\n\tinstagram,\n\tfacebook,\n\twhatsapp,\n\ttelegram,\n\ttiktok,\n}: Props) => {\n\tconst { address, latitude, longitude, phone, wifiPassword } = branch || {};\n\tconst noBranch = isEmpty(branch);\n\n\tconst googleMapLink = `https://www.google.com/maps/place/${latitude},${longitude}`;\n\n\tconst BranchInfo = () => (\n\t\t<Flex direction=\"row\" gap={1} alignItems=\"center\" fullWidth>\n\t\t\t<Flex.Item>\n\t\t\t\t<Image src={logoImage} alt={name} className={styles.logo} width={96} height={96} />\n\t\t\t</Flex.Item>\n\t\t\t<Flex.Item shrink className={styles.info}>\n\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t<h1 className={styles.name}>{name}</h1>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclassName={styles.address}\n\t\t\t\t\t\thref={googleMapLink}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Row alignItems=\"center\" gap={0.5}>\n\t\t\t\t\t\t\t<SVGIcon icon={MarkerPin} theme=\"dark\" />\n\t\t\t\t\t\t\t<span className={styles.addressText}>{address}</span>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</a>\n\t\t\t\t</Column>\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n\n\tconst BusinessInfo = () => (\n\t\t<Column fullWidth fullHeight alignItems=\"center\" justifyContent=\"center\">\n\t\t\t<Image src={logoImage} alt={name} className={styles.logo} width={96} height={96} />\n\t\t\t<div className={styles.info}>\n\t\t\t\t<h1 className={styles.name}>{name}</h1>\n\t\t\t</div>\n\t\t</Column>\n\t);\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<Image\n\t\t\t\tsrc={coverImage}\n\t\t\t\talt={name}\n\t\t\t\tclassName={styles.cover}\n\t\t\t\twidth={1024}\n\t\t\t\theight={400}\n\t\t\t\tpriority\n\t\t\t\tsizes=\"100vw\"\n\t\t\t\tfetchPriority=\"high\"\n\t\t\t\tloading=\"eager\"\n\t\t\t/>\n\t\t\t<div className={styles.content}>{noBranch ? <BusinessInfo /> : <BranchInfo />}</div>\n\t\t\t<Languages />\n\t\t\t{!noBranch && (\n\t\t\t\t<div className={styles.social}>\n\t\t\t\t\t<div className={styles.links}>\n\t\t\t\t\t\t<Row gap={2} alignItems=\"center\">\n\t\t\t\t\t\t\t<Row alignItems=\"center\" justifyContent=\"center\" gap={0.5}>\n\t\t\t\t\t\t\t\t{!!phone && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Phone}\n\t\t\t\t\t\t\t\t\t\thref={`tel:+${phone}`}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!whatsapp && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Whatsapp}\n\t\t\t\t\t\t\t\t\t\thref={`https://wa.me/${whatsapp}`}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!instagram && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Instagram}\n\t\t\t\t\t\t\t\t\t\thref={instagram}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!telegram && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Telegram}\n\t\t\t\t\t\t\t\t\t\thref={telegram}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!tiktok && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Tiktok}\n\t\t\t\t\t\t\t\t\t\thref={tiktok}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!facebook && (\n\t\t\t\t\t\t\t\t\t<IconLink\n\t\t\t\t\t\t\t\t\t\ticon={Facebook}\n\t\t\t\t\t\t\t\t\t\thref={facebook}\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t\t\t\t\ttheme=\"light\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!wifiPassword && (\n\t\t\t\t\t\t\t\t\t<Tooltip hint={wifiPassword}>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.wifiPassword}>\n\t\t\t\t\t\t\t\t\t\t\t<SVGIcon icon={Wifi} size=\"sm\" className={styles.wifiPasswordIcon} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\nexport default Header;\n","import { Carousel, CarouselItem, Chip, DivElementMap, UIElementType } from \"@sorocraft/ui\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { trackEvent } from \"@sorocraft/js-utils\";\n\nimport styles from \"./PublicMenu.module.scss\";\n\nimport * as menuModels from \"src/models/menu\";\nimport * as analyticsConstants from \"src/constants/analytics\";\n\ninterface Props {\n\tcategoryProductMap: menuModels.CategoryProductMap[];\n\tlanguage: string;\n\tselectedCategoryId: number;\n\tonSelectCategory: (id: number) => void;\n}\n\nconst Categories = ({\n\tcategoryProductMap = [],\n\tlanguage,\n\tselectedCategoryId,\n\tonSelectCategory,\n}: Props) => {\n\tconst categoryBlocksRef = useRef<DivElementMap>({});\n\tconst carouselRef = useRef<HTMLDivElement>(null);\n\n\tconst scrollToCategoryBlock = () => {\n\t\tconst categoryBlock = categoryBlocksRef?.current?.[selectedCategoryId];\n\t\tif (!categoryBlock || !carouselRef.current) return;\n\n\t\tconst carouselWidth = carouselRef.current.clientWidth;\n\t\tconst categoryLeft = categoryBlock.offsetLeft;\n\t\tconst categoryWidth = categoryBlock.offsetWidth;\n\n\t\tconst scrollLeft = categoryLeft - carouselWidth / 2 + categoryWidth / 2;\n\t\tcarouselRef.current.scrollTo({ left: scrollLeft, behavior: \"smooth\" });\n\t};\n\n\tconst handleSelectCategory = (id: number, name?: string) => {\n\t\tif (id === selectedCategoryId) return;\n\n\t\ttrackEvent(analyticsConstants.CATEGORY_SELECTED, { name });\n\t\tonSelectCategory(id);\n\t};\n\n\tconst handleGetCarouselRef = (ref: RefObject<HTMLDivElement>) => {\n\t\tif (!ref?.current) return;\n\t\tcarouselRef.current = ref.current;\n\t};\n\n\tuseEffect(() => {\n\t\tif (selectedCategoryId) scrollToCategoryBlock();\n\t}, [selectedCategoryId]);\n\n\treturn (\n\t\t<div className={styles.categories}>\n\t\t\t<Carousel gap={1} onGetRef={handleGetCarouselRef}>\n\t\t\t\t{(categoryProductMap || []).map(({ id, translations }) => {\n\t\t\t\t\tconst { name } = translations.find((item) => item.language === language) || {};\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CarouselItem key={id}>\n\t\t\t\t\t\t\t<Chip\n\t\t\t\t\t\t\t\tonClick={() => handleSelectCategory(id, name)}\n\t\t\t\t\t\t\t\ttype={UIElementType.BORDERED_PRIMARY}\n\t\t\t\t\t\t\t\tactive={id === selectedCategoryId}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) categoryBlocksRef.current[id] = el;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t</CarouselItem>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Carousel>\n\t\t</div>\n\t);\n};\nexport default Categories;\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"src/models/addon\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon.translations.find((t) => t.language === language)?.title || \"\";\n};\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\nimport { MenuAddon, MenuAddonSelectType, SelectedAddons } from \"src/models/addon\";\n\nimport { getAddonOptionRawPrice } from \"./addon\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductCartRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { MenuAddon } from \"./addon\";\n\nexport interface ProductTranslation {\n\tid: number;\n\tname: string;\n\tdescription?: string;\n\tlanguage: string;\n\tproductId: number;\n}\n\nexport interface ProductVariantTranslations {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface ProductVariant {\n\tid?: number;\n\tprice: number;\n\ttranslations: ProductVariantTranslations[];\n\tproductId?: number;\n\tremove?: boolean;\n}\n\nexport interface Product {\n\tid: number;\n\tcategoryId: number;\n\tvat?: number;\n\tprice: number;\n\tvolume?: string; // 100qr/250ml/1kq\n\timage160?: string;\n\timage580?: string;\n\timage1024?: string;\n\ttranslations: ProductTranslation[];\n\tvariants: ProductVariant[];\n\taddons: MenuAddon[];\n\tavailable?: boolean;\n\tvisible?: boolean;\n}\n\nexport enum ProductView {\n\tLIST = \"list\",\n\tGRID = \"grid\",\n}\n","export enum PlanType {\n\tAPPETIZER = \"appetizer\",\n\tMAIN_COURSE = \"mainCourse\",\n\tCHEFS_SPECIAL = \"chefsSpecial\",\n}\n\nexport interface PricingPlan {\n\ttitle: string;\n\tprice: {\n\t\tmonthly: number;\n\t\tannually: number;\n\t};\n\tdiscountedPrice?: number;\n}\n\nexport interface PricingPlans {\n\t[key: string]: PricingPlan;\n}\n\nexport type PricingInterval = \"monthly\" | \"annually\";\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getCartPrice = (item: CartItem, currency: string = \"USD\", language: string = \"en\") => {\n\tconst { price, vat, quantity, optionsPrice } = item || {};\n\tconst productPrice = calculateTotalPrice(price, quantity, vat);\n\tconst totalPrice = productPrice + optionsPrice * quantity;\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const generateCartId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the cart ID base with productId and variantId\n\tlet cartId = `${productId}`;\n\tif (variantId) {\n\t\tcartId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\tcartId += `-${addonIdsPart}`;\n\t}\n\n\treturn cartId;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { createContext, ReactNode, useContext, useMemo, useState } from \"react\";\n\nimport { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { Cart } from \"src/models/order\";\nimport { getProductCartRawPrice } from \"src/utils/product\";\nimport { generateCartId } from \"src/utils/cart\";\n\ntype UpdateCartProductParams = {\n\tproduct: Product;\n\tquantity?: number;\n\tvariantId?: number;\n\tselectedAddons?: SelectedAddons;\n};\n\ntype CartContent = {\n\tcart: Cart;\n\tisCartOpen: boolean;\n\taddProduct: (params: UpdateCartProductParams) => void;\n\tupdateProduct: (params: UpdateCartProductParams) => void;\n\tremoveAllProductVariants: (productId: number) => void;\n\tsetIsCartOpen: (state: boolean) => void;\n};\n\nconst CartContext = createContext<CartContent>({\n\tcart: {},\n\tisCartOpen: false,\n\taddProduct: () => {},\n\tupdateProduct: () => {},\n\tsetIsCartOpen: () => {},\n\tremoveAllProductVariants: () => {},\n} as CartContent);\n\nexport const CartProvider = ({ children }: { children: ReactNode }) => {\n\tconst [cart, setCart] = useState<Cart>({});\n\tconst [isCartOpen, setIsCartOpen] = useState<boolean>(false);\n\n\tconst updateCart = ({\n\t\tproduct,\n\t\tquantity,\n\t\tisAddOperation,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams & { isAddOperation: boolean }) => {\n\t\tif (isEmpty(product) || quantity < 0) return;\n\n\t\tconst { id, vat = 0 } = product;\n\t\tconst cartId = generateCartId(id, variantId, selectedAddons);\n\t\tconst { price, optionsPrice } = getProductCartRawPrice({\n\t\t\tproduct,\n\t\t\tvariantId,\n\t\t\tquantity: 1, // to save we just need price per quantity,\n\t\t\tselectedAddons,\n\t\t\tnoVat: true, // we will calculate vat later\n\t\t});\n\n\t\tsetCart((currentCart) => {\n\t\t\tconst existingItem = currentCart[cartId];\n\t\t\tconst newQuantity = isAddOperation ? (existingItem?.quantity || 0) + quantity : quantity;\n\n\t\t\t// Remove item if quantity is zero\n\t\t\tif (newQuantity <= 0) {\n\t\t\t\tconst { [cartId]: _, ...remainingCart } = currentCart;\n\t\t\t\treturn remainingCart;\n\t\t\t}\n\n\t\t\t// Update or add item\n\t\t\treturn {\n\t\t\t\t...currentCart,\n\t\t\t\t[cartId]: {\n\t\t\t\t\tproductId: id,\n\t\t\t\t\tprice,\n\t\t\t\t\toptionsPrice,\n\t\t\t\t\tquantity: newQuantity,\n\t\t\t\t\tvat,\n\t\t\t\t\tvariantId,\n\t\t\t\t\tselectedAddons,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t};\n\n\tconst addProduct = ({\n\t\tproduct,\n\t\tquantity = 1,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams) => {\n\t\treturn updateCart({ product, quantity, variantId, selectedAddons, isAddOperation: true });\n\t};\n\n\tconst updateProduct = ({\n\t\tproduct,\n\t\tquantity = 1,\n\t\tvariantId,\n\t\tselectedAddons,\n\t}: UpdateCartProductParams) => {\n\t\treturn updateCart({ product, quantity, variantId, selectedAddons, isAddOperation: false });\n\t};\n\n\tconst removeAllProductVariants = (productId: number) => {\n\t\tif (!productId || isEmpty(cart)) return;\n\n\t\t// Filter out cart items that do not belong to the given productId\n\t\tconst updatedCart = Object.entries(cart).reduce((acc, [cartId, cartItem]) => {\n\t\t\tif (cartItem.productId !== productId) {\n\t\t\t\tacc[cartId] = cartItem;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} as typeof cart);\n\n\t\t// Update the cart with the remaining items\n\t\tsetCart(updatedCart);\n\t};\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tcart,\n\t\t\tisCartOpen,\n\t\t\taddProduct,\n\t\t\tupdateProduct,\n\t\t\tsetIsCartOpen,\n\t\t\tremoveAllProductVariants,\n\t\t}),\n\t\t[cart, isCartOpen]\n\t);\n\n\treturn <CartContext.Provider value={contextValue}>{children}</CartContext.Provider>;\n};\n\nexport const useCartContext = () => useContext(CartContext);\n","export const translations = {\n\t[\"en\"]: {},\n\t[\"az\"]: {\n\t\t\"View order\": \"Şifarişi göstər\",\n\t\t\"Remove from order\": \"Sifarişdən sil\",\n\t\t\"Update order\": \"Sifarişi yenilə\",\n\t\t\"Add to order\": \"Sifarişə əlavə et\",\n\t\t\"Your order\": \"Sifarişiniz\",\n\t\tSubtotal: \"Ümumi\",\n\t\t\"Empty order\": \"Boş sifariş\",\n\t\t\"You don't have any items in your order\": \"Sifarişinizdə heç bir məhsul yoxdur\",\n\t\t\"Add items\": \"Məhsul əlavə et\",\n\t\tEvents: \"Hərəkətlər\",\n\t\t\"Scrolled to Category\": \"Kateqoriyaya sürüşdürdü\",\n\t\t\"Category Selected\": \"Kateqoriya seçildi\",\n\t\t\"Product Details\": \"Məhsul detalına baxıldı\",\n\t\t\"Product Added to Cart\": \"Səbətə əlavə edildi\",\n\t\t\"Product choices\": \"Seçimlər\",\n\t\t\"In order\": \"Sifarişdə\",\n\t\t\"Not available\": \"Mövcud deyil\",\n\t\t// PRICING\n\t\t\"Get Started\": \"İndi başla\",\n\t\t\"Choose Plan\": \"Planı seçin\",\n\t\t\"Smart QR Menu\": \"Ağıllı QR Menyu\",\n\t\t\"Link-in-bio\": \"Bio üçün link\",\n\t\t\"Menu Analytics\": \"Menyu analitikası\",\n\t\t\"Unlimited Products\": \"Limitsiz məhsul\",\n\t\t\"Unlimited Categories\": \"Limitsiz kateqoriya\",\n\t\t\"Product variants\": \"Məhsul variantları\",\n\t\t\"Product options\": \"Məhsul əlavələri\",\n\t\t\"Sales reports\": \"Satış hesabatı\",\n\t\t\"24/7 Support\": \"24/7 dəstək\",\n\t\t\"Multiple Branches\": \"Şöbələr\",\n\t\t\"Order Management\": \"Sifarişlərin idarə edilməsi\",\n\t\t\"Table Management\": \"Masaların idarə edilməsi\",\n\t\t\"Mobile App for Owners & Staff\": \"Rəhbərlik və ofisiantlar üçün Mobil tətbiq\",\n\t\t\"Point of Sale (POS)\": \"POS-kassa\",\n\t\t\"Delivery Management\": \"Çatdırılmaların idarə edilməsi\",\n\t\t\"Third-Party Delivery Integrations\": \"Çatdırılma partnyorlarının inteqrasiyası\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay ilə ödəniş\",\n\t\t\"Event management\": \"Tədbirlərin idarəsi\",\n\t\t\"Unlimited Users\": \"Limitsiz istifadəçi\",\n\t\t\"/ month\": \"/ Ay\",\n\t\tmonthly: \"Aylıq plan\",\n\t\tannually: \"İllik plan\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Hər biznesə uyğun tariflər - Sadə qiymətlər, daha çox dəyər!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Biznesinizə uyğun tarif planını seçin. Aylıq və ya illik abunə olun, uzunmüddətli planlarla daha çox qazanın!\",\n\t},\n\t[\"tr\"]: {\n\t\t\"View order\": \"Siparişi Görüntüle\",\n\t\t\"Remove from order\": \"Siparişten Kaldır\",\n\t\t\"Update order\": \"Siparişi Güncelle\",\n\t\t\"Add to order\": \"Siparişe Ekle\",\n\t\t\"Your order\": \"Siparişiniz\",\n\t\t\"Empty order\": \"Boş sipariş\",\n\t\t\"You don't have any items in your order\": \"Siparişinizde hiç bir ürün yok\",\n\t\t\"Add items\": \"Ürün ekle\",\n\t\tSubtotal: \"Toplam\",\n\t\tEvents: \"Olaylar\",\n\t\t\"Product choices\": \"Seçenekler\",\n\t\t\"In order\": \"Siparişte\",\n\t\t\"Not available\": \"Mevcut değil\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Hemen Başla\",\n\t\t\"Choose Plan\": \"Planı seçin\",\n\t\t\"Smart QR Menu\": \"Akıllı QR Menü\",\n\t\t\"Link-in-bio\": \"Bio için link\",\n\t\t\"Menu Analytics\": \"Menü Analitiği\",\n\t\t\"Unlimited Users\": \"Sınırsız kullanıcı\",\n\t\t\"Unlimited Products\": \"Sınırsız ürün\",\n\t\t\"Unlimited Categories\": \"Sınırsız kategori\",\n\t\t\"Product variants\": \"Ürün çeşitleri\",\n\t\t\"Product options\": \"Ürün seçenekleri\",\n\t\t\"Sales reports\": \"Satış raporu\",\n\t\t\"24/7 Support\": \"24/7 Teknik Destek\",\n\t\t\"Multiple Branches\": \"Şube Yönetimi\",\n\t\t\"Table Management\": \"Masa Yönetimi\",\n\t\t\"Order Management\": \"Sipariş Yönetimi\",\n\t\t\"Mobile App for Owners & Staff\": \"Patron ve Personel için Mobil Uygulama\",\n\t\t\"Point of Sale (POS)\": \"POS Adisyon Sistemi\",\n\t\t\"Delivery Management\": \"Paket sipariş yönetimi\",\n\t\t\"Third-Party Delivery Integrations\": \"Üçüncü Parti Teslimat Entegrasyonları\",\n\t\t\"RestaroundPay with Mobile\": \"Mobil ile RestaroundPay\",\n\t\t\"Event management\": \"Etkinlik yönetimi\",\n\t\t\"/ month\": \"/ Ay\",\n\t\tmonthly: \"Aylık\",\n\t\tannually: \"Yıllık\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"İşletmenize uygun abonelik planını seçin. Aylık veya yıllık abone olun, uzun vadeli planlarla daha fazla tasarruf edin!\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Her işletmeye uygun esnek planlar - Basit fiyatlandırma, daha fazla avantaj!\",\n\t},\n\t[\"nl\"]: {\n\t\t\"View order\": \"Bestelling bekijken\",\n\t\t\"Remove from order\": \"Uit bestelling verwijderen\",\n\t\t\"Update order\": \"Bestelling bijwerken\",\n\t\t\"Add to order\": \"Aan bestelling toevoegen\",\n\t\t\"Your order\": \"Uw bestelling\",\n\t\t\"Empty order\": \"Lege bestelling\",\n\t\t\"You don't have any items in your order\": \"U heeft geen items in uw bestelling\",\n\t\t\"Add items\": \"Items toevoegen\",\n\t\tSubtotal: \"Totaal\",\n\t\tEvents: \"Gebeurtenissen\",\n\t\t\"Product choices\": \"Productkeuzes\",\n\t\t\"In order\": \"In bestelling\",\n\t\t\"Not available\": \"Niet beschikbaar\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Start nu\",\n\t\t\"Choose Plan\": \"Kies een plan\",\n\t\t\"Smart QR Menu\": \"Slimme QR-menu\",\n\t\t\"Link-in-bio\": \"Link-in-bio\",\n\t\t\"Menu Analytics\": \"Menu analyse\",\n\t\t\"Unlimited Products\": \"Onbeperkte producten\",\n\t\t\"Unlimited Categories\": \"Onbeperkte categorieën\",\n\t\t\"Unlimited Users\": \"Onbeperkte gebruikers\",\n\t\t\"Product variants\": \"Productvarianten\",\n\t\t\"Product options\": \"Productopties\",\n\t\t\"Sales reports\": \"Verkooprapporten\",\n\t\t\"24/7 Support\": \"24/7 ondersteuning\",\n\t\t\"Multiple Branches\": \"Meerdere vestigingen\",\n\t\t\"Table Management\": \"Tafelbeheer\",\n\t\t\"Order Management\": \"Orderbeheer\",\n\t\t\"Mobile App for Owners & Staff\": \"Mobiele app voor eigenaren en personeel\",\n\t\t\"Point of Sale (POS)\": \"Kassasysteem (POS)\",\n\t\t\"Delivery Management\": \"Leveringsbeheer\",\n\t\t\"Third-Party Delivery Integrations\": \"Integraties van derden\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay met mobiel\",\n\t\t\"Event management\": \"Beheer van evenementen\",\n\t\t\"/ month\": \"/ maand\",\n\t\tmonthly: \"Maandelijks\",\n\t\tannually: \"Jaarlijks\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Kies een abonnementsplan dat bij jouw bedrijf past. Abonneer je maandelijks of jaarlijks en bespaar meer met een lange termijn plan!\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Flexibele abonnementen voor elk bedrijf - Eenvoudige prijzen, meer waarde!\",\n\t},\n\t[\"et\"]: {\n\t\t\"View order\": \"Vaata tellimust\",\n\t\t\"Remove from order\": \"Eemalda tellimusest\",\n\t\t\"Update order\": \"Uuenda tellimust\",\n\t\t\"Add to order\": \"Lisa tellimusele\",\n\t\t\"Your order\": \"Teie tellimus\",\n\t\t\"Empty order\": \"Tühi tellimus\",\n\t\t\"You don't have any items in your order\": \"Teie tellimuses pole ühtegi eset\",\n\t\t\"Add items\": \"Lisa esemeid\",\n\t\tSubtotal: \"Kokku\",\n\t\tEvents: \"Sündmused\",\n\t\t\"Product choices\": \"Tootevalikud\",\n\t\t\"In order\": \"Tellimuses\",\n\t\t\"Not available\": \"Ei ole saadaval\",\n\t\t// PRiCING\n\t\t\"Get Started\": \"Alustage\",\n\t\t\"Choose Plan\": \"Vali plaan\",\n\t\t\"Smart QR Menu\": \"Nutikas QR-menüü\",\n\t\t\"Link-in-bio\": \"Link-in-bio\",\n\t\t\"Menu Analytics\": \"Menüü Analüütika\",\n\t\t\"Unlimited Products\": \"Piiramata tooted\",\n\t\t\"Unlimited Categories\": \"Piiramata kategooriad\",\n\t\t\"Product variants\": \"Tootevariandid\",\n\t\t\"Product options\": \"Toote valikud\",\n\t\t\"Sales reports\": \"Müügiaruanded\",\n\t\t\"24/7 Support\": \"24/7 tugi\",\n\t\t\"Multiple Branches\": \"Mitu filiaali\",\n\t\t\"Table Management\": \"Tabelite haldamine\",\n\t\t\"Order Management\": \"Tellimuste haldamine\",\n\t\t\"Mobile App for Owners & Staff\": \"Mobiilirakendus omanikele ja töötajatele\",\n\t\t\"Point of Sale (POS)\": \"Müügipunkt (POS)\",\n\t\t\"Delivery Management\": \"Tarnejuhtimine\",\n\t\t\"Third-Party Delivery Integrations\": \"Kolmanda osapoole tarneintegratsioonid\",\n\t\t\"RestaroundPay with Mobile\": \"RestaroundPay koos mobiiliga\",\n\t\t\"Event management\": \"Sündmuste haldamine\",\n\t\t\"Unlimited Users\": \"Piiramatu arv kasutajaid\",\n\t\t\"/ month\": \"/ kuus\",\n\t\tmonthly: \"Igakuine\",\n\t\tannually: \"Igal aastal\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Paindlikud plaanid igale ettevõttele - Lihtne hind, rohkem väärtust!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Vali tellimus, mis sobib sinu ettevõttele. Telli igakuiselt või kord aastas ning säästa rohkem pikaajaliste plaanidega!\",\n\t},\n\t[\"ru\"]: {\n\t\t\"View order\": \"Посмотреть заказ\",\n\t\t\"Remove from order\": \"Удалить из заказа\",\n\t\t\"Update order\": \"Обновить заказ\",\n\t\t\"Add to order\": \"Добавить в заказ\",\n\t\t\"Your order\": \"Ваш заказ\",\n\t\t\"Empty order\": \"Пустой заказ\",\n\t\t\"You don't have any items in your order\": \"В вашем заказе нет товаров\",\n\t\t\"Add items\": \"Добавить товары\",\n\t\tSubtotal: \"Итого\",\n\t\tEvents: \"События\",\n\t\t\"Product choices\": \"Варианты товара\",\n\t\t\"In order\": \"В заказе\",\n\t\t\"Not available\": \"Не доступен\",\n\t\t// PRICING\n\t\t\"Get Started\": \"Начать\",\n\t\t\"Choose Plan\": \"Выберите план\",\n\t\t\"Smart QR Menu\": \"Умное меню по QR-коду\",\n\t\t\"Link-in-bio\": \"Ссылка в био\",\n\t\t\"Menu Analytics\": \"Аналитика меню\",\n\t\t\"Unlimited Users\": \"Неограниченные пользователи\",\n\t\t\"Unlimited Products\": \"Неограниченные продукты\",\n\t\t\"Unlimited Categories\": \"Неограниченные категории\",\n\t\t\"Product variants\": \"Варианты продуктов\",\n\t\t\"Product options\": \"Дополнения к продукту\",\n\t\t\"Sales reports\": \"Отчеты о продажах\",\n\t\t\"24/7 Support\": \"24/7 техническая поддержка\",\n\t\t\"Multiple Branches\": \"Многочисленные филиалы\",\n\t\t\"Table Management\": \"Управление столами\",\n\t\t\"Order Management\": \"Управление заказами\",\n\t\t\"Mobile App for Owners & Staff\": \"Мобильное приложение для владельцев и персонала\",\n\t\t\"Point of Sale (POS)\": \"POS-касса\",\n\t\t\"Delivery Management\": \"Управление доставкой\",\n\t\t\"Third-Party Delivery Integrations\": \"Интеграция со сторонними поставщиками\",\n\t\t\"RestaroundPay with Mobile\": \"«RestaroundPay» с мобильного\",\n\t\t\"Event management\": \"Управление мероприятиями\",\n\t\t\"/ month\": \"/ месяц\",\n\t\tmonthly: \"Ежемесячный план\",\n\t\tannually: \"Годовой план\",\n\t\t\"Flexible Plans for Every Business - Simple Pricing, More Value!\":\n\t\t\t\"Тарифы для любого бизнеса - Простой прайс, больше возможностей!\",\n\t\t\"Choose a pricing plan that fits your business. Subscribe monthly or annually and save more with long-term plans!\":\n\t\t\t\"Выберите тарифный план, который подходит вашему бизнесу. Подписывайтесь помесячно или ежегодно и экономьте больше с долгосрочными планами!\",\n\t},\n};\n","import { translations } from \"src/constants/translations\";\nimport { useStoreContext } from \"src/store\";\n\nexport const useTranslation = (lang?: string) => {\n\tconst { language } = useStoreContext();\n\tconst locale = lang || language;\n\n\tconst t = (key: string) => translations[locale]?.[key] || key;\n\n\treturn { t };\n};\n","import { Column, IconButton, Row, UIElementType, Text } from \"@sorocraft/ui\";\nimport { classNames, trackEvent } from \"@sorocraft/js-utils\";\nimport { Plus } from \"@sorocraft/ui/icons\";\nimport { MouseEvent, useMemo } from \"react\";\n\nimport styles from \"./ProductsListItem.module.scss\";\n\nimport * as productModels from \"src/models/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { useCartContext } from \"src/store/cart\";\nimport { getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport Image from \"src/components/Image\";\n\ninterface Props {\n\tproduct: productModels.Product;\n\tcurrency: string;\n\tlanguage: string;\n\tonClick?: () => void;\n}\n\nconst ProductsListItem = ({ product, currency, language, onClick }: Props) => {\n\tconst { addProduct } = useCartContext();\n\tconst { image160, volume, available } = product || {};\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\tconst { t } = useTranslation();\n\n\tconst hasVariant = product?.variants?.length > 0;\n\tconst hasAddons = product?.addons?.length > 0;\n\tconst hasImage = !!image160;\n\n\tconst handleAddToCart = (e: MouseEvent<HTMLElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif ((hasVariant || hasAddons) && onClick) return onClick();\n\n\t\taddProduct({ product });\n\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity: 1 });\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tisClickable: !!onClick,\n\t\t\t\tnoImage: !hasImage,\n\t\t\t})}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<Row justifyContent=\"space-between\" gap={0}>\n\t\t\t\t<div className={styles.info}>\n\t\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t\t<h3 className={styles.name}>{name}</h3>\n\t\t\t\t\t\t<p className={styles.description}>{description}</p>\n\t\t\t\t\t\t<Row className={styles.price} gap={0.5} fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t<span>{formattedTotalPrice}</span>\n\t\t\t\t\t\t\t{!!volume && <Text color=\"muted\">{volume}</Text>}\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t{!available && (\n\t\t\t\t\t\t\t<Text size=\"xs\" color=\"danger\" className={styles.notAvailableText}>\n\t\t\t\t\t\t\t\t{t(\"Not available\")}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Column>\n\t\t\t\t</div>\n\t\t\t\t{hasImage && (\n\t\t\t\t\t<Image\n\t\t\t\t\t\tsrc={getImageSource(image160)}\n\t\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\timage: true,\n\t\t\t\t\t\t\tnotAvailable: !available,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\twidth={160}\n\t\t\t\t\t\theight={90}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Row>\n\t\t\t{available && (\n\t\t\t\t<div className={styles.addToCart}>\n\t\t\t\t\t<IconButton onClick={handleAddToCart} icon={Plus} type={UIElementType.DEFAULT} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\nexport default ProductsListItem;\n","import { Column, IconButton, Row, UIElementType, Text } from \"@sorocraft/ui\";\nimport { classNames, trackEvent } from \"@sorocraft/js-utils\";\nimport { Plus } from \"@sorocraft/ui/icons\";\nimport { MouseEvent, useMemo } from \"react\";\n\nimport styles from \"./ProductsGridItem.module.scss\";\n\nimport * as productModels from \"src/models/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { useCartContext } from \"src/store/cart\";\nimport { getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport Image from \"src/components/Image\";\n\ninterface Props {\n\tproduct: productModels.Product;\n\tcurrency: string;\n\tlanguage: string;\n\tonClick?: () => void;\n}\n\nconst ProductsGridItem = ({ product, currency, language, onClick }: Props) => {\n\tconst { addProduct } = useCartContext();\n\tconst { volume, image580, image160, image1024, available } = product || {};\n\tconst image = image580 || image1024 || image160;\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\tconst { t } = useTranslation();\n\n\tconst hasVariant = product?.variants?.length > 0;\n\tconst hasAddons = product?.addons?.length > 0;\n\n\tconst handleAddToCart = (e: MouseEvent<HTMLElement>) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tif ((hasVariant || hasAddons) && onClick) return onClick();\n\n\t\taddProduct({ product });\n\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity: 1 });\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div\n\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\tcontent: true,\n\t\t\t\t\tisClickable: !!onClick,\n\t\t\t\t\tnoImage: !image,\n\t\t\t\t})}\n\t\t\t\tonClick={onClick}\n\t\t\t>\n\t\t\t\t{image && (\n\t\t\t\t\t<div className={styles.imageContainer}>\n\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\tsrc={getImageSource(image)}\n\t\t\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\t\timage: true,\n\t\t\t\t\t\t\t\tnotAvailable: !available,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\twidth={580}\n\t\t\t\t\t\t\theight={326}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div className={styles.info}>\n\t\t\t\t\t<div className={styles.data}>\n\t\t\t\t\t\t<Column gap={0.25}>\n\t\t\t\t\t\t\t<h3 className={styles.name}>{name}</h3>\n\t\t\t\t\t\t\t<p className={styles.description}>{description}</p>\n\n\t\t\t\t\t\t\t<Row className={styles.price} gap={0.5} fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t<span>{formattedTotalPrice}</span>\n\t\t\t\t\t\t\t\t{!!volume && (\n\t\t\t\t\t\t\t\t\t<Text color=\"white\" className={styles.volume}>\n\t\t\t\t\t\t\t\t\t\t{volume}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t{!available && (\n\t\t\t\t\t\t\t\t<Text color=\"white\" size=\"xs\" className={styles.notAvailableText}>\n\t\t\t\t\t\t\t\t\t{t(\"Not available\")}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{available && (\n\t\t\t\t\t<div className={styles.addToCart}>\n\t\t\t\t\t\t<IconButton onClick={handleAddToCart} icon={Plus} type={UIElementType.DEFAULT} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\nexport default ProductsGridItem;\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { CartItem } from \"src/models/order\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { generateCartId, getCartPrice } from \"src/utils/cart\";\n\nexport const useTotalCartItemsCount = () => {\n\tconst { cart } = useCartContext();\n\n\treturn Object.values(cart || {}).reduce((sum, item) => sum + item.quantity, 0);\n};\n\nexport const useCartTotalPrice = (): { totalPrice: number; formattedTotalPrice: string } => {\n\tconst { cart } = useCartContext();\n\tconst { currency, language } = useStoreContext();\n\n\tconst cartTotalPrice = Object.values(cart || {}).reduce((sum, item: CartItem) => {\n\t\tconst { totalPrice } = getCartPrice(item);\n\t\treturn sum + totalPrice;\n\t}, 0);\n\n\treturn {\n\t\ttotalPrice: cartTotalPrice,\n\t\tformattedTotalPrice: priceFormatter(cartTotalPrice, currency, language),\n\t};\n};\n\nexport const useProductQuantityInCart = ({\n\tproductId,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproductId: number;\n\tvariantId?: number | null;\n\tselectedAddons: SelectedAddons;\n}): number => {\n\tconst { cart } = useCartContext();\n\tif (isEmpty(cart) || !productId) return 0;\n\n\tconst cartId = generateCartId(productId, variantId, selectedAddons);\n\n\treturn cart[cartId]?.quantity || 0;\n};\n\nexport const useProductQuantityInCartWithAllVariants = (productId: number): number => {\n\tconst { cart } = useCartContext();\n\tif (isEmpty(cart) || !productId) return 0;\n\n\t// get all cart items with the same product id\n\tconst cartItems = Object.values(cart).filter((item) => item.productId === productId);\n\n\t// get the total quantity of all cart items with the same product id\n\tconst totalQuantity = cartItems.reduce((sum, item) => sum + item.quantity, 0);\n\n\treturn totalQuantity;\n};\n","import { Row, SIZE, SVGIcon } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\nimport { Minus, Plus } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./Quantity.module.scss\";\n\ninterface Props {\n\tisDecreaseDisabled?: boolean;\n\tquantity?: number;\n\tsize?: SIZE;\n\tonIncrease: () => void;\n\tonDecrease: () => void;\n}\n\nconst Quantity = ({\n\tisDecreaseDisabled = false,\n\tquantity = 1,\n\tsize = \"md\",\n\tonIncrease,\n\tonDecrease,\n}: Props) => {\n\treturn (\n\t\t<Row\n\t\t\tclassName={classNames(\n\t\t\t\tstyles,\n\t\t\t\t{\n\t\t\t\t\tcontainer: true,\n\t\t\t\t},\n\t\t\t\t[styles[size]]\n\t\t\t)}\n\t\t\tjustifyContent=\"space-between\"\n\t\t\tgap={0}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\tquantityAction: true,\n\t\t\t\t\tisDisabled: isDecreaseDisabled,\n\t\t\t\t})}\n\t\t\t\tonClick={onDecrease}\n\t\t\t>\n\t\t\t\t<SVGIcon icon={Minus} />\n\t\t\t</div>\n\t\t\t<div className={styles.quantityValue}>{quantity}</div>\n\t\t\t<div className={styles.quantityAction} onClick={onIncrease}>\n\t\t\t\t<SVGIcon icon={Plus} />\n\t\t\t</div>\n\t\t</Row>\n\t);\n};\nexport default Quantity;\n","import { Flex, IconButton, Row, UIElementType } from \"@sorocraft/ui\";\nimport { ShoppingBag, Trash } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./ProductInCart.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useProductQuantityInCartWithAllVariants } from \"src/hooks/cart\";\n\ninterface Props {\n\tproductId: number;\n\tonModalClose: () => void;\n}\n\nconst ProductInCart = ({ productId, onModalClose }: Props) => {\n\tconst { setIsCartOpen, removeAllProductVariants } = useCartContext();\n\tconst { t } = useTranslation();\n\tconst quantity = useProductQuantityInCartWithAllVariants(productId);\n\n\tconst handleOpenCart = () => {\n\t\tsetIsCartOpen(true);\n\t\tif (onModalClose) onModalClose();\n\t};\n\n\tconst handleRemoveAllFromCart = () => {\n\t\tremoveAllProductVariants(productId);\n\t};\n\n\tif (quantity <= 0) return null;\n\n\treturn (\n\t\t<Flex className={styles.container} fullWidth justifyContent=\"space-between\" alignItems=\"center\">\n\t\t\t<Flex.Item flex={1} className={styles.title}>\n\t\t\t\t{t(\"In order\")} ({quantity})\n\t\t\t</Flex.Item>\n\n\t\t\t<Flex.Item flex={0}>\n\t\t\t\t<Row>\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\ticon={Trash}\n\t\t\t\t\t\tonClick={handleRemoveAllFromCart}\n\t\t\t\t\t\ttype={UIElementType.DANGER}\n\t\t\t\t\t\ttooltip={t(\"Remove from order\")}\n\t\t\t\t\t/>\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\ticon={ShoppingBag}\n\t\t\t\t\t\tonClick={handleOpenCart}\n\t\t\t\t\t\ttype={UIElementType.SUCCESS}\n\t\t\t\t\t\ttooltip={t(\"View order\")}\n\t\t\t\t\t/>\n\t\t\t\t</Row>\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n};\nexport default ProductInCart;\n","import { useEffect, useRef } from \"react\";\nimport { Column, Input, InputType, Row } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\n\nimport styles from \"./ProductVariants.module.scss\";\n\nimport { getProductVariantPrice, getProductVariantTranslation } from \"src/utils/product\";\nimport { Product } from \"src/models/product\";\nimport { useStoreContext } from \"src/store\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tproduct: Product;\n\tselectedVariant: number;\n\tfocusedSection: string;\n\tonSelectVariant: (id: number) => void;\n}\n\nconst ProductVariants = ({ product, selectedVariant, focusedSection, onSelectVariant }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\tconst { t } = useTranslation();\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tconst { variants } = product || {};\n\n\tconst isVariantsFocused = focusedSection === \"variant\";\n\n\tuseEffect(() => {\n\t\tif (isVariantsFocused && containerRef.current) {\n\t\t\tcontainerRef.current.scrollIntoView({ behavior: \"smooth\" });\n\t\t}\n\t}, [focusedSection]);\n\n\treturn (\n\t\t<Column\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tfocused: isVariantsFocused,\n\t\t\t})}\n\t\t\tgap={1}\n\t\t\tfullWidth\n\t\t>\n\t\t\t<div className={styles.variantsTitle} ref={containerRef}>\n\t\t\t\t{t(\"Product choices\")}\n\t\t\t</div>\n\t\t\t{(variants || []).map((variant) => {\n\t\t\t\tconst { id } = variant || {};\n\t\t\t\tconst { formattedTotalPrice: formattedTotalVariantPrice } = getProductVariantPrice({\n\t\t\t\t\tvariantId: id,\n\t\t\t\t\tlanguage,\n\t\t\t\t\tcurrency,\n\t\t\t\t\tproduct,\n\t\t\t\t});\n\n\t\t\t\tconst { title } = getProductVariantTranslation(variant, language);\n\n\t\t\t\treturn (\n\t\t\t\t\t<Row\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\t\tonClick={() => onSelectVariant(id)}\n\t\t\t\t\t\tclassName={styles.variant}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel={title}\n\t\t\t\t\t\t\tname=\"variant\"\n\t\t\t\t\t\t\tonChange={() => onSelectVariant(id)}\n\t\t\t\t\t\t\tchecked={selectedVariant === id}\n\t\t\t\t\t\t\ttype={InputType.RADIO}\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tnoMargin\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className={styles.variantPrice}>{formattedTotalVariantPrice}</div>\n\t\t\t\t\t</Row>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Column>\n\t);\n};\nexport default ProductVariants;\n","import { Column, Input, InputType, Row, Text } from \"@sorocraft/ui\";\n\nimport styles from \"./ProductAddons.module.scss\";\n\nimport { Product } from \"src/models/product\";\nimport { getAddonOptionTranslation, getAddonTranslation, getOptionPrice } from \"src/utils/addon\";\nimport { useStoreContext } from \"src/store\";\nimport { SelectedAddons, MenuAddonSelectType } from \"src/models/addon\";\n\ninterface Props {\n\tproduct: Product;\n\tselectedAddons: SelectedAddons;\n\tonOptionSelect: (selection: {\n\t\taddonId: number;\n\t\toptionId: number;\n\t\tisSingle: boolean;\n\t\tisRemove?: boolean;\n\t}) => void;\n}\n\nconst ProductAddons = ({ product, selectedAddons, onOptionSelect }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\n\tconst { addons } = product || {};\n\treturn (\n\t\t<Column className={styles.container} gap={1.5} fullWidth>\n\t\t\t{(addons || []).map((addon) => {\n\t\t\t\tconst { id: addonId, options, selectType } = addon || {};\n\t\t\t\tconst { title } = getAddonTranslation(addon, language);\n\n\t\t\t\treturn (\n\t\t\t\t\t<Column key={addonId}>\n\t\t\t\t\t\t<Text variant=\"bold\">{title}</Text>\n\t\t\t\t\t\t<Column gap={1} fullWidth>\n\t\t\t\t\t\t\t{(options || []).map((option) => {\n\t\t\t\t\t\t\t\tconst { id: optionId } = option || {};\n\n\t\t\t\t\t\t\t\tconst { formattedTotalPrice: formattedTotalOptionPrice } = getOptionPrice({\n\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\t\t\t\tcurrency,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst { title: optionTitle } = getAddonOptionTranslation(option, language);\n\t\t\t\t\t\t\t\tconst isSingle = selectType === MenuAddonSelectType.SINGLE;\n\t\t\t\t\t\t\t\tconst checked = isSingle\n\t\t\t\t\t\t\t\t\t? selectedAddons[addonId] === optionId\n\t\t\t\t\t\t\t\t\t: ((selectedAddons[addonId] || []) as number[]).includes(optionId);\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Row key={optionId} justifyContent=\"space-between\" className={styles.option}>\n\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\tlabel={optionTitle}\n\t\t\t\t\t\t\t\t\t\t\tname={`option-${addonId}`}\n\t\t\t\t\t\t\t\t\t\t\tonChange={() =>\n\t\t\t\t\t\t\t\t\t\t\t\tonOptionSelect({\n\t\t\t\t\t\t\t\t\t\t\t\t\taddonId,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSingle,\n\t\t\t\t\t\t\t\t\t\t\t\t\tisRemove: !isSingle && checked,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tchecked={checked}\n\t\t\t\t\t\t\t\t\t\t\ttype={isSingle ? InputType.RADIO : InputType.CHECKBOX}\n\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t\tnoMargin\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<div className={styles.optionPrice}>{formattedTotalOptionPrice}</div>\n\t\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t</Column>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Column>\n\t);\n};\nexport default ProductAddons;\n","import { isEmpty, trackEvent } from \"@sorocraft/js-utils\";\nimport { Button, Column, IconButton, Modal, Row } from \"@sorocraft/ui\";\nimport { useEffect, useMemo, useRef, useState, MouseEvent } from \"react\";\nimport { Close } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./ProductDetails.module.scss\";\n\nimport { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { getImageSource } from \"src/utils/image\";\nimport { getProductCartPrice, getProductPrice, getProductTranslation } from \"src/utils/product\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useProductQuantityInCart } from \"src/hooks/cart\";\nimport * as analyticsConstants from \"src/constants/analytics\";\n\nimport Image from \"src/components/Image\";\nimport Quantity from \"src/components/Quantity\";\nimport ProductInCart from \"../ProductInCart\";\nimport ProductVariants from \"../ProductVariants\";\nimport ProductAddons from \"../ProductAddons\";\n\ninterface Props {\n\tproduct: Product;\n\tonClose: () => void;\n}\n\n// Product modal\nconst ProductDetails = ({ product, onClose }: Props) => {\n\tconst { language, currency } = useStoreContext();\n\tconst { addProduct, updateProduct } = useCartContext();\n\tconst [quantity, setQuantity] = useState<number>(1);\n\tconst [isUpdate, setIsUpdate] = useState<boolean>(false);\n\tconst [selectedVariant, setSelectedVariant] = useState<number | null>(null);\n\tconst [focusedSection, setFocusedSection] = useState<string | null>(null);\n\tconst [selectedAddons, setSelectedAddons] = useState<SelectedAddons>({});\n\tconst modalRef = useRef<HTMLDivElement>(null);\n\tconst { t } = useTranslation();\n\n\tconst productQuantityInCart = useProductQuantityInCart({\n\t\tproductId: product?.id,\n\t\tvariantId: selectedVariant,\n\t\tselectedAddons,\n\t});\n\tconst { name, description } = useMemo(\n\t\t() => getProductTranslation(product, language),\n\t\t[product, language]\n\t);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getProductPrice(product, currency, language),\n\t\t[product, currency, language]\n\t);\n\n\tconst { formattedTotalPrice: formattedTotalCartPrice } = useMemo(\n\t\t() =>\n\t\t\tgetProductCartPrice({\n\t\t\t\tproduct,\n\t\t\t\tquantity,\n\t\t\t\tlanguage,\n\t\t\t\tcurrency,\n\t\t\t\tvariantId: selectedVariant,\n\t\t\t\tselectedAddons,\n\t\t\t}),\n\t\t[product, quantity, language, currency, selectedVariant, selectedAddons]\n\t);\n\n\tconst isDecreaseDisabled = isUpdate ? quantity === 0 : quantity === 1;\n\tconst actionTitle = useMemo(\n\t\t() =>\n\t\t\tisUpdate ? (quantity === 0 ? t(\"Remove from order\") : t(\"Update order\")) : t(\"Add to order\"),\n\t\t[isUpdate, quantity]\n\t);\n\n\tuseEffect(() => {\n\t\tsetQuantity(productQuantityInCart > 0 ? productQuantityInCart : 1);\n\t\tsetIsUpdate(productQuantityInCart > 0);\n\t}, [productQuantityInCart, product]);\n\n\tuseEffect(() => {\n\t\tsetSelectedVariant(null);\n\t\tsetSelectedAddons({});\n\t}, [product]);\n\n\tconst handleClickOutside = (event: MouseEvent) => {\n\t\tif (!modalRef?.current?.contains?.(event?.target as Node)) {\n\t\t\tif (onClose) onClose();\n\t\t}\n\t};\n\n\tconst handleSetFocusedSection = (section: string) => {\n\t\tsetFocusedSection(section);\n\n\t\tsetTimeout(() => {\n\t\t\tsetFocusedSection(null);\n\t\t}, 200);\n\t};\n\n\tconst handleSubmit = () => {\n\t\tconst hasVariant = product?.variants?.length > 0;\n\n\t\tif (hasVariant && !selectedVariant) return handleSetFocusedSection(\"variant\");\n\n\t\tif (isUpdate) {\n\t\t\tupdateProduct({ product, quantity, variantId: selectedVariant, selectedAddons });\n\t\t} else {\n\t\t\taddProduct({ product, quantity, variantId: selectedVariant, selectedAddons });\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_ADD_CART, { name, quantity });\n\t\t}\n\t\tif (onClose) onClose();\n\t};\n\n\tconst adjustQuantity = (amount: number) => {\n\t\tif (amount === -1 && isDecreaseDisabled) return;\n\n\t\tsetQuantity((current) => Math.max(0, current + amount));\n\t};\n\n\tconst handleOptionSelect = ({\n\t\taddonId,\n\t\toptionId,\n\t\tisSingle,\n\t\tisRemove = false,\n\t}: {\n\t\taddonId: number;\n\t\toptionId: number;\n\t\tisSingle: boolean;\n\t\tisRemove?: boolean;\n\t}) => {\n\t\tsetSelectedAddons((prevForm) => {\n\t\t\t// For single selection, directly replace the value\n\t\t\tif (isSingle) {\n\t\t\t\treturn { ...prevForm, [addonId]: optionId };\n\t\t\t}\n\n\t\t\t// Handle multiple selection\n\t\t\tconst previousSelection = (prevForm[addonId] || []) as number[];\n\t\t\tconst updatedSelection = isRemove\n\t\t\t\t? previousSelection.filter((id) => id !== optionId) // Remove `optionId`\n\t\t\t\t: [...new Set([...previousSelection, optionId])]; // Add `optionId`\n\n\t\t\treturn {\n\t\t\t\t...prevForm,\n\t\t\t\t[addonId]: updatedSelection,\n\t\t\t};\n\t\t});\n\t};\n\n\tif (isEmpty(product)) return null;\n\n\tconst { image1024, volume, variants, addons, available } = product;\n\tconst hasVariants = variants?.length > 0;\n\tconst hasAddons = addons?.length > 0;\n\n\treturn (\n\t\t<div className={styles.container} onClick={handleClickOutside}>\n\t\t\t<Modal\n\t\t\t\tonClose={onClose}\n\t\t\t\tref={modalRef}\n\t\t\t\tnoBodyPadding\n\t\t\t\tsize=\"small\"\n\t\t\t\tcontent={\n\t\t\t\t\t<div className={styles.content}>\n\t\t\t\t\t\t<Column gap={0}>\n\t\t\t\t\t\t\t{image1024 && (\n\t\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\t\tsrc={getImageSource(image1024)}\n\t\t\t\t\t\t\t\t\twidth={1024}\n\t\t\t\t\t\t\t\t\theight={400}\n\t\t\t\t\t\t\t\t\talt={name || \"product\"}\n\t\t\t\t\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<Column className={styles.details} gap={1}>\n\t\t\t\t\t\t\t\t<h2 className={styles.name}>{name}</h2>\n\t\t\t\t\t\t\t\t<Row justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t\t<div className={styles.price}>{formattedTotalPrice}</div>\n\t\t\t\t\t\t\t\t\t<div className={styles.volume}>{volume}</div>\n\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t<div className={styles.description}>{description}</div>\n\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t{(hasVariants || hasAddons) && (\n\t\t\t\t\t\t\t\t<Column gap={0} className={styles.choices}>\n\t\t\t\t\t\t\t\t\t{hasVariants && (\n\t\t\t\t\t\t\t\t\t\t<ProductVariants\n\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\tselectedVariant={selectedVariant}\n\t\t\t\t\t\t\t\t\t\t\tfocusedSection={focusedSection}\n\t\t\t\t\t\t\t\t\t\t\tonSelectVariant={setSelectedVariant}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t{hasAddons && (\n\t\t\t\t\t\t\t\t\t\t<ProductAddons\n\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\tselectedAddons={selectedAddons}\n\t\t\t\t\t\t\t\t\t\t\tonOptionSelect={handleOptionSelect}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t<div className={styles.close}>\n\t\t\t\t\t\t\t<IconButton onClick={onClose} icon={Close} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\t<Column>\n\t\t\t\t\t\t<ProductInCart productId={product?.id} onModalClose={onClose} />\n\t\t\t\t\t\t<Row className={styles.addToCart} gap={0.5}>\n\t\t\t\t\t\t\t<Quantity\n\t\t\t\t\t\t\t\tisDecreaseDisabled={isDecreaseDisabled}\n\t\t\t\t\t\t\t\tonDecrease={() => adjustQuantity(-1)}\n\t\t\t\t\t\t\t\tonIncrease={() => adjustQuantity(1)}\n\t\t\t\t\t\t\t\tquantity={quantity}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tclassName={styles.addAction}\n\t\t\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\t\t\tavailable ? (\n\t\t\t\t\t\t\t\t\t\t<Row fullWidth justifyContent=\"space-between\">\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.actionTitle}>{actionTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{formattedTotalCartPrice}</span>\n\t\t\t\t\t\t\t\t\t\t</Row>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\tt(\"Not available\")\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\tdisabled={!available}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Row>\n\t\t\t\t\t</Column>\n\t\t\t\t}\n\t\t\t/>\n\t\t</div>\n\t);\n};\nexport default ProductDetails;\n","import { Flex, Row } from \"@sorocraft/ui\";\nimport { classNames } from \"@sorocraft/js-utils\";\n\nimport styles from \"./CartStepper.module.scss\";\n\nimport { useCartTotalPrice, useTotalCartItemsCount } from \"src/hooks/cart\";\n\ninterface Props {\n\tonClick?: () => void;\n\tactionText?: string;\n}\n\nconst CartStepper = ({ actionText, onClick }: Props) => {\n\tconst totalCount = useTotalCartItemsCount();\n\tconst { formattedTotalPrice } = useCartTotalPrice();\n\n\treturn (\n\t\t<Flex\n\t\t\tclassName={classNames(styles, {\n\t\t\t\tcontainer: true,\n\t\t\t\tisClickable: !!onClick,\n\t\t\t})}\n\t\t\tjustifyContent=\"space-between\"\n\t\t\talignItems=\"center\"\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<Flex.Item flex={1}>\n\t\t\t\t<Row alignItems=\"center\">\n\t\t\t\t\t<div className={styles.count}>{totalCount}</div>\n\t\t\t\t\t<div className={styles.actionText}>{actionText}</div>\n\t\t\t\t</Row>\n\t\t\t</Flex.Item>\n\t\t\t<Flex.Item className={styles.totalPrice} flex={1}>\n\t\t\t\t{formattedTotalPrice}\n\t\t\t</Flex.Item>\n\t\t</Flex>\n\t);\n};\nexport default CartStepper;\n","import styles from \"./Cart.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\nimport { useTotalCartItemsCount } from \"src/hooks/cart\";\n\nimport CartStepper from \"../CartStepper\";\n\nconst Cart = () => {\n\tconst { setIsCartOpen } = useCartContext();\n\tconst { t } = useTranslation();\n\tconst totalCount = useTotalCartItemsCount();\n\n\tif (totalCount <= 0) return null;\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.content}>\n\t\t\t\t<CartStepper onClick={() => setIsCartOpen(true)} actionText={t(\"View order\")} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\nexport default Cart;\n","import { Product } from \"src/models/product\";\nimport { SelectedAddons } from \"src/models/addon\";\nimport { useStoreContext } from \"src/store\";\nimport { useCartContext } from \"src/store/cart\";\nimport { generateCartId } from \"src/utils/cart\";\n\nexport const useProductById = (productId: number): Product => {\n\tconst { products } = useStoreContext();\n\tconst product = products?.find?.(({ id }) => id === productId);\n\n\treturn (product || {}) as Product;\n};\n\nexport const useProductQuantity = ({\n\tproductId,\n\tvariantId,\n\tselectedAddons,\n}: {\n\tproductId: number;\n\tvariantId?: number;\n\tselectedAddons: SelectedAddons;\n}): number => {\n\tconst { cart } = useCartContext();\n\tconst cartId = generateCartId(productId, variantId, selectedAddons);\n\tconst item = cart[cartId];\n\n\treturn item?.quantity || 1;\n};\n","import { SIZE } from \"@sorocraft/ui\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useProductById, useProductQuantity } from \"src/hooks/product\";\n\nimport Quantity from \"src/components/Quantity\";\nimport { SelectedAddons } from \"src/models/addon\";\n\ninterface Props {\n\tproductId: number;\n\tvariantId?: number;\n\tselectedAddons?: SelectedAddons;\n\tmin?: number;\n\tsize?: SIZE;\n}\n\nconst ProductQuantity = ({ productId, variantId, min = 1, size = \"md\", selectedAddons }: Props) => {\n\tconst quantity = useProductQuantity({ productId, variantId, selectedAddons });\n\tconst product = useProductById(productId);\n\tconst { updateProduct } = useCartContext();\n\n\tconst isDecreaseDisabled = quantity === min;\n\n\treturn (\n\t\t<Quantity\n\t\t\tisDecreaseDisabled={isDecreaseDisabled}\n\t\t\tonDecrease={() =>\n\t\t\t\tupdateProduct({ product, quantity: quantity - 1, variantId, selectedAddons })\n\t\t\t}\n\t\t\tonIncrease={() =>\n\t\t\t\tupdateProduct({ product, quantity: quantity + 1, variantId, selectedAddons })\n\t\t\t}\n\t\t\tquantity={quantity}\n\t\t\tsize={size}\n\t\t/>\n\t);\n};\nexport default ProductQuantity;\n","import { ReactNode } from \"react\";\nimport { Text } from \"@sorocraft/ui\";\nimport { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { Product } from \"src/models/product\";\nimport { getAddonOptionTranslation, getAddonTranslation } from \"src/utils/addon\";\nimport { getProductAddon } from \"src/utils/product\";\n\nconst GetCartItemOptionsInfo = ({\n\titem,\n\tproduct,\n\tlanguage,\n}: {\n\titem: CartItem;\n\tproduct: Product;\n\tlanguage: string;\n}): ReactNode => {\n\tconst { selectedAddons } = item || {};\n\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(selectedAddons || {})\n\t\t\t\t.map(([addonId, optionId]) => {\n\t\t\t\t\tconst addon = getProductAddon(product, Number(addonId));\n\t\t\t\t\tif (isEmpty(addon) || isEmpty(addon.options) || !Array.isArray(addon.options)) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet optionTitles = \"\";\n\n\t\t\t\t\tif (Array.isArray(optionId)) {\n\t\t\t\t\t\tconst options = addon.options.filter(({ id }) => optionId.includes(id));\n\t\t\t\t\t\tif (isEmpty(options)) return null;\n\n\t\t\t\t\t\toptionTitles = options\n\t\t\t\t\t\t\t.map((option) => {\n\t\t\t\t\t\t\t\tconst { title: optionTitle } = getAddonOptionTranslation(option, language);\n\n\t\t\t\t\t\t\t\treturn optionTitle;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst option = addon.options.find(({ id }) => id === optionId);\n\t\t\t\t\t\tif (isEmpty(option)) return null;\n\t\t\t\t\t\tconst { title } = getAddonOptionTranslation(option, language);\n\t\t\t\t\t\toptionTitles = title;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { title: addonTitle } = getAddonTranslation(addon, language);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Text color=\"muted\" size=\"xs\" key={addonId}>\n\t\t\t\t\t\t\t{addonTitle}: {optionTitles}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)}\n\t\t</>\n\t);\n};\n\nexport default GetCartItemOptionsInfo;\n","import { Column, Row, Text } from \"@sorocraft/ui\";\nimport { useMemo } from \"react\";\n\nimport styles from \"./CartItem.module.scss\";\n\nimport { useProductById } from \"src/hooks/product\";\nimport { CartItem } from \"src/models/order\";\nimport { useStoreContext } from \"src/store\";\nimport {\n\tgetProductTranslation,\n\tgetProductVariant,\n\tgetProductVariantTranslation,\n} from \"src/utils/product\";\nimport { getImageSource } from \"src/utils/image\";\nimport { getCartPrice } from \"src/utils/cart\";\n\nimport Image from \"src/components/Image\";\nimport ProductQuantity from \"../ProductQuantity\";\nimport GetCartItemOptionsInfo from \"./OptionsInfo\";\n\ninterface Props {\n\titem: CartItem;\n}\n\nconst CartItem = ({ item }: Props) => {\n\tconst { productId, variantId, selectedAddons } = item || {};\n\tconst product = useProductById(productId);\n\tconst variant = getProductVariant(product, variantId);\n\tconst { language, currency } = useStoreContext();\n\tconst { image160 } = product;\n\tconst { title: variantTitle } = getProductVariantTranslation(variant, language);\n\tconst { name } = useMemo(() => getProductTranslation(product, language), [product, language]);\n\tconst { formattedTotalPrice } = useMemo(\n\t\t() => getCartPrice(item, currency, language),\n\t\t[item, currency, language]\n\t);\n\n\treturn (\n\t\t<Row className={styles.container} gap={1} alignItems=\"flex-start\">\n\t\t\t{image160 && (\n\t\t\t\t<Image\n\t\t\t\t\tsrc={getImageSource(image160)}\n\t\t\t\t\talt={name || \"menu\"}\n\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\twidth={80}\n\t\t\t\t\theight={45}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div className={styles.data}>\n\t\t\t\t<div className={styles.name}>{name}</div>\n\t\t\t\t<Column gap={0}>\n\t\t\t\t\t{!!variantTitle && (\n\t\t\t\t\t\t<Text color=\"muted\" size=\"xs\">\n\t\t\t\t\t\t\t{variantTitle}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t<GetCartItemOptionsInfo item={item} product={product} language={language} />\n\t\t\t\t</Column>\n\t\t\t\t<div className={styles.price}>{formattedTotalPrice}</div>\n\t\t\t</div>\n\t\t\t<ProductQuantity\n\t\t\t\tproductId={productId}\n\t\t\t\tvariantId={variantId}\n\t\t\t\tselectedAddons={selectedAddons}\n\t\t\t\tsize=\"sm\"\n\t\t\t\tmin={0}\n\t\t\t/>\n\t\t</Row>\n\t);\n};\nexport default CartItem;\n","import { isEmpty } from \"@sorocraft/js-utils\";\nimport { useRef, MouseEvent } from \"react\";\nimport { Button, Column, Description, Text, UIElementType, Drawer } from \"@sorocraft/ui\";\n\nimport styles from \"./CartDrawer.module.scss\";\n\nimport { useCartContext } from \"src/store/cart\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport CartItem from \"../CartItem\";\nimport CartStepper from \"../CartStepper\";\n\nconst CartDrawer = () => {\n\tconst { isCartOpen, cart, setIsCartOpen } = useCartContext();\n\tconst contentRef = useRef<HTMLDivElement>(null);\n\tconst { t } = useTranslation();\n\n\tconst isCartEmpty = isEmpty(cart);\n\n\tconst close = () => setIsCartOpen(false);\n\n\tconst handleClickOutside = (event: MouseEvent<HTMLElement>) => {\n\t\tif (!contentRef?.current?.contains?.(event?.target as Node)) {\n\t\t\tclose();\n\t\t}\n\t};\n\n\tconst NoItems = () => (\n\t\t<Column\n\t\t\tclassName={styles.noItems}\n\t\t\tfullWidth\n\t\t\tfullHeight\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\tgap={0}\n\t\t>\n\t\t\t<Text variant=\"h2\">{t(\"Empty order\")}</Text>\n\t\t\t<Description text={t(\"You don't have any items in your order\")} />\n\t\t</Column>\n\t);\n\n\tif (!isCartOpen) return null;\n\n\treturn (\n\t\t<div className={styles.container} onClick={handleClickOutside}>\n\t\t\t<Drawer\n\t\t\t\tref={contentRef}\n\t\t\t\tonClose={close}\n\t\t\t\tisOpen={isCartOpen}\n\t\t\t\ttitle={t(\"Your order\")}\n\t\t\t\tcontent={\n\t\t\t\t\t<div className={styles.content}>\n\t\t\t\t\t\t{isCartEmpty ? (\n\t\t\t\t\t\t\t<NoItems />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className={styles.items}>\n\t\t\t\t\t\t\t\t{Object.keys(cart || {}).map((productId) => (\n\t\t\t\t\t\t\t\t\t<CartItem key={productId} item={cart[productId]} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\tisCartEmpty ? (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tlabel={t(\"Add items\")}\n\t\t\t\t\t\t\tonClick={close}\n\t\t\t\t\t\t\ttype={UIElementType.PRIMARY}\n\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CartStepper actionText={t(\"Subtotal\")} />\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t/>\n\t\t</div>\n\t);\n};\nexport default CartDrawer;\n","import { RefObject, useEffect, memo, useState } from \"react\";\nimport { Column, DivElementMap, IconButton, Row, UIElementType } from \"@sorocraft/ui\";\nimport { trackEvent } from \"@sorocraft/js-utils\";\nimport { Grid, List } from \"@sorocraft/ui/icons\";\n\nimport styles from \"./Products.module.scss\";\n\nimport * as categoryUtils from \"src/utils/category\";\nimport { getProductTranslation } from \"src/utils/product\";\nimport * as menuModels from \"src/models/menu\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { Product, ProductView } from \"src/models\";\nimport { CartProvider } from \"src/store/cart\";\n\nimport ProductsListItem from \"../ProductsListItem\";\nimport ProductsGridItem from \"../ProductsGridItem\";\nimport ProductDetails from \"../ProductDetails\";\nimport Cart from \"../Cart\";\nimport CartDrawer from \"../CartDrawer\";\n\ninterface Props {\n\tproductBlocksRef: RefObject<DivElementMap>;\n\tcontainerRef: RefObject<HTMLDivElement>;\n\tcurrency: string;\n\tlanguage: string;\n\tcategoryProductMap: menuModels.CategoryProductMap[];\n\tonCategoryInView: (categoryId: number) => void;\n}\n\nconst Products = memo(\n\t({\n\t\tcategoryProductMap = [],\n\t\tcurrency,\n\t\tlanguage,\n\t\tproductBlocksRef,\n\t\tcontainerRef,\n\t\tonCategoryInView,\n\t}: Props) => {\n\t\tconst [selectedProduct, setSelectedProduct] = useState<Product | null>(null);\n\t\tconst [view, setView] = useState<ProductView>(ProductView.LIST);\n\n\t\tconst views = [\n\t\t\t{\n\t\t\t\ticon: List,\n\t\t\t\ttype: ProductView.LIST,\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: Grid,\n\t\t\t\ttype: ProductView.GRID,\n\t\t\t},\n\t\t];\n\n\t\tconst handleSelectView = (type: ProductView) => {\n\t\t\tsetView(type);\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_VIEW_CHANGED, { name: type });\n\t\t};\n\n\t\tconst handleSelectProduct = (product: Product) => {\n\t\t\tconst { name } = getProductTranslation(product, language);\n\t\t\ttrackEvent(analyticsConstants.PRODUCT_DETAILS, { name });\n\n\t\t\tsetSelectedProduct(product);\n\t\t};\n\n\t\tuseEffect(() => {\n\t\t\t// Create an IntersectionObserver instance\n\t\t\tconst observer = new IntersectionObserver(\n\t\t\t\t(entries) => {\n\t\t\t\t\t// Calculate the center of the viewport\n\t\t\t\t\tconst viewportCenter = (containerRef?.current?.clientHeight || 1000) / 2;\n\n\t\t\t\t\tlet closestCategoryId: string | null = null;\n\t\t\t\t\tlet closestDistance = Infinity;\n\n\t\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\t\tconst rect = entry.boundingClientRect;\n\t\t\t\t\t\t\tconst elementCenter = rect.top + rect.height / 2;\n\t\t\t\t\t\t\tconst distanceToCenter = Math.abs(elementCenter - viewportCenter);\n\n\t\t\t\t\t\t\t// Check if this element is closer to the center\n\t\t\t\t\t\t\tif (distanceToCenter < closestDistance) {\n\t\t\t\t\t\t\t\tclosestDistance = distanceToCenter;\n\t\t\t\t\t\t\t\tclosestCategoryId = entry.target.getAttribute(\"data-category-id\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Update the active category if it has changed\n\t\t\t\t\tif (closestCategoryId) {\n\t\t\t\t\t\tonCategoryInView(Number(closestCategoryId));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tthreshold: 0.1, // Adjust as needed (10% visibility)\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Observe each product block\n\t\t\tObject.entries(productBlocksRef.current || {}).forEach(([categoryId, element]) => {\n\t\t\t\tif (element) {\n\t\t\t\t\telement.setAttribute(\"data-category-id\", categoryId); // Add a data attribute\n\t\t\t\t\tobserver.observe(element);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\t// Cleanup the observer\n\t\t\t\tobserver.disconnect();\n\t\t\t};\n\t\t}, [productBlocksRef, containerRef]);\n\n\t\treturn (\n\t\t\t<CartProvider>\n\t\t\t\t<div className={styles.container}>\n\t\t\t\t\t<Row className={styles.view} alignItems=\"center\">\n\t\t\t\t\t\t{views.map(({ icon, type }) => (\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\tkey={type}\n\t\t\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\t\t\tonClick={() => handleSelectView(type)}\n\t\t\t\t\t\t\t\ttype={type === view ? UIElementType.PRIMARY : UIElementType.DEFAULT}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Row>\n\t\t\t\t\t<Column>\n\t\t\t\t\t\t{(categoryProductMap || []).map((category) => {\n\t\t\t\t\t\t\tconst { name } = categoryUtils.getCategoryTranslation(category, language);\n\t\t\t\t\t\t\tconst { id, products } = category;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={styles.products}\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) {\n\t\t\t\t\t\t\t\t\t\t\tproductBlocksRef!.current![id] = el;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdata-category-id={id}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<h2 className={styles.category}>{name}</h2>\n\t\t\t\t\t\t\t\t\t<div className={styles.list}>\n\t\t\t\t\t\t\t\t\t\t<Column gap={0}>\n\t\t\t\t\t\t\t\t\t\t\t{(products || []).map((product) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (view === ProductView.GRID) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ProductsGridItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={product.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectProduct(product)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProductsListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tproduct={product}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={product.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectProduct(product)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</Column>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Column>\n\t\t\t\t\t<ProductDetails product={selectedProduct} onClose={() => setSelectedProduct(null)} />\n\t\t\t\t\t<Cart />\n\t\t\t\t\t<CartDrawer />\n\t\t\t\t</div>\n\t\t\t</CartProvider>\n\t\t);\n\t},\n\t(prevProps, nextProps) => {\n\t\treturn (\n\t\t\tprevProps.categoryProductMap === nextProps.categoryProductMap &&\n\t\t\tprevProps.currency === nextProps.currency &&\n\t\t\tprevProps.language === nextProps.language\n\t\t);\n\t}\n);\n\nProducts.displayName = \"Products\";\n\nexport default Products;\n","import { ReactNode } from \"react\";\nimport { Card, Container, Flex } from \"@sorocraft/ui\";\n\nimport styles from \"./Branches.module.scss\";\n\nimport * as branchModels from \"src/models/branch\";\n\ninterface Props {\n\tbranches: branchModels.Branch[];\n\trootPath?: string;\n\tonBranchSelect: (branchId: number) => void;\n}\n\nconst Branches = ({ branches = [], rootPath = \"\", onBranchSelect }: Props) => {\n\tconst Parent = ({ children, id }: { children: ReactNode; id: number }) => {\n\t\tif (onBranchSelect) return <div onClick={() => onBranchSelect(id)}>{children}</div>;\n\n\t\treturn <a href={`${rootPath}/${id}`}>{children}</a>;\n\t};\n\n\treturn (\n\t\t<div className={styles.branches}>\n\t\t\t<Container className={styles.list}>\n\t\t\t\t{branches.map(({ id, name }) => (\n\t\t\t\t\t<Parent key={id} id={id}>\n\t\t\t\t\t\t<Card noBottomMargin>\n\t\t\t\t\t\t\t<Flex justifyContent=\"center\" alignItems=\"center\" fullHeight>\n\t\t\t\t\t\t\t\t<h2 className={styles.name}>{name}</h2>\n\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t</Card>\n\t\t\t\t\t</Parent>\n\t\t\t\t))}\n\t\t\t</Container>\n\t\t</div>\n\t);\n};\nexport default Branches;\n","import { isEmpty, trackEvent } from \"@sorocraft/js-utils\";\nimport { DivElementMap } from \"@sorocraft/ui\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport styles from \"./PublicMenu.module.scss\";\n\nimport * as menuModels from \"src/models/menu\";\nimport * as branchModels from \"src/models/branch\";\nimport { getCoverImageSource, getLogoImageSource } from \"src/utils/image\";\nimport { getBaseUrl } from \"src/utils/url\";\nimport { prepareCategoryAndProductMap } from \"src/utils/menu\";\nimport { StoreProvider } from \"src/store\";\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { getCategoryNameById } from \"src/utils/category\";\n\nimport Header from \"./Header\";\nimport Categories from \"./Categories\";\nimport Products from \"./Products\";\nimport Branches from \"./Branches\";\n\ninterface Props {\n\tdata: menuModels.PublicMenuData;\n}\n\nconst PublicMenu = ({ data }: Props) => {\n\tconst {\n\t\tname,\n\t\tcoverImage,\n\t\tlogoImage,\n\t\tbranches = [],\n\t\tbranchId,\n\t\tlanguage,\n\t\tcategories,\n\t\tproducts,\n\t\tcurrency,\n\t\tinstagram,\n\t\tfacebook,\n\t\twhatsapp,\n\t\ttelegram,\n\t\ttiktok,\n\t\trootPath,\n\t\thostname,\n\t\tonBranchSelect,\n\t} = data || {};\n\n\tconst hasSingleBranch = branches.length <= 1;\n\tconst categoryProductMap = prepareCategoryAndProductMap(categories, products);\n\n\tconst getSelectedBranch = () => {\n\t\tif (hasSingleBranch) {\n\t\t\tif (branches?.[0]?.id) return branches[0];\n\n\t\t\treturn {} as branchModels.Branch;\n\t\t}\n\n\t\treturn branches.find((item) => item.id === Number(branchId));\n\t};\n\n\tconst selectedBranch = getSelectedBranch();\n\tconst venueName = hasSingleBranch || !selectedBranch?.name ? name : selectedBranch?.name || \"\";\n\n\tconst [selectedCategoryId, setSelectedCategoryId] = useState<number>(categories?.[0]?.id);\n\tconst productBlocksRef = useRef<DivElementMap>({});\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst canUserScroll = useRef<boolean>(true);\n\tconst { url: baseUrl, domain } = getBaseUrl(hostname, language);\n\n\tconst scrollToProductBlock = (categoryId: number) => {\n\t\tconst productBlock = productBlocksRef?.current?.[categoryId];\n\n\t\tif (!productBlock) return;\n\n\t\tsetTimeout(() => {\n\t\t\tproductBlock.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n\t\t}, 100);\n\n\t\tsetTimeout(() => {\n\t\t\tcanUserScroll.current = true;\n\t\t}, 1000);\n\t};\n\n\tconst handleSelectCategory = async (categoryId: number) => {\n\t\tcanUserScroll.current = false;\n\t\tsetSelectedCategoryId(categoryId);\n\n\t\tscrollToProductBlock(categoryId);\n\t};\n\n\tconst handleCategoryInView = (categoryId: number) => {\n\t\tif (!canUserScroll?.current) return;\n\t\tconst name = getCategoryNameById(categoryId, categories, language);\n\t\ttrackEvent(analyticsConstants.CATEGORY_SCROLLED, { name });\n\t\tsetSelectedCategoryId(categoryId);\n\t};\n\n\tconst selectCategoryFromURL = () => {\n\t\tif (typeof window === \"undefined\") return;\n\n\t\tconst searchParams = new URLSearchParams(window.location.search);\n\t\tconst categoryIdFromURL = Number(searchParams.get(\"category\"));\n\t\tif (!categoryIdFromURL) return;\n\n\t\tconst categoryToSelect = (categories || []).find(({ id }) => id === categoryIdFromURL);\n\t\tif (isEmpty(categoryToSelect)) return;\n\n\t\thandleSelectCategory(categoryIdFromURL);\n\t};\n\n\tuseEffect(() => {\n\t\tselectCategoryFromURL();\n\t}, []);\n\n\treturn (\n\t\t<div className={styles.container} ref={containerRef}>\n\t\t\t<Header\n\t\t\t\tbranch={selectedBranch}\n\t\t\t\tname={venueName}\n\t\t\t\tcoverImage={getCoverImageSource(coverImage)}\n\t\t\t\tlogoImage={getLogoImageSource(logoImage)}\n\t\t\t\tinstagram={instagram}\n\t\t\t\tfacebook={facebook}\n\t\t\t\twhatsapp={whatsapp}\n\t\t\t\ttelegram={telegram}\n\t\t\t\ttiktok={tiktok}\n\t\t\t/>\n\t\t\t{!hasSingleBranch && !branchId ? (\n\t\t\t\t<Branches branches={branches} onBranchSelect={onBranchSelect} rootPath={rootPath} />\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<Categories\n\t\t\t\t\t\tcategoryProductMap={categoryProductMap}\n\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\tselectedCategoryId={selectedCategoryId}\n\t\t\t\t\t\tonSelectCategory={handleSelectCategory}\n\t\t\t\t\t/>\n\t\t\t\t\t<Products\n\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\tproductBlocksRef={productBlocksRef}\n\t\t\t\t\t\tcontainerRef={containerRef}\n\t\t\t\t\t\tcategoryProductMap={categoryProductMap}\n\t\t\t\t\t\tonCategoryInView={handleCategoryInView}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{!!hostname && (\n\t\t\t\t<a rel=\"noopener noreferrer\" target=\"_blank\" href={baseUrl} className={styles.footer}>\n\t\t\t\t\t{domain}\n\t\t\t\t</a>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst PublicMenuWithContext = ({ data }: Props) => {\n\treturn (\n\t\t<StoreProvider value={data}>\n\t\t\t<PublicMenu data={data} />\n\t\t</StoreProvider>\n\t);\n};\n\nexport default PublicMenuWithContext;\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n","import { useCallback, useRef } from \"react\";\nimport { CloseDropdownRef, DropDown, DropDownMenuItem, UIElementType } from \"@sorocraft/ui\";\n\nimport styles from \"./Events.module.scss\";\n\nimport * as analyticsConstants from \"src/constants/analytics\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tcurrentGoal: string;\n\tlanguage?: string;\n\tsetGoal: (goal: string) => void;\n}\n\nconst EventsToolbar = ({ currentGoal, language, setGoal }: Props) => {\n\tconst { t } = useTranslation(language);\n\tconst closeDropdownRef = useRef<CloseDropdownRef>({});\n\n\tconst getGoalTitle = (goal: string) => {\n\t\tswitch (goal) {\n\t\t\tcase analyticsConstants.CATEGORY_SCROLLED:\n\t\t\t\treturn t(\"Scrolled to Category\");\n\t\t\tcase analyticsConstants.CATEGORY_SELECTED:\n\t\t\t\treturn t(\"Category Selected\");\n\t\t\tcase analyticsConstants.PRODUCT_DETAILS:\n\t\t\t\treturn t(\"Product Details\");\n\t\t\tcase analyticsConstants.PRODUCT_ADD_CART:\n\t\t\t\treturn t(\"Product Added to Cart\");\n\n\t\t\tdefault:\n\t\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tconst handleChange = useCallback(\n\t\t(goal: string) => {\n\t\t\tsetGoal(goal);\n\t\t\tcloseDropdownRef?.current?.close?.();\n\t\t},\n\t\t[setGoal]\n\t);\n\n\treturn (\n\t\t<DropDown\n\t\t\taction={getGoalTitle(currentGoal)}\n\t\t\tactionSize=\"large\"\n\t\t\ttype={UIElementType.BORDERED_PRIMARY}\n\t\t\tcloseRef={closeDropdownRef}\n\t\t\tmenu={\n\t\t\t\t<div className={styles.toolbarMenu}>\n\t\t\t\t\t{analyticsConstants.GOALS.map((goal) => (\n\t\t\t\t\t\t<DropDownMenuItem key={goal} onClick={() => handleChange(goal)}>\n\t\t\t\t\t\t\t{getGoalTitle(goal)}\n\t\t\t\t\t\t</DropDownMenuItem>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t}\n\t\t/>\n\t);\n};\nexport default EventsToolbar;\n","import { Card, BarChart, Loading, BarChartData } from \"@sorocraft/ui\";\n\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport EventsToolbar from \"./EventsToolbar\";\n\ninterface Props {\n\tdata: BarChartData[];\n\tisLoading?: boolean;\n\tloadingImage?: string;\n\tlanguage?: string;\n\tgoal: string;\n\tsetGoal: (goal: string) => void;\n}\n\nconst Events = ({ data, isLoading = false, loadingImage, language, goal, setGoal }: Props) => {\n\tconst { t } = useTranslation(language);\n\n\treturn (\n\t\t<Card\n\t\t\ttitle={t(\"Events\")}\n\t\t\ttoolbar={<EventsToolbar language={language} currentGoal={goal} setGoal={setGoal} />}\n\t\t>\n\t\t\t{isLoading ? <Loading image={loadingImage} /> : <BarChart data={data} />}\n\t\t</Card>\n\t);\n};\nexport default Events;\n","import { PlanType, PricingPlans } from \"src/models/pricing\";\n\nexport const PRICING: PricingPlans = {\n\tappetizer: {\n\t\ttitle: \"Appetizer\",\n\t\tprice: {\n\t\t\tmonthly: 9,\n\t\t\tannually: 7,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n\tmainCourse: {\n\t\ttitle: \"Main Course\",\n\t\tprice: {\n\t\t\tmonthly: 19,\n\t\t\tannually: 15,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n\tchefsSpecial: {\n\t\ttitle: \"Chef's Special\",\n\t\tprice: {\n\t\t\tmonthly: 49,\n\t\t\tannually: 39,\n\t\t},\n\t\t// discountedPrice: 0,\n\t},\n};\n\nexport const PRICING_BENEFITS = [\n\t{\n\t\ttitle: \"Smart QR Menu\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Link-in-bio\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Menu Analytics\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Users\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Products\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Unlimited Categories\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Product variants\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Product options\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"24/7 Support\",\n\t\t[PlanType.APPETIZER]: true,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Sales reports\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Multiple Branches\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Table Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Order Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Delivery Management\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: true,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Mobile App for Owners & Staff\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t{\n\t\ttitle: \"Point of Sale (POS)\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n\t// {\n\t// \ttitle: \"RestaroundPay with Mobile\",\n\t// \t[PlanType.APPETIZER]: false,\n\t// \t[PlanType.MAIN_COURSE]: true,\n\t// \t[PlanType.CHEFS_SPECIAL]: true,\n\t// },\n\t// {\n\t// \ttitle: \"Event management\",\n\t// \t[PlanType.APPETIZER]: false,\n\t// \t[PlanType.MAIN_COURSE]: true,\n\t// \t[PlanType.CHEFS_SPECIAL]: true,\n\t// },\n\t{\n\t\ttitle: \"Third-Party Delivery Integrations\",\n\t\t[PlanType.APPETIZER]: false,\n\t\t[PlanType.MAIN_COURSE]: false,\n\t\t[PlanType.CHEFS_SPECIAL]: true,\n\t},\n];\n","import { priceFormatter } from \"@sorocraft/js-utils\";\nimport { Column, Row, Text } from \"@sorocraft/ui\";\n\nimport styles from \"./Pricing.module.scss\";\n\nimport { PRICING } from \"src/constants/pricing\";\nimport { PlanType, PricingInterval } from \"src/models/pricing\";\nimport { useTranslation } from \"src/hooks/translation\";\n\ninterface Props {\n\tplan: PlanType;\n\tlanguage: string;\n\tinterval: PricingInterval;\n\tcurrency: string;\n}\n\nconst PricingPlanAmount = ({ plan, language, interval, currency }: Props) => {\n\tconst { t } = useTranslation(language);\n\n\tconst { price, discountedPrice } = PRICING[plan];\n\tconst intervalPrice = price[interval];\n\n\tif (discountedPrice !== undefined) {\n\t\treturn (\n\t\t\t<Column gap={0}>\n\t\t\t\t<Row>\n\t\t\t\t\t<span className={styles.discountedPrice}>\n\t\t\t\t\t\t{priceFormatter(discountedPrice, currency, language)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className={styles.originalPrice}>\n\t\t\t\t\t\t{priceFormatter(intervalPrice, currency, language)}\n\t\t\t\t\t</span>\n\t\t\t\t</Row>\n\t\t\t\t<Text size=\"sm\">{t(\"/ month\")}</Text>\n\t\t\t</Column>\n\t\t);\n\t}\n\treturn (\n\t\t<Row gap={0.5}>\n\t\t\t<Text size=\"xxl\" variant=\"bold\">\n\t\t\t\t{priceFormatter(intervalPrice, currency, language)}\n\t\t\t</Text>\n\t\t\t<Text size=\"sm\">{t(\"/ month\")}</Text>\n\t\t</Row>\n\t);\n};\nexport default PricingPlanAmount;\n","import { Card, SVGIcon, UIElementType, Button } from \"@sorocraft/ui\";\nimport { Check, Minus } from \"@sorocraft/ui/icons\";\nimport { classNames } from \"@sorocraft/js-utils\";\nimport { ReactNode, useState } from \"react\";\n\nimport styles from \"./Pricing.module.scss\";\n\nimport { PRICING, PRICING_BENEFITS } from \"src/constants/pricing\";\nimport { PlanType, PricingInterval } from \"src/models/pricing\";\nimport { getRegisterUrl } from \"src/utils/url\";\nimport { useTranslation } from \"src/hooks/translation\";\n\nimport PricingPlanAmount from \"./PricingPlanAmount\";\n\ninterface Props {\n\tcurrency: string;\n\tlanguage: string;\n\tisLoading?: boolean;\n\tonPlanSelect?: (plan: PlanType) => void;\n\tonIntervalSelect?: (interval: PricingInterval) => void;\n}\n\nconst Pricing = ({\n\tcurrency,\n\tlanguage,\n\tisLoading = false,\n\tonPlanSelect,\n\tonIntervalSelect,\n}: Props) => {\n\tconst [selectedInterval, setSelectedInterval] = useState<PricingInterval>(\"annually\");\n\tconst { t } = useTranslation(language);\n\n\tconst plans: PlanType[] = [PlanType.APPETIZER, PlanType.MAIN_COURSE, PlanType.CHEFS_SPECIAL];\n\tconst intervals: Array<PricingInterval> = [\"annually\", \"monthly\"];\n\tconst actionTitle = onPlanSelect ? \"Choose Plan\" : \"Get Started\";\n\n\tconst handleSelectInterval = (interval: PricingInterval) => {\n\t\tsetSelectedInterval(interval);\n\t\tif (onIntervalSelect) {\n\t\t\tonIntervalSelect(interval);\n\t\t}\n\t};\n\n\tconst PlanParent = ({ children, plan }: { children: ReactNode; plan: PlanType }) => {\n\t\tif (onPlanSelect) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.plan}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (isLoading) return;\n\t\t\t\t\t\tonPlanSelect(plan);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<a\n\t\t\t\tclassName={styles.plan}\n\t\t\t\thref={getRegisterUrl(language, `pricing-${plan}`)}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={styles.intervals}>\n\t\t\t\t{intervals.map((interval) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={interval}\n\t\t\t\t\t\tclassName={classNames(styles, {\n\t\t\t\t\t\t\tinterval: true,\n\t\t\t\t\t\t\tactive: selectedInterval === interval,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonClick={() => handleSelectInterval(interval)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(interval)}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t<div className={styles.plans}>\n\t\t\t\t{plans.map((plan) => (\n\t\t\t\t\t<PlanParent key={plan} plan={plan}>\n\t\t\t\t\t\t<Card>\n\t\t\t\t\t\t\t<div className={styles.title}>{PRICING[plan].title}</div>\n\t\t\t\t\t\t\t<div className={styles.price}>\n\t\t\t\t\t\t\t\t<PricingPlanAmount\n\t\t\t\t\t\t\t\t\tplan={plan}\n\t\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\t\tinterval={selectedInterval}\n\t\t\t\t\t\t\t\t\tcurrency={currency}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={styles.action}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tlabel={t(actionTitle)}\n\t\t\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\t\t\tsize=\"xl\"\n\t\t\t\t\t\t\t\t\ttype={\n\t\t\t\t\t\t\t\t\t\tplan === PlanType.MAIN_COURSE\n\t\t\t\t\t\t\t\t\t\t\t? UIElementType.PRIMARY\n\t\t\t\t\t\t\t\t\t\t\t: UIElementType.BORDERED_PRIMARY\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonClick={() => {}}\n\t\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={styles.benefits}>\n\t\t\t\t\t\t\t\t{PRICING_BENEFITS.map((benefit) => (\n\t\t\t\t\t\t\t\t\t<div key={benefit.title} className={styles.benefit}>\n\t\t\t\t\t\t\t\t\t\t<SVGIcon icon={benefit[plan] ? Check : Minus} size=\"md\" />{\" \"}\n\t\t\t\t\t\t\t\t\t\t<span>{t(benefit.title)}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Card>\n\t\t\t\t\t</PlanParent>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default Pricing;\n"],"names":["__rest","s","e","t","p","Object","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","apply","SuppressedError","IMAGE_BASE_URL","getImageSource","image","includes","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","CO_DOMAIN","DOMAINS","getRegisterUrl","language","source","tld","getTLD","StoreContext","createContext","StoreProvider","children","storeValue","isEmpty","currency","_jsx","Provider","useStoreContext","useContext","GOAL_BASE_NAME","CATEGORY_SELECTED","CATEGORY_SCROLLED","PRODUCT_DETAILS","PRODUCT_ADD_CART","PRODUCT_VIEW_CHANGED","GOALS","getCategoryTranslation","category","_b","_a","translations","find","item","Image","props","priority","_","blurDataURL","__","quality","___","placeholder","____","fetchPriority","_____","imgProps","imageTag","assign","r","g","b","Languages","languages","onLanguageSelect","isOptionsOpen","setIsOptionsOpen","useState","isBilingual","otherLanguages","filter","code","getFlag","className","styles","container","onClick","_jsxs","Row","alignItems","gap","classNames","options","isOpen","map","src","option","handleSelectLanguages","alt","currentLanguage","Header","branch","name","instagram","facebook","whatsapp","telegram","tiktok","address","latitude","longitude","phone","wifiPassword","noBranch","googleMapLink","width","height","sizes","loading","Column","fullWidth","fullHeight","justifyContent","Flex","direction","Item","shrink","href","target","rel","SVGIcon","icon","MarkerPin","theme","IconLink","Phone","size","shape","Whatsapp","Instagram","Telegram","Tiktok","Facebook","Tooltip","hint","Wifi","Categories","categoryProductMap","selectedCategoryId","onSelectCategory","categoryBlocksRef","useRef","carouselRef","useEffect","categoryBlock","current","carouselWidth","clientWidth","scrollLeft","offsetLeft","offsetWidth","scrollTo","left","behavior","scrollToCategoryBlock","Carousel","onGetRef","ref","id","CarouselItem","Chip","trackEvent","analyticsConstants.CATEGORY_SELECTED","handleSelectCategory","type","UIElementType","BORDERED_PRIMARY","active","el","calculateTotalPrice","price","quantity","vat","MenuAddonSelectType","getAddonTranslation","addon","getAddonOptionTranslation","getAddonOptionRawPrice","optionId","getProductTranslation","product","getProductRawPrice","getProductPrice","totalPrice","formattedTotalPrice","priceFormatter","getProductVariant","variantId","variants","getProductVariantRawPrice","variant","getProductVariantTranslation","getProductCartRawPrice","selectedAddons","noVat","optionsPrice","total","productData","selectedOptionsTotalPrice","addons","reduce","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getSelectedOptionsTotalPrice","ProductView","PlanType","getCartPrice","generateCartId","productId","Error","cartId","addonIdsPart","entries","optionIds","Array","isArray","Boolean","join","CartContext","cart","isCartOpen","addProduct","updateProduct","setIsCartOpen","removeAllProductVariants","CartProvider","setCart","updateCart","isAddOperation","currentCart","existingItem","newQuantity","updatedCart","acc","cartItem","contextValue","useMemo","useCartContext","en","az","Subtotal","Events","monthly","annually","tr","nl","et","ru","useTranslation","lang","locale","key","ProductsListItem","image160","volume","available","description","hasVariant","hasAddons","hasImage","isClickable","noImage","info","Text","color","notAvailableText","notAvailable","addToCart","IconButton","preventDefault","stopPropagation","analyticsConstants.PRODUCT_ADD_CART","Plus","DEFAULT","ProductsGridItem","image580","image1024","content","imageContainer","data","useTotalCartItemsCount","values","sum","Quantity","isDecreaseDisabled","onIncrease","onDecrease","quantityAction","isDisabled","Minus","quantityValue","ProductInCart","onModalClose","useProductQuantityInCartWithAllVariants","flex","Trash","DANGER","tooltip","ShoppingBag","SUCCESS","ProductVariants","selectedVariant","focusedSection","onSelectVariant","containerRef","isVariantsFocused","scrollIntoView","focused","variantsTitle","formattedTotalVariantPrice","getProductVariantPrice","title","Input","label","onChange","checked","InputType","RADIO","noMargin","variantPrice","ProductAddons","onOptionSelect","formattedTotalOptionPrice","getOptionPrice","optionTitle","isSingle","isRemove","CHECKBOX","optionPrice","ProductDetails","onClose","setQuantity","isUpdate","setIsUpdate","setSelectedVariant","setFocusedSection","setSelectedAddons","modalRef","productQuantityInCart","useProductQuantityInCart","formattedTotalCartPrice","getProductCartPrice","actionTitle","adjustQuantity","amount","Math","max","hasVariants","event","contains","Modal","noBodyPadding","details","choices","prevForm","previousSelection","updatedSelection","Set","close","Close","footer","Button","addAction","setTimeout","disabled","CartStepper","actionText","totalCount","cartTotalPrice","useCartTotalPrice","count","Cart","useProductById","products","ProductQuantity","min","useProductQuantity","GetCartItemOptionsInfo","getProductAddon","Number","optionTitles","addonTitle","CartItem","variantTitle","CartDrawer","contentRef","isCartEmpty","Drawer","noItems","Description","text","items","keys","PRIMARY","Products","memo","productBlocksRef","onCategoryInView","selectedProduct","setSelectedProduct","view","setView","LIST","views","List","Grid","GRID","handleSelectProduct","analyticsConstants.PRODUCT_DETAILS","observer","IntersectionObserver","viewportCenter","clientHeight","closestCategoryId","closestDistance","Infinity","forEach","entry","isIntersecting","rect","boundingClientRect","elementCenter","top","distanceToCenter","abs","getAttribute","threshold","categoryId","element","setAttribute","observe","disconnect","analyticsConstants.PRODUCT_VIEW_CHANGED","handleSelectView","categoryUtils.getCategoryTranslation","prevProps","nextProps","displayName","Branches","branches","rootPath","onBranchSelect","Parent","Container","Card","noBottomMargin","PublicMenu","branchId","categories","hostname","hasSingleBranch","productMap","visible","push","prepareCategoryAndProductMap","selectedBranch","getSelectedBranch","venueName","setSelectedCategoryId","canUserScroll","url","baseUrl","domain","getBaseUrl","productBlock","block","scrollToProductBlock","window","searchParams","URLSearchParams","location","search","categoryIdFromURL","get","categoryToSelect","selectCategoryFromURL","_Fragment","getCategoryNameById","analyticsConstants.CATEGORY_SCROLLED","PublicMenuWithContext","EventsToolbar","currentGoal","setGoal","closeDropdownRef","getGoalTitle","goal","handleChange","useCallback","DropDown","action","actionSize","closeRef","menu","toolbarMenu","analyticsConstants.GOALS","DropDownMenuItem","isLoading","loadingImage","toolbar","Loading","BarChart","PRICING","appetizer","mainCourse","chefsSpecial","PRICING_BENEFITS","APPETIZER","MAIN_COURSE","CHEFS_SPECIAL","PricingPlanAmount","plan","interval","discountedPrice","intervalPrice","undefined","originalPrice","Pricing","onPlanSelect","onIntervalSelect","selectedInterval","setSelectedInterval","plans","PlanParent","intervals","handleSelectInterval","benefits","benefit","Check"],"mappings":"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","x_google_ignoreList":[0]}