@loczer/storefront-sdk 0.209.0 → 0.211.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/chunks/pkg/booking-engine/dist/node_modules/@date-fns/tz/date/index-DAbcklF5.js +1 -0
  2. package/dist/chunks/pkg/booking-engine/dist/node_modules/@date-fns/tz/date/mini-CSEBo1ZP.js +60 -0
  3. package/dist/chunks/pkg/booking-engine/dist/node_modules/@date-fns/tz/index--u3Qf-qy.js +4 -0
  4. package/dist/chunks/pkg/booking-engine/dist/node_modules/@date-fns/tz/tz/index-CEcibV-H.js +1 -0
  5. package/dist/chunks/pkg/booking-engine/dist/node_modules/@date-fns/tz/tzOffset/index-COlDDdap.js +22 -0
  6. package/dist/chunks/pkg/booking-engine/dist/pricing-BJaynUu_.js +3 -0
  7. package/dist/chunks/pkg/booking-engine/dist/utils/schedule-ssRov9xe.js +39 -0
  8. package/dist/chunks/pkg/booking-engine/dist/utils/timezone-B6XIbBPz.js +79 -0
  9. package/dist/components/AdminFloatingButton/AdminFloatingButton.d.ts +7 -0
  10. package/dist/components/AdminFloatingButton/AdminFloatingButton.d.ts.map +1 -0
  11. package/dist/components/AdminFloatingButton/AdminFloatingButton.js +36 -0
  12. package/dist/components/AdminFloatingButton/index.d.ts +3 -0
  13. package/dist/components/AdminFloatingButton/index.d.ts.map +1 -0
  14. package/dist/components/AdminFloatingButton/index.js +2 -0
  15. package/dist/components/BookingPeriodSelector/useBookingPeriodController.d.ts.map +1 -1
  16. package/dist/components/BookingPeriodSelector/useBookingPeriodController.js +213 -213
  17. package/dist/components/ContactSection/index.d.ts.map +1 -1
  18. package/dist/components/ContactSection/index.js +4 -7
  19. package/dist/components/Header/index.js +1 -0
  20. package/dist/components/PlaygroundDevFloatingButton/index.d.ts.map +1 -1
  21. package/dist/components/PlaygroundDevFloatingButton/index.js +121 -100
  22. package/dist/components/ProductPriceBadge/index.d.ts.map +1 -1
  23. package/dist/components/ProductPriceBadge/index.js +86 -80
  24. package/dist/components/StorefrontCartPanel/index.d.ts +4 -4
  25. package/dist/components/StorefrontCartPanel/index.d.ts.map +1 -1
  26. package/dist/components/StorefrontCartPanel/index.js +10 -9
  27. package/dist/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.d.ts +2 -3
  28. package/dist/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.d.ts.map +1 -1
  29. package/dist/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.js +7 -81
  30. package/dist/i18n/en.d.ts +11 -7
  31. package/dist/i18n/en.d.ts.map +1 -1
  32. package/dist/i18n/en.js +13 -9
  33. package/dist/i18n/fr.d.ts +11 -7
  34. package/dist/i18n/fr.d.ts.map +1 -1
  35. package/dist/i18n/fr.js +13 -9
  36. package/dist/index.d.ts +62 -39
  37. package/dist/index.js +68 -66
  38. package/dist/lib/booking.d.ts +0 -6
  39. package/dist/lib/booking.d.ts.map +1 -1
  40. package/dist/lib/booking.js +51 -65
  41. package/dist/lib/cartSummary.d.ts +5 -3
  42. package/dist/lib/cartSummary.d.ts.map +1 -1
  43. package/dist/lib/cartSummary.js +7 -7
  44. package/dist/lib/floatingButtonCollision.d.ts +20 -0
  45. package/dist/lib/floatingButtonCollision.d.ts.map +1 -0
  46. package/dist/lib/floatingButtonCollision.js +72 -0
  47. package/dist/lib/pricing.d.ts +18 -6
  48. package/dist/lib/pricing.d.ts.map +1 -1
  49. package/dist/lib/pricing.js +45 -29
  50. package/dist/lib/useDraggableFloatingButton.d.ts +7 -0
  51. package/dist/lib/useDraggableFloatingButton.d.ts.map +1 -0
  52. package/dist/lib/useDraggableFloatingButton.js +107 -0
  53. package/dist/pages/BookingPage.d.ts.map +1 -1
  54. package/dist/pages/BookingPage.js +205 -201
  55. package/dist/pages/CheckoutPage.d.ts.map +1 -1
  56. package/dist/pages/CheckoutPage.js +195 -191
  57. package/dist/pages/checkout/components/CheckoutSummaryColumn.d.ts +2 -2
  58. package/dist/pages/checkout/components/CheckoutSummaryColumn.d.ts.map +1 -1
  59. package/dist/pages/checkout/components/CheckoutSummaryColumn.js +4 -4
  60. package/dist/storefront.css +1 -1
  61. package/dist/ui/day-picker.js +1 -1
  62. package/package.json +1 -1
@@ -1,110 +1,113 @@
1
- import { buildDailyPriceRows as e, buildPriceTierLabels as t, formatStorefrontPriceMinor as n } from "../../lib/pricing.js";
2
- import { Badge as r, badgeVariants as i } from "../../ui/badge.js";
3
- import { useOptionalStorefront as a } from "../../StorefrontContext.js";
4
- import { useEffect as o, useId as ee, useRef as s, useState as c } from "react";
5
- import { Fragment as te, jsx as l, jsxs as u } from "react/jsx-runtime";
1
+ import { buildPriceTierLabels as e, buildRentalPriceRows as t, formatRentalUnitQuantity as ee, formatStorefrontPriceMinor as n, getPricingUnitLabel as r } from "../../lib/pricing.js";
2
+ import { Badge as i, badgeVariants as a } from "../../ui/badge.js";
3
+ import { useOptionalStorefront as te } from "../../StorefrontContext.js";
4
+ import { useEffect as o, useId as ne, useRef as s, useState as c } from "react";
5
+ import { Fragment as re, jsx as l, jsxs as u } from "react/jsx-runtime";
6
6
  import { useMediaQuery as d } from "@rpcbase/client";
7
- import { useTranslation as ne } from "react-i18next";
7
+ import { useTranslation as ie } from "react-i18next";
8
8
  import { cn as f } from "@rpcbase/ui";
9
- import { Info as re, Mail as p, Phone as m, TrendingDown as h } from "lucide-react";
10
- import { Drawer as g } from "@base-ui/react/drawer";
11
- import { Popover as _ } from "@base-ui/react/popover";
9
+ import { Info as ae, Mail as oe, Phone as se, TrendingDown as ce } from "lucide-react";
10
+ import { Drawer as p } from "@base-ui/react/drawer";
11
+ import { Popover as m } from "@base-ui/react/popover";
12
12
  //#region src/components/ProductPriceBadge/index.tsx
13
- var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-popover-open", y = (e) => typeof Node < "u" && e instanceof Node, b = (e) => {
14
- typeof window > "u" || window.dispatchEvent(new CustomEvent(v, { detail: { id: e } }));
15
- }, x = ({ prices: x, minPriceMinor: S, className: C, openOnHover: w = !0 }) => {
16
- let { t: T, i18n: E } = ne(), D = ee(), O = a(), oe = d(ae), se = d("(hover: none), (pointer: coarse)"), k = !!(oe || se), [A, j] = c(null), [M, N] = c(!1), P = s(null), F = s(null), I = s(null), L = s(null), R = A !== null, z = t(x, E.language, T), B = e(x, E.language), V = z[0], H = z[1], U = () => {
17
- P.current &&= (clearTimeout(P.current), null);
13
+ var le = 180, h = "(max-width: 767px)", g = "loczer:storefront:product-price-popover-open", _ = (e) => typeof Node < "u" && e instanceof Node, v = (e) => {
14
+ typeof window > "u" || window.dispatchEvent(new CustomEvent(g, { detail: { id: e } }));
15
+ }, y = ({ prices: y, minPriceMinor: b, className: x, openOnHover: S = !0 }) => {
16
+ let { t: C, i18n: w } = ie(), T = ne(), E = te(), ue = d(h), de = d("(hover: none), (pointer: coarse)"), D = !!(ue || de), [O, k] = c(null), [A, j] = c(!1), M = s(null), N = s(null), P = s(null), F = s(null), I = O !== null, L = E?.storefrontConfiguration.bookingEngine.pricing.baseUnit ?? "day", R = r(L, C), z = e(y, w.language, C, L), B = t(y, w.language, L), V = z[0], H = z[1], U = () => {
17
+ M.current &&= (clearTimeout(M.current), null);
18
18
  }, W = (e) => {
19
- k || (U(), j((t) => t === "click" ? t : e), b(D));
19
+ D || (U(), k((t) => t === "click" ? t : e), v(T));
20
20
  }, G = () => {
21
- U(), j(null);
22
- }, ce = () => {
23
- U(), N(!0), b(D);
24
- }, le = () => {
25
- N(!1);
26
- }, ue = () => {
27
- !w || R || W("hover");
28
- }, de = (e) => y(e) ? !!(F.current?.contains(e) || L.current?.contains(e)) : !1, K = (e) => y(e) ? !!(I.current?.contains(e) || L.current?.contains(e)) : !1, q = (e) => {
29
- A !== "hover" || K(e) || (U(), P.current = setTimeout(() => {
30
- j((e) => e === "hover" ? null : e), P.current = null;
31
- }, ie));
21
+ U(), k(null);
22
+ }, fe = () => {
23
+ U(), j(!0), v(T);
24
+ }, pe = () => {
25
+ j(!1);
26
+ }, me = () => {
27
+ !S || I || W("hover");
28
+ }, he = (e) => _(e) ? !!(N.current?.contains(e) || F.current?.contains(e)) : !1, K = (e) => _(e) ? !!(P.current?.contains(e) || F.current?.contains(e)) : !1, q = (e) => {
29
+ O !== "hover" || K(e) || (U(), M.current = setTimeout(() => {
30
+ k((e) => e === "hover" ? null : e), M.current = null;
31
+ }, le));
32
32
  }, J = (e) => {
33
33
  q(e?.relatedTarget);
34
- }, fe = (e) => {
34
+ }, ge = (e) => {
35
35
  let t = e.relatedTarget ?? document.activeElement;
36
- de(t) || G();
36
+ he(t) || G();
37
37
  };
38
38
  if (o(() => {
39
39
  if (typeof window > "u") return () => {
40
40
  U();
41
41
  };
42
42
  let e = (e) => {
43
- e.detail?.id !== D && (U(), j(null), N(!1));
43
+ e.detail?.id !== T && (U(), k(null), j(!1));
44
44
  };
45
- return window.addEventListener(v, e), () => {
46
- window.removeEventListener(v, e), U();
45
+ return window.addEventListener(g, e), () => {
46
+ window.removeEventListener(g, e), U();
47
47
  };
48
- }, [D]), o(() => {
49
- if (A !== "hover" || typeof window > "u") return;
48
+ }, [T]), o(() => {
49
+ if (O !== "hover" || typeof window > "u") return;
50
50
  let e = (e) => {
51
51
  if (K(e.target)) {
52
52
  U();
53
53
  return;
54
54
  }
55
- P.current || q(e.target);
55
+ M.current || q(e.target);
56
56
  };
57
57
  return window.addEventListener("pointermove", e, { passive: !0 }), window.addEventListener("mousemove", e, { passive: !0 }), () => {
58
58
  window.removeEventListener("pointermove", e), window.removeEventListener("mousemove", e);
59
59
  };
60
- }, [A]), o(() => {
61
- if (k) {
62
- U(), j(null);
60
+ }, [O]), o(() => {
61
+ if (D) {
62
+ U(), k(null);
63
63
  return;
64
64
  }
65
- N(!1);
66
- }, [k]), !V) return typeof S == "number" ? /* @__PURE__ */ l(r, {
65
+ j(!1);
66
+ }, [D]), !V) return typeof b == "number" ? /* @__PURE__ */ l(i, {
67
67
  variant: "outline",
68
- className: f("border-slate-200 bg-white text-slate-700", C),
69
- children: /* @__PURE__ */ l("span", { children: T("price_from", { price: n(S, E.language) }) })
68
+ className: f("border-slate-200 bg-white text-slate-700", x),
69
+ children: /* @__PURE__ */ l("span", { children: C("price_from", {
70
+ price: n(b, w.language),
71
+ unit: R
72
+ }) })
70
73
  }) : null;
71
- let Y = f(i({ variant: "outline" }), "gap-1.5 border-slate-200 bg-white text-slate-700 outline-none transition hover:border-slate-300 hover:text-slate-950 focus:border-slate-200 focus:outline-none focus:ring-0 focus:ring-transparent focus:ring-offset-0 focus-visible:border-slate-200 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0", B.length > 0 && "cursor-pointer", C), X = O?.storefrontConfiguration.shop.emailAddress?.trim(), Z = O?.storefrontConfiguration.shop.contactPhone1?.trim(), pe = !!(X || Z), Q = () => /* @__PURE__ */ u(te, { children: [
74
+ let Y = f(a({ variant: "outline" }), "gap-1.5 border-slate-200 bg-white text-slate-700 outline-none transition hover:border-slate-300 hover:text-slate-950 focus:border-slate-200 focus:outline-none focus:ring-0 focus:ring-transparent focus:ring-offset-0 focus-visible:border-slate-200 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0", B.length > 0 && "cursor-pointer", x), X = E?.storefrontConfiguration.shop.emailAddress?.trim(), Z = E?.storefrontConfiguration.shop.contactPhone1?.trim(), _e = !!(X || Z), Q = () => /* @__PURE__ */ u(re, { children: [
72
75
  /* @__PURE__ */ l("span", {
73
76
  className: "font-semibold",
74
77
  children: V
75
78
  }),
76
79
  H ? /* @__PURE__ */ u("span", {
77
80
  className: "inline-flex items-center gap-1 text-slate-500",
78
- children: [/* @__PURE__ */ l(h, {
81
+ children: [/* @__PURE__ */ l(ce, {
79
82
  className: "h-3 w-3",
80
83
  strokeWidth: 2.4,
81
84
  "aria-hidden": "true"
82
- }), /* @__PURE__ */ l("span", { children: T("price_then", { price: H }) })]
85
+ }), /* @__PURE__ */ l("span", { children: C("price_then", { price: H }) })]
83
86
  }) : null,
84
87
  B.length > 0 ? /* @__PURE__ */ l("span", {
85
- ref: I,
88
+ ref: P,
86
89
  className: "inline-flex shrink-0 items-center text-slate-500",
87
90
  onMouseEnter: () => {
88
- w && W("hover");
91
+ S && W("hover");
89
92
  },
90
- onMouseMove: ue,
93
+ onMouseMove: me,
91
94
  onMouseLeave: J,
92
- children: /* @__PURE__ */ l(re, {
95
+ children: /* @__PURE__ */ l(ae, {
93
96
  className: "h-3 w-3",
94
97
  "aria-hidden": "true"
95
98
  })
96
99
  }) : null
97
- ] }), me = () => pe ? /* @__PURE__ */ u("div", {
100
+ ] }), ve = () => _e ? /* @__PURE__ */ u("div", {
98
101
  className: "border-t border-slate-200 pt-2 text-slate-600",
99
102
  children: [/* @__PURE__ */ l("p", {
100
103
  className: "leading-snug",
101
- children: /* @__PURE__ */ l("span", { children: T("price_table_contact_prompt") })
104
+ children: /* @__PURE__ */ l("span", { children: C("price_table_contact_prompt") })
102
105
  }), /* @__PURE__ */ u("div", {
103
106
  className: "mt-2 flex flex-wrap gap-x-3 gap-y-1",
104
107
  children: [Z ? /* @__PURE__ */ u("a", {
105
108
  className: "inline-flex min-w-0 items-center gap-1 font-medium text-slate-800 underline-offset-4 hover:underline",
106
109
  href: `tel:${Z}`,
107
- children: [/* @__PURE__ */ l(m, {
110
+ children: [/* @__PURE__ */ l(se, {
108
111
  className: "h-3 w-3 shrink-0",
109
112
  "aria-hidden": "true"
110
113
  }), /* @__PURE__ */ l("span", {
@@ -114,7 +117,7 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
114
117
  }) : null, X ? /* @__PURE__ */ u("a", {
115
118
  className: "inline-flex min-w-0 items-center gap-1 font-medium text-slate-800 underline-offset-4 hover:underline",
116
119
  href: `mailto:${X}`,
117
- children: [/* @__PURE__ */ l(p, {
120
+ children: [/* @__PURE__ */ l(oe, {
118
121
  className: "h-3 w-3 shrink-0",
119
122
  "aria-hidden": "true"
120
123
  }), /* @__PURE__ */ l("span", {
@@ -128,12 +131,15 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
128
131
  children: [
129
132
  e ? /* @__PURE__ */ l("p", {
130
133
  className: "font-semibold uppercase tracking-[0.12em] text-slate-500",
131
- children: /* @__PURE__ */ l("span", { children: T("price_table_title") })
134
+ children: /* @__PURE__ */ l("span", { children: C("price_table_title") })
132
135
  }) : null,
133
136
  /* @__PURE__ */ l("ul", {
134
137
  className: f("grid gap-1 text-slate-600", t === "drawer" && "gap-1.5"),
135
- children: B.map(({ dayCount: e, totalPriceLabel: n, perDayPriceLabel: r }) => {
136
- let i = T("price_table_day", { count: e }), a = T("price_table_per_day", { price: r });
138
+ children: B.map(({ unitCount: e, totalPriceLabel: n, perUnitPriceLabel: r }) => {
139
+ let i = ee(e, L, w.language, C), a = C("price_table_per_unit", {
140
+ price: r,
141
+ unit: R
142
+ });
137
143
  return /* @__PURE__ */ l("li", { children: /* @__PURE__ */ u("div", {
138
144
  className: "flex items-baseline gap-2",
139
145
  children: [
@@ -160,21 +166,21 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
160
166
  }) }, e);
161
167
  })
162
168
  }),
163
- me()
169
+ ve()
164
170
  ]
165
171
  });
166
- return k ? /* @__PURE__ */ u(g.Root, {
167
- open: M,
172
+ return D ? /* @__PURE__ */ u(p.Root, {
173
+ open: A,
168
174
  onOpenChange: (e) => {
169
- e ? ce() : le();
175
+ e ? fe() : pe();
170
176
  },
171
177
  swipeDirection: "down",
172
- children: [/* @__PURE__ */ l(g.Trigger, {
173
- ref: F,
178
+ children: [/* @__PURE__ */ l(p.Trigger, {
179
+ ref: N,
174
180
  type: "button",
175
181
  className: Y,
176
- "aria-label": T("price_details_aria_label", { price: V }),
177
- "aria-expanded": M,
182
+ "aria-label": C("price_details_aria_label", { price: V }),
183
+ "aria-expanded": A,
178
184
  onClick: (e) => {
179
185
  e.stopPropagation();
180
186
  },
@@ -182,20 +188,20 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
182
188
  e.stopPropagation();
183
189
  },
184
190
  children: Q()
185
- }), /* @__PURE__ */ u(g.Portal, { children: [/* @__PURE__ */ l(g.Backdrop, { className: "pointer-events-auto fixed inset-0 z-50 bg-black/50 outline-none data-[closed]:animate-out data-[closed]:fade-out-0 data-[open]:animate-in data-[open]:fade-in-0" }), /* @__PURE__ */ l(g.Viewport, {
191
+ }), /* @__PURE__ */ u(p.Portal, { children: [/* @__PURE__ */ l(p.Backdrop, { className: "pointer-events-auto fixed inset-0 z-50 bg-black/50 outline-none data-[closed]:animate-out data-[closed]:fade-out-0 data-[open]:animate-in data-[open]:fade-in-0" }), /* @__PURE__ */ l(p.Viewport, {
186
192
  className: "pointer-events-none fixed inset-0 z-50",
187
- children: /* @__PURE__ */ u(g.Popup, {
193
+ children: /* @__PURE__ */ u(p.Popup, {
188
194
  className: "pointer-events-auto fixed inset-x-0 bottom-0 z-50 flex max-h-[90dvh] flex-col rounded-t-2xl border-t border-slate-200 bg-white text-slate-950 shadow-xl outline-none data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:slide-out-to-bottom data-[open]:animate-in data-[open]:fade-in-0 data-[open]:slide-in-from-bottom",
189
195
  children: [/* @__PURE__ */ l("div", {
190
196
  className: "mx-auto mt-4 h-2 w-[100px] shrink-0 rounded-full bg-slate-200",
191
197
  "aria-hidden": "true"
192
- }), /* @__PURE__ */ l(g.Content, { children: /* @__PURE__ */ u("div", {
198
+ }), /* @__PURE__ */ l(p.Content, { children: /* @__PURE__ */ u("div", {
193
199
  className: "flex max-h-[calc(90dvh-1rem)] flex-col",
194
200
  children: [/* @__PURE__ */ l("div", {
195
201
  className: "border-b border-slate-200 px-4 py-4 text-left",
196
- children: /* @__PURE__ */ l(g.Title, {
202
+ children: /* @__PURE__ */ l(p.Title, {
197
203
  className: "text-left text-lg font-semibold text-slate-950",
198
- children: /* @__PURE__ */ l("span", { children: T("price_table_title") })
204
+ children: /* @__PURE__ */ l("span", { children: C("price_table_title") })
199
205
  })
200
206
  }), /* @__PURE__ */ l("div", {
201
207
  className: "flex-1 overflow-y-auto px-4 pb-6 pt-3",
@@ -204,33 +210,33 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
204
210
  }) })]
205
211
  })
206
212
  })] })]
207
- }) : /* @__PURE__ */ u(_.Root, {
208
- open: R,
213
+ }) : /* @__PURE__ */ u(m.Root, {
214
+ open: I,
209
215
  onOpenChange: (e) => {
210
216
  e ? W("click") : G();
211
217
  },
212
- children: [/* @__PURE__ */ l(_.Trigger, {
213
- ref: F,
218
+ children: [/* @__PURE__ */ l(m.Trigger, {
219
+ ref: N,
214
220
  type: "button",
215
221
  className: Y,
216
- "aria-label": T("price_details_aria_label", { price: V }),
217
- "aria-expanded": R,
218
- onBlur: fe,
222
+ "aria-label": C("price_details_aria_label", { price: V }),
223
+ "aria-expanded": I,
224
+ onBlur: ge,
219
225
  onClick: (e) => {
220
- e.preventDefault(), e.stopPropagation(), A === "click" ? G() : W("click");
226
+ e.preventDefault(), e.stopPropagation(), O === "click" ? G() : W("click");
221
227
  },
222
228
  onPointerDown: (e) => {
223
229
  e.stopPropagation();
224
230
  },
225
231
  children: Q()
226
- }), B.length > 0 ? /* @__PURE__ */ l(_.Portal, { children: /* @__PURE__ */ l(_.Positioner, {
232
+ }), B.length > 0 ? /* @__PURE__ */ l(m.Portal, { children: /* @__PURE__ */ l(m.Positioner, {
227
233
  side: "top",
228
234
  align: "end",
229
235
  sideOffset: 8,
230
236
  collisionPadding: 12,
231
237
  className: "pointer-events-auto z-[70] outline-none",
232
- children: /* @__PURE__ */ l(_.Popup, {
233
- ref: L,
238
+ children: /* @__PURE__ */ l(m.Popup, {
239
+ ref: F,
234
240
  initialFocus: !1,
235
241
  className: "w-64 rounded-xl border border-slate-200 bg-white p-3 text-slate-950 shadow-xl outline-none data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95",
236
242
  onPointerDown: (e) => {
@@ -247,4 +253,4 @@ var ie = 180, ae = "(max-width: 767px)", v = "loczer:storefront:product-price-po
247
253
  });
248
254
  };
249
255
  //#endregion
250
- export { x as ProductPriceBadge };
256
+ export { y as ProductPriceBadge };
@@ -3,14 +3,14 @@ import { StorefrontCartSummaryLine } from '../../lib/cartSummary';
3
3
  type StorefrontCartPanelProps = {
4
4
  lines: StorefrontCartSummaryLine[];
5
5
  itemCount: number;
6
- totalPerDayMinor: number;
7
- estimatedDays?: number;
6
+ totalPerBaseUnitMinor: number;
7
+ baseUnitLabel: string;
8
8
  estimatedTotalMinor?: number;
9
9
  discountedEstimatedTotalMinor?: number;
10
10
  discountAmountMinor?: number;
11
11
  lateReturnSurchargeMinor?: number;
12
12
  couponCode?: string;
13
- durationLabel?: string;
13
+ durationInBaseUnitLabel?: string;
14
14
  title?: string;
15
15
  description?: string;
16
16
  checkoutPath?: string;
@@ -23,6 +23,6 @@ type StorefrontCartPanelProps = {
23
23
  onRemove?: (key: string) => void;
24
24
  onClear?: () => void;
25
25
  };
26
- export declare function StorefrontCartPanel({ lines, itemCount, totalPerDayMinor, estimatedDays, estimatedTotalMinor, discountedEstimatedTotalMinor, discountAmountMinor, lateReturnSurchargeMinor, couponCode, durationLabel, title, description, checkoutPath, showCheckoutAction, showClearAction, editable, summaryAddon, stickyTopClassName, onQuantityChange, onRemove, onClear, }: StorefrontCartPanelProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare function StorefrontCartPanel({ lines, itemCount, totalPerBaseUnitMinor, baseUnitLabel, estimatedTotalMinor, discountedEstimatedTotalMinor, discountAmountMinor, lateReturnSurchargeMinor, couponCode, durationInBaseUnitLabel, title, description, checkoutPath, showCheckoutAction, showClearAction, editable, summaryAddon, stickyTopClassName, onQuantityChange, onRemove, onClear, }: StorefrontCartPanelProps): import("react/jsx-runtime").JSX.Element;
27
27
  export {};
28
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/StorefrontCartPanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAQtE,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,yBAAyB,EAAE,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,aAAa,EACb,KAAK,EACL,WAAW,EACX,YAAY,EACZ,kBAA0B,EAC1B,eAAuB,EACvB,QAAe,EACf,YAAY,EACZ,kBAA6B,EAC7B,gBAAgB,EAChB,QAAQ,EACR,OAAO,GACR,EAAE,wBAAwB,2CA0L1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/StorefrontCartPanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAQtE,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,yBAAyB,EAAE,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,6BAA6B,CAAC,EAAE,MAAM,CAAA;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,SAAS,EACT,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,uBAAuB,EACvB,KAAK,EACL,WAAW,EACX,YAAY,EACZ,kBAA0B,EAC1B,eAAuB,EACvB,QAAe,EACf,YAAY,EACZ,kBAA6B,EAC7B,gBAAgB,EAChB,QAAQ,EACR,OAAO,GACR,EAAE,wBAAwB,2CAgM1B"}
@@ -10,7 +10,7 @@ import { useTranslation as u } from "react-i18next";
10
10
  import { cn as d } from "@rpcbase/ui";
11
11
  import { ArrowRight as f, Trash2 as p } from "lucide-react";
12
12
  //#region src/components/StorefrontCartPanel/index.tsx
13
- function m({ lines: m, itemCount: h, totalPerDayMinor: g, estimatedDays: _, estimatedTotalMinor: v, discountedEstimatedTotalMinor: y, discountAmountMinor: b, lateReturnSurchargeMinor: x, couponCode: S, durationLabel: C, title: w, description: T, checkoutPath: E, showCheckoutAction: D = !1, showClearAction: O = !1, editable: k = !0, summaryAddon: A, stickyTopClassName: j = "top-24", onQuantityChange: M, onRemove: N, onClear: P }) {
13
+ function m({ lines: m, itemCount: h, totalPerBaseUnitMinor: g, baseUnitLabel: _, estimatedTotalMinor: v, discountedEstimatedTotalMinor: y, discountAmountMinor: b, lateReturnSurchargeMinor: x, couponCode: S, durationInBaseUnitLabel: C, title: w, description: T, checkoutPath: E, showCheckoutAction: D = !1, showClearAction: O = !1, editable: k = !0, summaryAddon: A, stickyTopClassName: j = "top-24", onQuantityChange: M, onRemove: N, onClear: P }) {
14
14
  let { t: F, i18n: I } = u();
15
15
  return /* @__PURE__ */ c(i, {
16
16
  className: d("sticky border-slate-200 bg-white shadow-sm", j),
@@ -62,7 +62,8 @@ function m({ lines: m, itemCount: h, totalPerDayMinor: g, estimatedDays: _, esti
62
62
  className: "text-xs text-slate-600",
63
63
  children: /* @__PURE__ */ s("span", { children: F("cart_line_meta", {
64
64
  quantity: i.quantity,
65
- price: o
65
+ price: o,
66
+ unit: _
66
67
  }) })
67
68
  }),
68
69
  l ? /* @__PURE__ */ s("div", {
@@ -107,24 +108,24 @@ function m({ lines: m, itemCount: h, totalPerDayMinor: g, estimatedDays: _, esti
107
108
  className: "flex items-center justify-between gap-3 border-t border-slate-200 pt-3 text-sm",
108
109
  children: [/* @__PURE__ */ s("p", {
109
110
  className: "text-slate-700",
110
- children: /* @__PURE__ */ s("span", { children: F("cart_total_per_day") })
111
+ children: /* @__PURE__ */ s("span", { children: F("cart_total_per_unit", { unit: _ }) })
111
112
  }), /* @__PURE__ */ s("p", {
112
113
  className: "font-semibold text-slate-950",
113
114
  children: /* @__PURE__ */ s("span", { children: e(g, I.language) })
114
115
  })]
115
116
  }),
116
- typeof _ == "number" && typeof v == "number" ? /* @__PURE__ */ c(o, { children: [
117
- /* @__PURE__ */ c("div", {
117
+ typeof v == "number" ? /* @__PURE__ */ c(o, { children: [
118
+ C ? /* @__PURE__ */ c("div", {
118
119
  className: "flex items-center justify-between gap-3 text-sm",
119
120
  children: [/* @__PURE__ */ s("p", {
120
121
  className: "text-slate-700",
121
- children: /* @__PURE__ */ s("span", { children: F("checkout_estimated_days", { count: _ }) })
122
- }), C ? /* @__PURE__ */ s(t, {
122
+ children: /* @__PURE__ */ s("span", { children: F("checkout_estimated_duration") })
123
+ }), /* @__PURE__ */ s(t, {
123
124
  variant: "outline",
124
125
  className: "border-slate-200 bg-white text-slate-700",
125
126
  children: /* @__PURE__ */ s("span", { children: C })
126
- }) : null]
127
- }),
127
+ })]
128
+ }) : null,
128
129
  typeof b == "number" && b > 0 ? /* @__PURE__ */ c("div", {
129
130
  className: "flex items-center justify-between gap-3 text-sm",
130
131
  children: [/* @__PURE__ */ s("p", {
@@ -1,11 +1,10 @@
1
- import { MouseEventHandler } from 'react';
2
1
  export interface WhatsAppFloatingButtonOptions {
3
2
  href?: string;
4
3
  }
5
4
  export declare const useWhatsAppFloatingButton: (options?: WhatsAppFloatingButtonOptions) => {
6
- href: string | undefined;
7
5
  containerRef: import('react').RefObject<HTMLDivElement | null>;
8
6
  bubbleRef: import('react').RefObject<HTMLDivElement | null>;
9
- onLinkClick: MouseEventHandler<HTMLAnchorElement>;
7
+ onLinkClick: import('react').MouseEventHandler<HTMLAnchorElement>;
8
+ href: string | undefined;
10
9
  };
11
10
  //# sourceMappingURL=useWhatsAppFloatingButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWhatsAppFloatingButton.d.ts","sourceRoot":"","sources":["../../../src/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAI9E,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAiBD,eAAO,MAAM,yBAAyB,GACpC,UAAS,6BAAkC;;;;;CA6K5C,CAAA"}
1
+ {"version":3,"file":"useWhatsAppFloatingButton.d.ts","sourceRoot":"","sources":["../../../src/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAGD,eAAO,MAAM,yBAAyB,GACpC,UAAS,6BAAkC;;;;;CAU5C,CAAA"}
@@ -1,85 +1,11 @@
1
- import { useCallback as e, useEffect as t, useRef as n } from "react";
2
- import r from "interactjs";
1
+ import { useDraggableFloatingButton as e } from "../../lib/useDraggableFloatingButton.js";
3
2
  //#region src/components/WhatsAppFloatingButton/useWhatsAppFloatingButton.ts
4
- var i = (i = {}) => {
5
- let { href: a } = i, o = a, s = n(null), c = n(null), l = n(!1), u = n(!1), d = n({
6
- x: 0,
7
- y: 0
8
- }), f = n(null), p = n(null);
9
- return t(() => {
10
- let e = c.current;
11
- if (!e) return;
12
- let t = e.getBoundingClientRect();
13
- f.current = {
14
- left: t.left,
15
- top: t.top,
16
- width: t.width,
17
- height: t.height
18
- };
19
- let n = () => {
20
- if (!f.current) return d.current;
21
- let { left: e, top: t, width: n, height: r } = f.current, i = 8 - e, a = 8 - t, o = window.innerWidth - 8 - n - e, s = window.innerHeight - 8 - r - t, c = Math.min(Math.max(d.current.x, i), o), l = Math.min(Math.max(d.current.y, a), s);
22
- return d.current = {
23
- x: c,
24
- y: l
25
- }, {
26
- x: c,
27
- y: l,
28
- minX: i,
29
- minY: a,
30
- maxX: o,
31
- maxY: s
32
- };
33
- }, i = () => {
34
- let { x: t, y: r } = n();
35
- e.style.transform = `translate3d(${t}px, ${r}px, 0)`;
36
- }, a = () => {
37
- p.current != null && (cancelAnimationFrame(p.current), p.current = null), u.current = !1;
38
- }, o = typeof window < "u" && window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches, s = (t, r) => {
39
- if (o) {
40
- i();
41
- return;
42
- }
43
- let s = performance.now();
44
- u.current = !0;
45
- let c = .92, l = .7, f = (i) => {
46
- let o = (i - s) / 1e3;
47
- s = i, d.current.x += t * o, d.current.y += r * o;
48
- let { minX: u, minY: m, maxX: h, maxY: g } = n();
49
- if (d.current.x <= u + .001 && t < 0 ? (d.current.x = u, t = -t * l) : d.current.x >= h - .001 && t > 0 && (d.current.x = h, t = -t * l), d.current.y <= m + .001 && r < 0 ? (d.current.y = m, r = -r * l) : d.current.y >= g - .001 && r > 0 && (d.current.y = g, r = -r * l), t *= c, r *= c, e.style.transform = `translate3d(${d.current.x}px, ${d.current.y}px, 0)`, Math.hypot(t, r) < 20) {
50
- a();
51
- return;
52
- }
53
- p.current = requestAnimationFrame(f);
54
- };
55
- p.current = requestAnimationFrame(f);
56
- }, m = r(e).draggable({ inertia: !1 }).styleCursor(!1).on("dragstart", () => {
57
- a(), l.current = !0;
58
- }).on("dragmove", (e) => {
59
- d.current.x += e.dx, d.current.y += e.dy, i();
60
- }).on("dragend", (e) => {
61
- let t = Number.isFinite(e.velocityX) ? e.velocityX : 0, n = Number.isFinite(e.velocityY) ? e.velocityY : 0;
62
- l.current = !1, Math.hypot(t, n) >= 10 && s(t, n);
63
- }), h = () => {
64
- let t = e.getBoundingClientRect();
65
- f.current = {
66
- left: t.left - d.current.x,
67
- top: t.top - d.current.y,
68
- width: t.width,
69
- height: t.height
70
- }, i();
71
- };
72
- return window.addEventListener("resize", h), i(), () => {
73
- m.unset(), a(), window.removeEventListener("resize", h);
74
- };
75
- }, []), {
76
- href: o,
77
- containerRef: s,
78
- bubbleRef: c,
79
- onLinkClick: e((e) => {
80
- (l.current || u.current) && (e.preventDefault(), e.stopPropagation());
81
- }, [])
3
+ var t = (t = {}) => {
4
+ let { href: n } = t;
5
+ return {
6
+ href: n,
7
+ ...e("whatsapp-floating-button")
82
8
  };
83
9
  };
84
10
  //#endregion
85
- export { i as useWhatsAppFloatingButton };
11
+ export { t as useWhatsAppFloatingButton };
package/dist/i18n/en.d.ts CHANGED
@@ -137,12 +137,18 @@ export declare const storefront: {
137
137
  price_then: string;
138
138
  price_details_aria_label: string;
139
139
  price_table_title: string;
140
- price_table_day_one: string;
141
- price_table_day_other: string;
142
- price_table_per_day: string;
140
+ price_table_per_unit: string;
143
141
  price_table_contact_prompt: string;
142
+ price_unit_hour_one: string;
143
+ price_unit_hour_other: string;
144
+ price_unit_half_day_one: string;
145
+ price_unit_half_day_other: string;
144
146
  price_unit_day_one: string;
145
147
  price_unit_day_other: string;
148
+ price_unit_week_one: string;
149
+ price_unit_week_other: string;
150
+ price_unit_month_one: string;
151
+ price_unit_month_other: string;
146
152
  products_title: string;
147
153
  products_description: string;
148
154
  products_page_title: string;
@@ -162,7 +168,7 @@ export declare const storefront: {
162
168
  cart_empty_description: string;
163
169
  cart_line_meta: string;
164
170
  remove_from_cart: string;
165
- cart_total_per_day: string;
171
+ cart_total_per_unit: string;
166
172
  cart_clear: string;
167
173
  booking_select_variant_cancel: string;
168
174
  close_modal: string;
@@ -184,8 +190,7 @@ export declare const storefront: {
184
190
  checkout_subtitle: string;
185
191
  checkout_summary_title: string;
186
192
  checkout_summary_description: string;
187
- checkout_estimated_days_one: string;
188
- checkout_estimated_days_other: string;
193
+ checkout_estimated_duration: string;
189
194
  checkout_estimated_total: string;
190
195
  checkout_form_title: string;
191
196
  checkout_form_description: string;
@@ -348,7 +353,6 @@ export declare const storefront: {
348
353
  contact_form_phone_placeholder: string;
349
354
  contact_form_message_label: string;
350
355
  contact_form_message_placeholder: string;
351
- contact_form_privacy_hint: string;
352
356
  contact_form_submit_button: string;
353
357
  contact_form_submitting_button: string;
354
358
  contact_form_success_toast: string;
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2etB,CAAA"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+etB,CAAA"}
package/dist/i18n/en.js CHANGED
@@ -134,16 +134,22 @@ var e = {
134
134
  availability_checking: "Checking availability",
135
135
  availability_remaining_count_one: "{{count}} available",
136
136
  availability_remaining_count_other: "{{count}} available",
137
- price_from: "From {{price}} / day",
137
+ price_from: "From {{price}} / {{unit}}",
138
138
  price_then: "then {{price}}",
139
139
  price_details_aria_label: "Show pricing details for {{price}}",
140
140
  price_table_title: "Rental pricing",
141
- price_table_day_one: "{{count}} day",
142
- price_table_day_other: "{{count}} days",
143
- price_table_per_day: "{{price}}/d",
141
+ price_table_per_unit: "{{price}}/{{unit}}",
144
142
  price_table_contact_prompt: "For a specific booking or a longer rental, feel free to contact us.",
143
+ price_unit_hour_one: "hour",
144
+ price_unit_hour_other: "hours",
145
+ price_unit_half_day_one: "half-day",
146
+ price_unit_half_day_other: "half-days",
145
147
  price_unit_day_one: "day",
146
148
  price_unit_day_other: "days",
149
+ price_unit_week_one: "week",
150
+ price_unit_week_other: "weeks",
151
+ price_unit_month_one: "month",
152
+ price_unit_month_other: "months",
147
153
  products_title: "Our bikes range",
148
154
  products_description: "Browse bikes and reserve in a few clicks.",
149
155
  products_page_title: "Choose your bikes",
@@ -161,9 +167,9 @@ var e = {
161
167
  cart_empty: "Your cart is empty.",
162
168
  cart_empty_title: "Your cart is empty",
163
169
  cart_empty_description: "Add a bike (and accessories) to continue.",
164
- cart_line_meta: "Qty {{quantity}} · {{price}} / day",
170
+ cart_line_meta: "Qty {{quantity}} · {{price}} / {{unit}}",
165
171
  remove_from_cart: "Remove from cart",
166
- cart_total_per_day: "Total / day",
172
+ cart_total_per_unit: "Total / {{unit}}",
167
173
  cart_clear: "Clear cart",
168
174
  booking_select_variant_cancel: "Cancel",
169
175
  close_modal: "Close",
@@ -185,8 +191,7 @@ var e = {
185
191
  checkout_subtitle: "Confirm your details and payment · {{duration}}",
186
192
  checkout_summary_title: "Summary",
187
193
  checkout_summary_description: "Cart and pricing recap.",
188
- checkout_estimated_days_one: "Estimated duration: {{count}} day",
189
- checkout_estimated_days_other: "Estimated duration: {{count}} days",
194
+ checkout_estimated_duration: "Estimated duration",
190
195
  checkout_estimated_total: "Booking total",
191
196
  checkout_form_title: "Your details",
192
197
  checkout_form_description: "Enter your details for this booking, and add any useful information in the notes.",
@@ -349,7 +354,6 @@ var e = {
349
354
  contact_form_phone_placeholder: "+1 555 555 5555",
350
355
  contact_form_message_label: "Message",
351
356
  contact_form_message_placeholder: "How can we help?",
352
- contact_form_privacy_hint: "We’ll only use your details to reply.",
353
357
  contact_form_submit_button: "Send message",
354
358
  contact_form_submitting_button: "Sending…",
355
359
  contact_form_success_toast: "Message sent.",