your-ai-workflow-firebase-os 2.0.2 → 2.0.3

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 (180) hide show
  1. package/dist/AccessNotice-BZ5Gt1nP.js +40 -0
  2. package/dist/AccessNotice-CN7kc70o.cjs +1 -0
  3. package/dist/{AddressField-B2YBRXcx.js → AddressField-9Sqn8TvC.js} +3 -3
  4. package/dist/{AddressField-BBv8NGX8.cjs → AddressField-B7wtV8yA.cjs} +1 -1
  5. package/dist/Assets-DBMwZ3bN.cjs +1 -0
  6. package/dist/Assets-DT-NU_WO.js +296 -0
  7. package/dist/Attachments-Bl9_dfsu.js +46 -0
  8. package/dist/Attachments-UVK9SRXf.cjs +1 -0
  9. package/dist/Billing-0RIHayHy.cjs +1 -0
  10. package/dist/Billing-FNE2r3_d.js +379 -0
  11. package/dist/BookingCalendar-BP5kiv3d.cjs +1 -0
  12. package/dist/BookingCalendar-DZ2fEFja.js +309 -0
  13. package/dist/Button-4lzOE31p.js +48 -0
  14. package/dist/Button-5DlB2MCi.cjs +1 -0
  15. package/dist/CalendarView-BimoXy_k.cjs +1 -0
  16. package/dist/CalendarView-D-ykjpvI.js +664 -0
  17. package/dist/ConfirmModal-Di9GR-vV.cjs +1 -0
  18. package/dist/ConfirmModal-gKQEpd4d.js +113 -0
  19. package/dist/ContactPopup-BXnHrRwl.js +1114 -0
  20. package/dist/ContactPopup-lxmRMoIa.cjs +1 -0
  21. package/dist/CopyLink-BpEQWmfI.cjs +1 -0
  22. package/dist/CopyLink-CBAVfcm1.js +43 -0
  23. package/dist/DashboardNav-CXa_ci-_.cjs +1 -0
  24. package/dist/DashboardNav-Dmn7PVSp.js +886 -0
  25. package/dist/EmailAdmin-CjN_rvxT.js +318 -0
  26. package/dist/EmailAdmin-lAEBdY1s.cjs +1 -0
  27. package/dist/EventCard-46EquygT.cjs +1 -0
  28. package/dist/EventCard-B6xD-mk3.js +97 -0
  29. package/dist/FileViewerPopup-CX-J75TM.js +1283 -0
  30. package/dist/FileViewerPopup-D8-MmIoS.cjs +3 -0
  31. package/dist/FormNote-BivRNA3J.js +50 -0
  32. package/dist/FormNote-BtdTGpml.cjs +1 -0
  33. package/dist/FormsAdmin-B5PBCG2W.js +812 -0
  34. package/dist/FormsAdmin-BQCULvi5.cjs +1 -0
  35. package/dist/Inbox-BPk2ZkE5.js +779 -0
  36. package/dist/Inbox-DNrcBx0o.cjs +3 -0
  37. package/dist/Loader-Bu89fsbB.cjs +1 -0
  38. package/dist/Loader-D4gwgBOq.js +32 -0
  39. package/dist/ManagePlanButton-B0dwqZBd.cjs +1 -0
  40. package/dist/ManagePlanButton-BSrOHYze.js +29 -0
  41. package/dist/MyBookings-6qr0GgzO.cjs +1 -0
  42. package/dist/MyBookings-BQjGM2LQ.js +113 -0
  43. package/dist/PageTitle-CZhgmmDT.cjs +3 -0
  44. package/dist/PageTitle-D93YCiN8.js +1606 -0
  45. package/dist/PagesAdmin-BcHIcqM5.cjs +34 -0
  46. package/dist/PagesAdmin-D69P9nRb.js +5802 -0
  47. package/dist/PagesAdmin-DNwZOKjA.cjs +1 -0
  48. package/dist/PagesAdmin-HUITEcHx.js +3 -0
  49. package/dist/PaymentsAdmin-C2iCI9qC.js +1291 -0
  50. package/dist/PaymentsAdmin-CoXi2vCm.cjs +2 -0
  51. package/dist/{PhoneInputField-B3P_vUDW.cjs → PhoneInputField-BEwYZMB7.cjs} +1 -1
  52. package/dist/{PhoneInputField-D3wWs-M8.js → PhoneInputField-BG0L2djE.js} +2 -2
  53. package/dist/PhoneInputField-DfOtCIH_.js +2 -0
  54. package/dist/{PhoneInputField-CdNTvWXQ.cjs → PhoneInputField-jhWvto8C.cjs} +1 -1
  55. package/dist/Popup-DHYGFl2-.cjs +1 -0
  56. package/dist/Popup-xROLytgr.js +142 -0
  57. package/dist/ProviderMark-BBfaM5Yl.js +52 -0
  58. package/dist/ProviderMark-xLkUN3Fx.cjs +1 -0
  59. package/dist/PublishApp-Bm-6r3Td.js +595 -0
  60. package/dist/PublishApp-D4XJUkJa.cjs +2 -0
  61. package/dist/Said-CoC15awL.js +94 -0
  62. package/dist/Said-IqCNofdh.cjs +1 -0
  63. package/dist/ScheduleAdmin-BKfQkrR8.js +1853 -0
  64. package/dist/ScheduleAdmin-DwK36GAZ.cjs +1 -0
  65. package/dist/SchedulePicker--urIH2Eb.js +112 -0
  66. package/dist/SchedulePicker-nmqzUnUH.cjs +1 -0
  67. package/dist/Setup-CHLgd-ag.js +849 -0
  68. package/dist/Setup-CaDranTm.cjs +1374 -0
  69. package/dist/SetupPayments-CVIwh1eQ.js +411 -0
  70. package/dist/SetupPayments-HNXWA25X.cjs +1 -0
  71. package/dist/SignInAdmin-C94-A-0w.cjs +4 -0
  72. package/dist/SignInAdmin-Yxgv_8U4.js +766 -0
  73. package/dist/SupportBar-CDT0HwdP.cjs +1 -0
  74. package/dist/SupportBar-CN_JGC-9.js +117 -0
  75. package/dist/SystemTabContent-L3vGGF3P.cjs +1 -0
  76. package/dist/SystemTabContent-QdxxLILE.js +35 -0
  77. package/dist/TemplateDrive-DV8zNjYe.cjs +1 -0
  78. package/dist/TemplateDrive-NJY_AAvV.js +1197 -0
  79. package/dist/ThemeAdmin-BzFjJkLg.js +269 -0
  80. package/dist/ThemeAdmin-DVnPNxe7.cjs +1 -0
  81. package/dist/ThemeAdmin-DY7Vc4Sj.cjs +3 -0
  82. package/dist/ThemeAdmin-DnC-D2N3.js +2 -0
  83. package/dist/{ContactPopup-Dsg2ntq3.js → TimeZoneField-DkI1Bkcz.js} +3191 -5322
  84. package/dist/TimeZoneField-qs7NPR30.cjs +12 -0
  85. package/dist/TransactionsAdmin-BsZ-oQWi.js +582 -0
  86. package/dist/TransactionsAdmin-CTSTiPld.cjs +1 -0
  87. package/dist/Trouble-9es_AI4F.cjs +1 -0
  88. package/dist/Trouble-oWt9fMsm.js +164 -0
  89. package/dist/Users-CTitWXyd.cjs +1 -0
  90. package/dist/Users-DJjQTWJF.js +1207 -0
  91. package/dist/aiModels-DIP9fn8T.cjs +1 -0
  92. package/dist/{aiModels-BHlEfuRJ.js → aiModels-DnDhNGup.js} +29 -61
  93. package/dist/arrivalRoads-BJ-35vkk.js +228 -0
  94. package/dist/arrivalRoads-qoU-B4jt.cjs +4 -0
  95. package/dist/{bake-BWG3y-15.cjs → bake-n2wyFw0B.cjs} +1 -1
  96. package/dist/{bake-BtYOG1Du.js → bake-naZeMu98.js} +1 -1
  97. package/dist/bookingPages-C7a3srPG.js +102 -0
  98. package/dist/bookingPages-DvbFbD9X.cjs +1 -0
  99. package/dist/components/CustomSelect.d.ts +7 -1
  100. package/dist/components/RegistrationFields.d.ts +6 -1
  101. package/dist/components/Reveal.d.ts +12 -0
  102. package/dist/components/ScrollToTop.d.ts +4 -0
  103. package/dist/contentFallback-C9MZjdq7.cjs +1 -0
  104. package/dist/contentFallback-CEDY0Pwp.js +96 -0
  105. package/dist/contentKey-Bwry4lDa.js +13 -0
  106. package/dist/contentKey-DJGYYnAE.cjs +1 -0
  107. package/dist/email-BfnZnMwD.cjs +1 -0
  108. package/dist/email-Ddj8Dlu6.js +58 -0
  109. package/dist/{fileBytes-BdwaFKRy.cjs → fileBytes-BJPaiX9Y.cjs} +1 -1
  110. package/dist/{fileBytes-DuW2K-H_.js → fileBytes-bjgvCfWu.js} +2 -2
  111. package/dist/forms-Bvx9HTM6.js +75 -0
  112. package/dist/forms-CmNeTETW.cjs +1 -0
  113. package/dist/lib/ThemeContext.d.ts +0 -14
  114. package/dist/lib/bareImgWatch.d.ts +6 -1
  115. package/dist/lib/localEdits.d.ts +2 -0
  116. package/dist/lib/paymentProducts.d.ts +8 -0
  117. package/dist/lib/payments.d.ts +11 -1
  118. package/dist/notices-B7iIrIEg.js +29 -0
  119. package/dist/notices-upMg8UVh.cjs +1 -0
  120. package/dist/openOnArrival-Buwqb86D.cjs +1 -0
  121. package/dist/openOnArrival-S2K6v-lB.js +35 -0
  122. package/dist/pageFiles--Ih60ITP.js +45 -0
  123. package/dist/pageFiles-UtBmlOcD.cjs +1 -0
  124. package/dist/pages/PagesAdmin.d.ts +69 -0
  125. package/dist/people-2jZE_pdI.js +102 -0
  126. package/dist/people-BpVvIr9-.cjs +1 -0
  127. package/dist/personName-CFw3pxuu.js +18 -0
  128. package/dist/personName-CbzN_i57.cjs +1 -0
  129. package/dist/publishSteps-C1cDFzzB.js +88 -0
  130. package/dist/publishSteps-SSm8afDw.cjs +1 -0
  131. package/dist/recordLock-DHVvI9bP.js +61 -0
  132. package/dist/recordLock-DWeIxiwh.cjs +1 -0
  133. package/dist/recordsKey-B7QrxdeU.cjs +1 -0
  134. package/dist/recordsKey-D5-wC0Aw.js +141 -0
  135. package/dist/registrationFields-CLeR2lQJ.js +181 -0
  136. package/dist/registrationFields-v4pOoRdn.cjs +1 -0
  137. package/dist/renderer.cjs.js +1 -1
  138. package/dist/renderer.es.js +1 -1
  139. package/dist/roles-D6VaHWfV.js +147 -0
  140. package/dist/roles-DQUFFBQe.cjs +1 -0
  141. package/dist/scheduleData-ATN8w5hI.js +727 -0
  142. package/dist/scheduleData-Cltj0ABZ.cjs +1 -0
  143. package/dist/server.cjs.js +6 -6
  144. package/dist/server.es.js +716 -715
  145. package/dist/serviceStatus-TQyZO_Y_.cjs +1 -0
  146. package/dist/serviceStatus-vS8AI7SZ.js +125 -0
  147. package/dist/tabAudience-BqpN6dsR.cjs +1 -0
  148. package/dist/tabAudience-CRyMvv0v.js +34 -0
  149. package/dist/transactions-BqMQDRx3.js +343 -0
  150. package/dist/transactions-CufFrdAM.cjs +1 -0
  151. package/dist/useIsPhone-BVGx_X3e.js +13 -0
  152. package/dist/useIsPhone-o63tNneA.cjs +1 -0
  153. package/dist/{validate-DzSJWuyL.js → validate-CmC_tLK-.js} +433 -351
  154. package/dist/validate-DZMwqSrb.cjs +103 -0
  155. package/dist/vite/validate.d.ts +14 -0
  156. package/dist/vite.cjs.js +1 -1
  157. package/dist/vite.es.js +1 -1
  158. package/dist/your-ai-workflow-firebase-os.cjs.js +15 -1431
  159. package/dist/your-ai-workflow-firebase-os.css +1 -1
  160. package/dist/your-ai-workflow-firebase-os.es.js +8200 -32421
  161. package/package.json +1 -1
  162. package/src/index.css +122 -2
  163. package/dist/ContactPopup-IwBm-eqz.cjs +0 -12
  164. package/dist/PhoneInputField-CVamkTJg.js +0 -2
  165. package/dist/aiModels-BIhoTNH0.cjs +0 -1
  166. package/dist/validate-e48WXJdP.cjs +0 -103
  167. /package/dist/{address-DI1YaCI4.cjs → address-Bsb8COq2.cjs} +0 -0
  168. /package/dist/{address-Ca1h_UZX.js → address-C2bHNxJU.js} +0 -0
  169. /package/dist/{dist-BkUiTtIb.js → dist-DUPvBnOA.js} +0 -0
  170. /package/dist/{dist-BLGlDv1e.cjs → dist-E4jTFPs7.cjs} +0 -0
  171. /package/dist/{lucide-react-BYniZ3lQ.cjs → lucide-react-BwV6L6Is.cjs} +0 -0
  172. /package/dist/{lucide-react-ehRy1vqS.js → lucide-react-CA7GD7Nv.js} +0 -0
  173. /package/dist/{mediaKind-dk396a03.cjs → mediaKind-D0MWyv6b.cjs} +0 -0
  174. /package/dist/{mediaKind-De2Cx_kB.js → mediaKind-DmKMsjeY.js} +0 -0
  175. /package/dist/{pdf-u73U7-6s.js → pdf-DRXcPGkr.js} +0 -0
  176. /package/dist/{pdf-B24jYmSf.cjs → pdf-jLjjhvjp.cjs} +0 -0
  177. /package/dist/{pdf.worker.min-BPOWx2_9.js → pdf.worker.min-CfKZezeM.js} +0 -0
  178. /package/dist/{pdf.worker.min-BvhEiZFe.cjs → pdf.worker.min-bLgNWd7w.cjs} +0 -0
  179. /package/dist/{verifiedAccount-C1iCxopN.js → verifiedAccount-DRbRFJ6H.js} +0 -0
  180. /package/dist/{verifiedAccount-D3OeaOBo.cjs → verifiedAccount-DScyKk96.cjs} +0 -0
@@ -0,0 +1,886 @@
1
+ import { d as e, f as t } from "./PageTitle-D93YCiN8.js";
2
+ import { Na as n, cr as r, di as i, dr as a, ka as o, pi as s, sr as c } from "./TimeZoneField-DkI1Bkcz.js";
3
+ import { A as l, E as u, F as d, I as f, N as p, O as m, c as h, w as ee, y as g } from "./verifiedAccount-DRbRFJ6H.js";
4
+ import { Ct as te, I as ne, Nt as re, R as _, Tt as v, V as y, Wt as ie, et as ae, h as oe, kt as se, lt as ce, pn as b, qt as le, t as ue, tt as x } from "./lucide-react-CA7GD7Nv.js";
5
+ import { v as de } from "./scheduleData-ATN8w5hI.js";
6
+ import { c as fe, n as S, o as pe, r as C, t as w } from "./tabAudience-CRyMvv0v.js";
7
+ import { createContext as me, useContext as he, useEffect as T, useLayoutEffect as ge, useMemo as _e, useRef as E, useState as D } from "react";
8
+ import { Fragment as ve, jsx as O, jsxs as k } from "react/jsx-runtime";
9
+ import { collection as A, deleteDoc as ye, doc as j, getDoc as be, getDocs as xe, onSnapshot as M, setDoc as N } from "firebase/firestore";
10
+ import { Link as Se, useLocation as Ce } from "react-router-dom";
11
+ //#region src/lib/ThemeContext.tsx
12
+ var we = typeof window < "u" ? ge : T, Te = me(void 0), Ee = "'Inter', system-ui, sans-serif", De = (e) => e.trim().replace(/\s+/g, "+");
13
+ function Oe(e, t) {
14
+ let n = [["--display-family", String(t?.display || "").trim()], ["--body-family", String(t?.body || "").trim()]];
15
+ for (let [t, r] of n) {
16
+ if (!r) {
17
+ e.style.removeProperty(t);
18
+ continue;
19
+ }
20
+ let n = `theme-font-${De(r).toLowerCase().replace(/[^a-z0-9+]/g, "")}`;
21
+ if (typeof document < "u" && !document.getElementById(n)) {
22
+ let e = document.createElement("link");
23
+ e.id = n, e.rel = "stylesheet", e.href = `https://fonts.googleapis.com/css2?family=${De(r)}:wght@300;400;500;600;700;800&display=swap`, document.head.appendChild(e);
24
+ }
25
+ e.style.setProperty(t, `'${r.replace(/'/g, "")}', ${Ee}`);
26
+ }
27
+ }
28
+ var ke = (e) => {
29
+ let t = e?.defaultTheme;
30
+ return t !== "light" && t !== "dark" || e?.showThemeToggle ? null : t;
31
+ }, P = {
32
+ get(e) {
33
+ try {
34
+ return localStorage.getItem(e);
35
+ } catch {
36
+ return null;
37
+ }
38
+ },
39
+ set(e, t) {
40
+ try {
41
+ localStorage.setItem(e, t);
42
+ } catch {}
43
+ },
44
+ drop(e) {
45
+ try {
46
+ localStorage.removeItem(e);
47
+ } catch {}
48
+ }
49
+ };
50
+ function Ae({ children: r, scopeSelector: i }) {
51
+ let a = n(), o = _e(() => a?.themeConfig || t, [a?.themeConfig]), s = ke(o), c = !!o.showThemeToggle;
52
+ T(() => {
53
+ try {
54
+ localStorage.removeItem("theme_config_cache"), localStorage.removeItem("theme_saved_cache");
55
+ } catch {}
56
+ console.info(`Your AI Firebase ${e} · colours from theme.config.ts`);
57
+ }, []);
58
+ let [l, u] = D(() => {
59
+ if (s) return s;
60
+ if (typeof window > "u") return o.defaultTheme || "system";
61
+ let e = P.get("theme-mode"), t = P.get("last-seen-default-theme");
62
+ return o.defaultTheme && o.defaultTheme !== t ? (P.set("last-seen-default-theme", o.defaultTheme), P.drop("theme-mode"), o.defaultTheme) : e || o.defaultTheme || "system";
63
+ }), [d, f] = D(() => {
64
+ if (s) return s;
65
+ if (typeof window > "u") return o.defaultTheme === "light" ? "light" : "dark";
66
+ let e = P.get("theme-mode"), t = P.get("last-seen-default-theme"), n = e || o.defaultTheme || "system";
67
+ return o.defaultTheme && o.defaultTheme !== t && (n = o.defaultTheme), n === "system" ? window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark" : n;
68
+ });
69
+ return T(() => {
70
+ let e = o.defaultTheme;
71
+ e && (s && u(s), e !== P.get("last-seen-default-theme") && (P.set("last-seen-default-theme", e), P.drop("theme-mode"), u(e)));
72
+ }, [o.defaultTheme, s]), T(() => {
73
+ let e = (e) => {
74
+ l === "system" && f(e.matches ? "light" : "dark");
75
+ }, t = window.matchMedia("(prefers-color-scheme: light)");
76
+ return l === "system" ? (f(t.matches ? "light" : "dark"), t.addEventListener("change", e)) : f(l), () => t.removeEventListener("change", e);
77
+ }, [l]), we(() => {
78
+ let e = (i ? document.querySelector(i) : document.documentElement) || document.documentElement, t = d === "dark" ? o.colors.dark : o.colors.light;
79
+ e.style.setProperty("--bg-color", t.background), e.style.setProperty("--bg-secondary-color", t.backgroundSecondary || t.background), e.style.setProperty("--fg-color", t.foreground), e.style.setProperty("--accent-color", t.accent);
80
+ let n = d === "dark";
81
+ e.style.setProperty("--panel-bg", t.panelBg || `color-mix(in srgb, ${t.accent} ${n ? "5%" : "4%"}, transparent)`), e.style.setProperty("--panel-border", t.panelBorder || `color-mix(in srgb, ${t.accent} 15%, transparent)`);
82
+ let r = (e, t, n) => {
83
+ if (!e || e.length === 0) return t || "transparent";
84
+ if (e.length === 1) return e[0];
85
+ let r = e.map((t, n) => `${t} ${Math.round(n / (e.length - 1) * 100)}%`).join(", ");
86
+ return n === "conic" ? `conic-gradient(from 180deg at 50% 100%, ${r})` : `linear-gradient(135deg, ${r})`;
87
+ }, a = `linear-gradient(135deg, color-mix(in oklab, ${t.accent} ${n ? "70%" : "78%"}, black) 0%, ${t.accent} 100%)`, s = `linear-gradient(135deg, color-mix(in oklab, ${t.accent} ${n ? "80%" : "85%"}, black) 0%, color-mix(in oklab, ${t.accent} 72%, white) 100%)`;
88
+ e.style.setProperty("--button-bg", r(t.buttonGradient, a, t.buttonGradientShape)), e.style.setProperty("--button-fg", t.buttonText || "#ffffff"), e.style.setProperty("--button-hover-bg", r(t.buttonHoverGradient || t.buttonGradient, s, t.buttonGradientShape)), e.style.setProperty("--text-gradient", r(t.textGradient, `linear-gradient(135deg, ${t.foreground} 0%, ${t.accent} 100%)`)), e.style.setProperty("--glow-color", t.glowColor || `color-mix(in srgb, ${t.accent} ${n ? "40%" : "30%"}, transparent)`), e.style.setProperty("--notification-icon-color", t.notificationIconColor || t.accent);
89
+ let c = t.secondaryButton?.bg || (d === "dark" ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.03)"), u = t.secondaryButton?.border || (d === "dark" ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.06)"), f = t.secondaryButton?.text || t.foreground;
90
+ if (e.style.setProperty("--btn-sec-bg", c), e.style.setProperty("--btn-sec-border", u), e.style.setProperty("--btn-sec-text", f), e.style.setProperty("--selection-bg", t.selectionBg || "color-mix(in srgb, var(--accent-color) 40%, transparent)"), e.style.setProperty("--selection-text", t.selectionText || "#ffffff"), e.setAttribute("data-theme", d), P.set("theme-mode", l), o.cornerRounding === "custom" && o.cornerRadii ? (e.style.setProperty("--btn-radius", `${parseFloat(String(o.cornerRadii.buttonRadius)) || 0}rem`), e.style.setProperty("--card-radius", `${parseFloat(String(o.cornerRadii.cardRadius)) || 0}rem`), e.style.setProperty("--input-radius", `${parseFloat(String(o.cornerRadii.inputRadius)) || 0}rem`), e.style.setProperty("--modal-radius", `${parseFloat(String(o.cornerRadii.modalRadius)) || 0}rem`)) : (e.style.setProperty("--btn-radius", "0.75rem"), e.style.setProperty("--card-radius", "1.5rem"), e.style.setProperty("--input-radius", "0.75rem"), e.style.setProperty("--modal-radius", "1.5rem")), !document.getElementById("inter-font")) {
91
+ let e = document.createElement("link");
92
+ e.id = "inter-font", e.rel = "stylesheet", e.href = "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap", document.head.appendChild(e);
93
+ }
94
+ Oe(e, o.fonts), e.style.fontSize = "16px", e.style.setProperty("--weight-h1", "800"), e.style.setProperty("--weight-h2", "700"), e.style.setProperty("--weight-h3", "700"), e.style.setProperty("--leading-normal", "1.5");
95
+ let p = document.querySelector("link[rel*='icon']");
96
+ p || (p = document.createElement("link"), p.rel = "icon", document.head.appendChild(p)), o.faviconUrl && (p.href = o.faviconUrl), o.appName && (document.title = o.appName);
97
+ }, [
98
+ d,
99
+ l,
100
+ o
101
+ ]), /* @__PURE__ */ O(Te.Provider, {
102
+ value: {
103
+ theme: d,
104
+ setTheme: (e) => {
105
+ s || u(e);
106
+ },
107
+ toggleTheme: () => {
108
+ s || u(d === "light" ? "dark" : "light");
109
+ },
110
+ isSystem: l === "system",
111
+ setIsSystem: (e) => {
112
+ s || u(e ? "system" : d);
113
+ },
114
+ config: o,
115
+ activeConfig: o,
116
+ canSwitchTheme: c
117
+ },
118
+ children: r
119
+ });
120
+ }
121
+ var je = () => {
122
+ let e = he(Te);
123
+ if (!e) throw Error("useTheme must be used within ThemeProvider");
124
+ return e;
125
+ };
126
+ //#endregion
127
+ //#region src/lib/pageRegistry.ts
128
+ function Me() {
129
+ return (typeof window < "u" ? window.__FBOS_PAGES__ : null) || {};
130
+ }
131
+ function Ne(e = Me()) {
132
+ let t = /* @__PURE__ */ new Set(), n = [];
133
+ for (let [r, i] of Object.entries(e)) !i || t.has(i) || (t.add(i), n.push([r, i]));
134
+ return n;
135
+ }
136
+ //#endregion
137
+ //#region src/lib/menuVisibility.ts
138
+ var F = (e) => e?.inMenu === !1, Pe = (e, t, n) => {
139
+ let r = e.find((e) => e.id === t);
140
+ return r ? r.hidden === !0 : F(n);
141
+ }, Fe = (e) => e.split("-").map((e) => e ? e.charAt(0).toUpperCase() + e.slice(1) : "").join(""), I = (e) => {
142
+ let t = String(e ?? "").trim();
143
+ if (!t) return null;
144
+ let n = ue;
145
+ return n[Fe(t)] || n[t] || null;
146
+ }, L = "sys_groups", Ie = "fbos_groups", Le = (e, t) => ({
147
+ id: e,
148
+ name: String(t?.name || e),
149
+ roles: h(t?.roles),
150
+ ...typeof t?.createdAt == "number" ? { createdAt: t.createdAt } : {}
151
+ }), Re = (e, t) => e.name.localeCompare(t.name), ze = () => {
152
+ try {
153
+ let e = localStorage.getItem(Ie), t = e ? JSON.parse(e) : null;
154
+ return Array.isArray(t) ? t.filter((e) => g(e?.id)).map((e) => Le(e.id, e)) : null;
155
+ } catch {
156
+ return null;
157
+ }
158
+ }, R = null, z = null, B = null, V = (e) => {
159
+ R = e, z?.forEach((t) => t(e));
160
+ };
161
+ function Be(e) {
162
+ let t = !z;
163
+ return z ||= /* @__PURE__ */ new Set(), z.add(e), t ? B = M(A(o, L), (e) => {
164
+ let t = [];
165
+ e.forEach((e) => {
166
+ g(e.id) && t.push(Le(e.id, e.data()));
167
+ }), t.sort(Re);
168
+ try {
169
+ localStorage.setItem(Ie, JSON.stringify(t));
170
+ } catch {}
171
+ V({
172
+ groups: t,
173
+ live: !0
174
+ });
175
+ }, () => V({
176
+ groups: R?.groups ?? ze() ?? [],
177
+ live: !0
178
+ })) : R?.live && e(R), () => {
179
+ z?.delete(e), !z?.size && (B?.(), B = null, z = null);
180
+ };
181
+ }
182
+ function H() {
183
+ let [e, t] = D(() => {
184
+ if (R) return R;
185
+ let e = ze();
186
+ return e ? {
187
+ groups: e,
188
+ live: !1
189
+ } : null;
190
+ });
191
+ return T(() => Be(t), []), {
192
+ groups: e?.groups ?? [],
193
+ loaded: !!e,
194
+ live: !!e?.live
195
+ };
196
+ }
197
+ function Ve(e, t, n = "") {
198
+ let r = String(e || "").trim();
199
+ if (!r) return "Type a name for the group first — Sales, say, or North branch.";
200
+ if (!g(m(r))) return "Use a name with at least two letters in it.";
201
+ let i = t.find((e) => e.id !== n && (e.name.trim().toLowerCase() === r.toLowerCase() || !n && e.id === m(r)));
202
+ return i ? `You already have a group called ${i.name}.` : "";
203
+ }
204
+ async function He(e) {
205
+ let t = String(e || "").trim().slice(0, 48), n = {
206
+ id: m(t),
207
+ name: t,
208
+ roles: [],
209
+ createdAt: Date.now()
210
+ };
211
+ return await N(j(o, L, n.id), {
212
+ name: n.name,
213
+ roles: [],
214
+ createdAt: n.createdAt
215
+ }), n;
216
+ }
217
+ async function Ue(e, t) {
218
+ let n = String(t || "").trim().slice(0, 48);
219
+ !n || !g(e) || await N(j(o, L, e), { name: n }, { merge: !0 });
220
+ }
221
+ async function We(e, t) {
222
+ if (!g(e)) return;
223
+ let n = h(t), r = R;
224
+ R && V({
225
+ ...R,
226
+ groups: R.groups.map((t) => t.id === e ? {
227
+ ...t,
228
+ roles: n
229
+ } : t)
230
+ });
231
+ try {
232
+ await N(j(o, L, e), { roles: n }, { merge: !0 });
233
+ } catch (e) {
234
+ throw r && V(r), e;
235
+ }
236
+ }
237
+ async function Ge(e) {
238
+ let t = [];
239
+ return g(e) && (await xe(A(o, "sys_tabs"))).forEach((n) => {
240
+ ee(n.data()) === e && t.push(n.id);
241
+ }), t;
242
+ }
243
+ async function Ke(e) {
244
+ if (g(e)) {
245
+ for (let t of await Ge(e)) await N(j(o, "sys_tabs", t), { group: "" }, { merge: !0 });
246
+ await ye(j(o, L, e));
247
+ }
248
+ }
249
+ async function qe(e) {
250
+ let t = await xe(A(o, L));
251
+ for (let n of t.docs) {
252
+ let t = h(n.data()?.roles);
253
+ t.includes(e) && await N(j(o, L, n.id), { roles: t.filter((t) => t !== e) }, { merge: !0 });
254
+ }
255
+ }
256
+ //#endregion
257
+ //#region src/lib/tabIcons.ts
258
+ var U = {
259
+ collection: "sys_configs",
260
+ doc: "tab_icons"
261
+ }, Je = "fbos_tab_icons", Ye = (e) => {
262
+ let t = {};
263
+ if (e && typeof e == "object") for (let [n, r] of Object.entries(e)) {
264
+ let e = typeof r == "string" ? r.trim() : "";
265
+ e && (t[n] = e);
266
+ }
267
+ return t;
268
+ }, Xe = () => {
269
+ try {
270
+ let e = localStorage.getItem(Je);
271
+ return e ? Ye(JSON.parse(e)) : null;
272
+ } catch {
273
+ return null;
274
+ }
275
+ }, W = null, G = null, Ze = null, K = (e) => {
276
+ W = e, G?.forEach((t) => t(e));
277
+ };
278
+ function Qe(e) {
279
+ let t = !G;
280
+ return G ||= /* @__PURE__ */ new Set(), G.add(e), t ? Ze = M(j(o, U.collection, U.doc), (e) => {
281
+ let t = Ye(e.exists() ? e.data() : {});
282
+ try {
283
+ localStorage.setItem(Je, JSON.stringify(t));
284
+ } catch {}
285
+ K(t);
286
+ }, () => K(W ?? Xe() ?? {})) : W && e(W), () => {
287
+ G?.delete(e), !G?.size && (Ze?.(), Ze = null, G = null);
288
+ };
289
+ }
290
+ function $e() {
291
+ let [e, t] = D(() => W ?? Xe() ?? {});
292
+ return T(() => Qe(t), []), e;
293
+ }
294
+ async function et(e, t) {
295
+ let n = String(t || "").trim(), r = W, i = { ...W ?? Xe() ?? {} };
296
+ n ? i[e] = n : delete i[e], K(i);
297
+ try {
298
+ await N(j(o, U.collection, U.doc), { [e]: n }, { merge: !0 });
299
+ } catch (e) {
300
+ throw r && K(r), e;
301
+ }
302
+ }
303
+ //#endregion
304
+ //#region src/configs/pages/tabOrders.config.ts
305
+ var tt = {
306
+ drive: "assets",
307
+ submissions: "inbox",
308
+ requests: "inbox"
309
+ }, nt = new Set(["setup"]), rt = (e) => {
310
+ let t = (e || []).map((e) => typeof e == "string" ? {
311
+ id: e,
312
+ hidden: !1
313
+ } : {
314
+ id: String(e.id),
315
+ hidden: !!e.hidden
316
+ }).map((e) => ({
317
+ ...e,
318
+ id: tt[e.id] || e.id
319
+ })).filter((e) => !nt.has(e.id));
320
+ return t.filter((e, n) => t.findIndex((t) => t.id === e.id) === n);
321
+ }, it = [
322
+ {
323
+ id: "inbox",
324
+ hidden: !1
325
+ },
326
+ {
327
+ id: "users",
328
+ hidden: !1
329
+ },
330
+ {
331
+ id: "signin",
332
+ hidden: !1
333
+ },
334
+ {
335
+ id: "pages",
336
+ hidden: !1
337
+ },
338
+ {
339
+ id: "mybookings",
340
+ hidden: !1
341
+ },
342
+ {
343
+ id: "billing",
344
+ hidden: !1
345
+ },
346
+ {
347
+ id: "payments",
348
+ hidden: !1
349
+ },
350
+ {
351
+ id: "transactions",
352
+ hidden: !1
353
+ },
354
+ {
355
+ id: "email",
356
+ hidden: !1
357
+ },
358
+ {
359
+ id: "schedule",
360
+ hidden: !1
361
+ },
362
+ {
363
+ id: "forms",
364
+ hidden: !1
365
+ },
366
+ {
367
+ id: "theme",
368
+ hidden: !1
369
+ },
370
+ {
371
+ id: "assets",
372
+ hidden: !1
373
+ },
374
+ {
375
+ id: "publish",
376
+ hidden: !1
377
+ }
378
+ ], at = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i, q = (e) => {
379
+ let t = String(e ?? "").trim();
380
+ return at.test(t) ? t : "";
381
+ };
382
+ function ot(e, t) {
383
+ let n = String(e ?? "").trim();
384
+ if (!n || /^data:/i.test(n)) return "";
385
+ try {
386
+ let e = new URL(n, t || void 0);
387
+ return /^https?:$/.test(e.protocol) ? e.href : "";
388
+ } catch {
389
+ return "";
390
+ }
391
+ }
392
+ function st(e, t) {
393
+ let n = e?.colors?.light || {}, r = Array.isArray(n.buttonGradient) ? n.buttonGradient.map(q).filter(Boolean).slice(0, 2) : [];
394
+ return {
395
+ appName: String(e?.appName || "").replace(/\s+/g, " ").trim().slice(0, 60),
396
+ logoUrl: ot(e?.logoUrl, t),
397
+ appUrl: ot(t, ""),
398
+ accent: q(n.accent),
399
+ foreground: q(n.foreground),
400
+ buttonText: q(n.buttonText),
401
+ buttonGradient: r,
402
+ panelBg: q(n.panelBg),
403
+ panelBorder: q(n.panelBorder)
404
+ };
405
+ }
406
+ function ct(e) {
407
+ return {
408
+ appName: String(e?.appName || ""),
409
+ logoUrl: String(e?.logoUrl || ""),
410
+ appUrl: String(e?.appUrl || ""),
411
+ accent: String(e?.accent || ""),
412
+ foreground: String(e?.foreground || ""),
413
+ buttonText: String(e?.buttonText || ""),
414
+ buttonGradient: Array.isArray(e?.buttonGradient) ? e.buttonGradient.map(String) : [],
415
+ panelBg: String(e?.panelBg || ""),
416
+ panelBorder: String(e?.panelBorder || "")
417
+ };
418
+ }
419
+ var lt = "", ut = (e) => /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/i.test(e);
420
+ function dt() {
421
+ let e = null;
422
+ try {
423
+ e = je().activeConfig;
424
+ } catch {
425
+ e = null;
426
+ }
427
+ let t = !!a()?.isAdmin, n = typeof window < "u" ? window.location.origin : "", r = e && t ? JSON.stringify(st(e, n)) : "";
428
+ T(() => {
429
+ if (!r || !o || r === lt) return;
430
+ let e = !1;
431
+ return (async () => {
432
+ try {
433
+ let t = j(o, "sys_configs", "emailBrand"), i = await be(t);
434
+ if (e) return;
435
+ let a = i.exists() ? ct(i.data()) : null, s = JSON.parse(r);
436
+ ut(n) && a?.appUrl && (s.appUrl = a.appUrl), (!a || JSON.stringify(a) !== JSON.stringify(s)) && await N(t, s), lt = r;
437
+ } catch {}
438
+ })(), () => {
439
+ e = !0;
440
+ };
441
+ }, [r]);
442
+ }
443
+ //#endregion
444
+ //#region src/components/navOverflow.ts
445
+ function ft(e, t, n, r) {
446
+ let i = 0, a = !0;
447
+ for (let r = 0; r < e.length; r++) if (i += e[r] + (r > 0 ? n : 0), i > t) {
448
+ a = !1;
449
+ break;
450
+ }
451
+ if (a) return e.length;
452
+ let o = 0, s = 0;
453
+ for (let i = 0; i < e.length; i++) {
454
+ let a = o + e[i] + (i > 0 ? n : 0);
455
+ if (a + r > t) break;
456
+ o = a, s++;
457
+ }
458
+ return Math.max(s, 1);
459
+ }
460
+ function pt({ count: e, listKey: t, shown: n, gap: r, moreButtonWidth: i }) {
461
+ let a = E(null), o = E(null), [s, c] = D(null);
462
+ return ge(() => {
463
+ if (!n) return;
464
+ let s = !0, l = 0, u = () => {
465
+ let n = a.current, l = o.current;
466
+ if (!s || !n || !l) return;
467
+ let u = window.getComputedStyle(n), d = n.clientWidth - (parseFloat(u.paddingLeft) || 0) - (parseFloat(u.paddingRight) || 0);
468
+ if (d <= 0) return;
469
+ let f = l.querySelectorAll("[data-measure]");
470
+ if (f.length !== e) return;
471
+ let p = parseFloat(u.columnGap);
472
+ c({
473
+ listKey: t,
474
+ count: ft(Array.from(f, (e) => e.offsetWidth), d, Number.isFinite(p) ? p : r, i)
475
+ });
476
+ }, d = () => {
477
+ cancelAnimationFrame(l), l = requestAnimationFrame(u);
478
+ };
479
+ u(), document.fonts?.ready.then(d).catch(() => {});
480
+ let f = typeof ResizeObserver > "u" ? null : new ResizeObserver(d);
481
+ return f && a.current && f.observe(a.current), () => {
482
+ s = !1, cancelAnimationFrame(l), f?.disconnect();
483
+ };
484
+ }, [
485
+ e,
486
+ t,
487
+ n,
488
+ r,
489
+ i
490
+ ]), {
491
+ rowRef: a,
492
+ measureRef: o,
493
+ visible: s && s.listKey === t ? Math.min(s.count, e) : e
494
+ };
495
+ }
496
+ //#endregion
497
+ //#region src/lib/tabAccess.ts
498
+ var mt = "fbos_tab_access", ht = () => {
499
+ try {
500
+ let e = localStorage.getItem(mt), t = e ? JSON.parse(e) : null;
501
+ return t && typeof t == "object" ? t : null;
502
+ } catch {
503
+ return null;
504
+ }
505
+ }, J = null, Y = null, gt = null, X = (e) => {
506
+ J = e, Y?.forEach((t) => t(e));
507
+ };
508
+ function _t(e) {
509
+ let t = !Y;
510
+ return Y ||= /* @__PURE__ */ new Set(), Y.add(e), t ? gt = M(j(o, w.collection, w.doc), (e) => {
511
+ let t = e.exists() ? e.data() : {};
512
+ try {
513
+ localStorage.setItem(mt, JSON.stringify(t));
514
+ } catch {}
515
+ X({
516
+ access: t,
517
+ live: !0
518
+ });
519
+ }, () => X({
520
+ access: J?.access ?? ht() ?? {},
521
+ live: !0
522
+ })) : J?.live && e(J), () => {
523
+ Y?.delete(e), !Y?.size && (gt?.(), gt = null, Y = null);
524
+ };
525
+ }
526
+ function vt() {
527
+ let [e, t] = D(() => {
528
+ if (J) return J;
529
+ let e = ht();
530
+ return e ? {
531
+ access: e,
532
+ live: !1
533
+ } : null;
534
+ });
535
+ return T(() => _t(t), []), {
536
+ access: e?.access ?? {},
537
+ loaded: !!e,
538
+ live: !!e?.live
539
+ };
540
+ }
541
+ function yt(e) {
542
+ let { access: t, loaded: n, live: r } = vt();
543
+ return {
544
+ audience: pe(t, e),
545
+ loaded: n,
546
+ live: r
547
+ };
548
+ }
549
+ async function bt(e, t) {
550
+ let n = J, r = S(t);
551
+ X({
552
+ access: {
553
+ ...J?.access ?? ht() ?? {},
554
+ [e]: r
555
+ },
556
+ live: J?.live ?? !1
557
+ });
558
+ try {
559
+ await N(j(o, w.collection, w.doc), { [e]: r }, { merge: !0 });
560
+ } catch (e) {
561
+ throw n && X(n), e;
562
+ }
563
+ }
564
+ //#endregion
565
+ //#region src/components/DashboardNav.tsx
566
+ var Z = l("admin"), Q = {
567
+ inbox: {
568
+ path: "/inbox",
569
+ label: "Inbox",
570
+ icon: v,
571
+ roles: Z
572
+ },
573
+ users: {
574
+ path: "/users",
575
+ label: "Users",
576
+ icon: oe,
577
+ roles: Z
578
+ },
579
+ signin: {
580
+ path: "/sign-in",
581
+ label: "Sign in",
582
+ icon: re,
583
+ roles: Z
584
+ },
585
+ pages: {
586
+ path: "/pages",
587
+ label: "Pages",
588
+ icon: te,
589
+ roles: Z
590
+ },
591
+ mybookings: {
592
+ path: "/my-bookings",
593
+ label: "My bookings",
594
+ icon: b,
595
+ roles: l("user")
596
+ },
597
+ billing: {
598
+ path: "/billing",
599
+ label: "Billing",
600
+ icon: x,
601
+ roles: l("user")
602
+ },
603
+ payments: {
604
+ path: "/payments",
605
+ label: "Payments",
606
+ icon: le,
607
+ roles: Z
608
+ },
609
+ transactions: {
610
+ path: "/transactions",
611
+ label: "Transactions",
612
+ icon: x,
613
+ roles: Z
614
+ },
615
+ email: {
616
+ path: "/email",
617
+ label: "Email",
618
+ icon: ce,
619
+ roles: Z
620
+ },
621
+ schedule: {
622
+ path: "/schedule",
623
+ label: "Schedule",
624
+ icon: ne,
625
+ roles: l("internal")
626
+ },
627
+ forms: {
628
+ path: "/forms",
629
+ label: "Forms",
630
+ icon: y,
631
+ roles: Z
632
+ },
633
+ theme: {
634
+ path: "/theme",
635
+ label: "Theme",
636
+ icon: ae,
637
+ roles: Z
638
+ },
639
+ assets: {
640
+ path: "/assets",
641
+ label: "Assets",
642
+ icon: se,
643
+ roles: Z
644
+ },
645
+ publish: {
646
+ path: "/publish",
647
+ label: "Publish App",
648
+ icon: _,
649
+ roles: Z
650
+ }
651
+ }, xt = (e) => {
652
+ let t = (e) => e.id in Q;
653
+ return [...e.filter((e) => !t(e)), ...e.filter(t)];
654
+ };
655
+ function $(e) {
656
+ try {
657
+ let t = localStorage.getItem(e);
658
+ return t ? JSON.parse(t) : null;
659
+ } catch {
660
+ return null;
661
+ }
662
+ }
663
+ function St() {
664
+ let [e, t] = D(() => $("fbos_nav_tabs") ?? {}), [n, r] = D(() => {
665
+ let e = $("fbos_nav_order");
666
+ return Array.isArray(e) ? rt(e) : it;
667
+ }), [i, a] = D(() => $("fbos_nav_tabs") !== null), [s, c] = D(() => $("fbos_nav_order") !== null);
668
+ return T(() => {
669
+ let e = M(A(o, "sys_tabs"), (e) => {
670
+ let n = {};
671
+ e.forEach((e) => {
672
+ n[e.id] = e.data();
673
+ }), t(n), a(!0);
674
+ try {
675
+ localStorage.setItem("fbos_nav_tabs", JSON.stringify(n));
676
+ } catch {}
677
+ }, () => {
678
+ a(!0);
679
+ }), n = M(j(o, "sys_configs", "tab_order"), (e) => {
680
+ let t = e.exists() && Array.isArray(e.data().order) ? rt(e.data().order) : it;
681
+ r(t), c(!0);
682
+ try {
683
+ localStorage.setItem("fbos_nav_order", JSON.stringify(t));
684
+ } catch {}
685
+ }, () => {
686
+ c(!0);
687
+ }), i = setTimeout(() => {
688
+ a(!0), c(!0);
689
+ }, 3e3);
690
+ return () => {
691
+ e(), n(), clearTimeout(i);
692
+ };
693
+ }, []), {
694
+ tabOverrides: e,
695
+ tabOrder: n,
696
+ loaded: i && s
697
+ };
698
+ }
699
+ function Ct({ tabOverrides: e, tabOrder: t, hasBooking: n = !1, hasBought: r = !1, paymentsOn: i = !1, tabIcons: a = {}, tabAccess: o }) {
700
+ let s = {};
701
+ Object.entries(Q).forEach(([e, t]) => {
702
+ e === "mybookings" && !n || e === "billing" && !r || e === "transactions" && !i || (s[e] = {
703
+ id: e,
704
+ ...t,
705
+ icon: I(a[e]) ?? t.icon
706
+ }, C(e) && (s[e].roles = fe(pe(o, e))));
707
+ });
708
+ let c = { ...e };
709
+ for (let [t, n] of Ne()) n.isPublic || (c[t] = {
710
+ ...n.config,
711
+ ...e[t]
712
+ });
713
+ for (let [t, n] of Object.entries(e)) {
714
+ let r = String(n?.fileId || "");
715
+ r && r !== t && !e[r] && (F(c[r]) && c[t]?.inMenu === void 0 && (c[t] = {
716
+ ...c[t],
717
+ inMenu: !1
718
+ }), delete c[r]);
719
+ }
720
+ Object.entries(c).forEach(([e, t]) => {
721
+ let n = s[e], r = I(t?.iconName) ?? n?.icon ?? te, i = n?.roles ?? Z;
722
+ t?.pageType && !Q[e] && (i = d(t));
723
+ let a = t?.route ? t.route.startsWith("/") ? t.route : "/" + t.route : n?.path ?? "/" + e, o = t?.tabName || t?.pageTitle || t?.pageName || n?.label || e, c = Q[e] ? "" : ee(t);
724
+ s[e] = {
725
+ id: e,
726
+ path: a,
727
+ label: o,
728
+ icon: r,
729
+ roles: i,
730
+ group: c
731
+ };
732
+ });
733
+ let l = [], u = /* @__PURE__ */ new Set();
734
+ t.forEach((e) => {
735
+ e.hidden || u.has(e.id) || s[e.id] && (l.push(s[e.id]), u.add(e.id));
736
+ });
737
+ let f = [], p = [];
738
+ return Object.keys(s).forEach((e) => {
739
+ if (u.has(e)) return;
740
+ let n = t.find((t) => t.id === e);
741
+ n?.hidden || !n && F(c[e]) || (e in c && !n ? f.push(s[e]) : p.push(s[e]));
742
+ }), f.length > 0 && l.unshift(...f), p.length > 0 && l.push(...p), xt(l);
743
+ }
744
+ function wt(e, t, n, r) {
745
+ return p(e.roles, f(t, n)) ? e.group ? !r.live && !r.groups.some((t) => t.id === e.group) ? !1 : u(t, { group: e.group }, r.groups) : !0 : !1;
746
+ }
747
+ function Tt() {
748
+ let { user: e, userRole: t } = a(), { tabOverrides: n, tabOrder: r, loaded: i } = St(), o = H();
749
+ return i ? Ct({
750
+ tabOverrides: n,
751
+ tabOrder: r
752
+ }).filter((e) => !(e.id in Q)).filter((n) => wt(n, t, !!e, o)) : [];
753
+ }
754
+ function Et({ customTabs: e = [] }) {
755
+ let { pathname: t } = Ce(), { user: n, userRole: o, roleResolved: l } = a();
756
+ dt();
757
+ let u = de("", n?.email || "").bookings.length > 0, d = s(), [f] = D(() => $("fbos_nav_payments") === !0), p = d.loading ? f : d.configured;
758
+ T(() => {
759
+ if (!d.loading) try {
760
+ localStorage.setItem("fbos_nav_payments", JSON.stringify(d.configured));
761
+ } catch {}
762
+ }, [d.loading, d.configured]);
763
+ let m = n?.uid || "", h = i(m), [ee] = D(() => {
764
+ let e = $("fbos_nav_billing");
765
+ return !!m && e?.uid === m && e?.bought === !0;
766
+ }), g = h.loading ? ee : h.bought;
767
+ T(() => {
768
+ if (!(h.loading || !m)) try {
769
+ localStorage.setItem("fbos_nav_billing", JSON.stringify({
770
+ uid: m,
771
+ bought: h.bought
772
+ }));
773
+ } catch {}
774
+ }, [
775
+ h.loading,
776
+ h.bought,
777
+ m
778
+ ]);
779
+ let te = vt(), ne = $e(), re = H(), [_, v] = D(!1), y = E(null), { tabOverrides: ae, tabOrder: oe, loaded: se } = St(), ce = l !== !1 && se;
780
+ T(() => {
781
+ function e(e) {
782
+ y.current && !y.current.contains(e.target) && v(!1);
783
+ }
784
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
785
+ }, []);
786
+ let b = [...Ct({
787
+ tabOverrides: ae,
788
+ tabOrder: oe,
789
+ hasBooking: u,
790
+ hasBought: g,
791
+ paymentsOn: p,
792
+ tabIcons: ne,
793
+ tabAccess: te.access
794
+ }), ...e.map((e) => ({
795
+ ...e,
796
+ id: e.path
797
+ }))].filter((e) => wt(e, o, !!n, re)), { rowRef: le, measureRef: ue, visible: x } = pt({
798
+ count: b.length,
799
+ listKey: b.map((e) => e.id + e.label).join("|"),
800
+ shown: ce && b.length > 0,
801
+ gap: 40,
802
+ moreButtonWidth: 52
803
+ }), fe = b.slice(0, x), S = b.slice(x), pe = b.map((e) => e.path).filter((e) => {
804
+ let n = e.replace(/\/+$/, "");
805
+ return t === e || n !== "" && t.startsWith(n + "/");
806
+ }).sort((e, t) => t.length - e.length)[0], C = (e) => e.path === pe, w = S.some((e) => C(e));
807
+ return ce ? b.length === 0 ? null : /* @__PURE__ */ k(ve, { children: [/* @__PURE__ */ O("div", {
808
+ ref: ue,
809
+ "aria-hidden": "true",
810
+ className: "flex items-center gap-5 md:gap-10 whitespace-nowrap px-1",
811
+ style: {
812
+ position: "fixed",
813
+ top: -9999,
814
+ left: 0,
815
+ visibility: "hidden",
816
+ pointerEvents: "none"
817
+ },
818
+ children: b.map((e, t) => {
819
+ let n = e.icon;
820
+ return /* @__PURE__ */ k("span", {
821
+ "data-measure": !0,
822
+ className: "flex items-center gap-2 text-[13px] md:text-[14.5px] font-semibold shrink-0 pb-2.5 md:pb-3",
823
+ children: [/* @__PURE__ */ O(n, { className: "w-4 h-4 md:w-[18px] md:h-[18px]" }), e.label]
824
+ }, t);
825
+ })
826
+ }), /* @__PURE__ */ k("div", {
827
+ ref: le,
828
+ className: "w-full flex items-center gap-5 md:gap-10 mb-5 border-b border-[var(--panel-border)] px-1 whitespace-nowrap relative",
829
+ children: [fe.map((e) => {
830
+ let t = C(e), n = e.icon;
831
+ return /* @__PURE__ */ k(Se, {
832
+ to: e.path || "/",
833
+ className: `flex items-center gap-2 text-[13px] md:text-[14.5px] font-semibold transition-all duration-300 pb-2.5 md:pb-3 -mb-[1px] border-b-2 shrink-0 ${t ? "text-accent border-accent" : "text-foreground/50 hover:text-foreground/80 border-transparent"}`,
834
+ children: [/* @__PURE__ */ O(n, { className: "w-4 h-4 md:w-[18px] md:h-[18px]" }), e.label]
835
+ }, e.path || e.id);
836
+ }), S.length > 0 && /* @__PURE__ */ k("div", {
837
+ className: "relative shrink-0 ml-auto",
838
+ ref: y,
839
+ children: [/* @__PURE__ */ O("button", {
840
+ onClick: () => v(!_),
841
+ className: `flex items-center justify-center transition-all duration-300 pb-2.5 md:pb-3 -mb-[1px] border-b-2 cursor-pointer ${w ? "text-accent border-accent" : "text-foreground/50 hover:text-foreground/80 border-transparent"}`,
842
+ title: "More items",
843
+ children: /* @__PURE__ */ O(ie, { className: "w-[18px] h-[18px] md:w-5 md:h-5" })
844
+ }), /* @__PURE__ */ O(r, { children: _ && /* @__PURE__ */ O(c.div, {
845
+ initial: {
846
+ opacity: 0,
847
+ y: 10
848
+ },
849
+ animate: {
850
+ opacity: 1,
851
+ y: 0
852
+ },
853
+ exit: {
854
+ opacity: 0,
855
+ y: 10
856
+ },
857
+ className: "absolute top-[100%] right-0 mt-2 min-w-[200px] glass-popover border border-[var(--panel-border)] rounded-2xl z-50 flex flex-col py-2 overflow-hidden",
858
+ children: S.map((e) => {
859
+ let t = C(e), n = e.icon;
860
+ return /* @__PURE__ */ k(Se, {
861
+ to: e.path || "/",
862
+ onClick: () => v(!1),
863
+ className: `flex items-center gap-3 px-5 py-3 text-[14px] font-medium transition-colors ${t ? "text-accent bg-accent/5" : "text-foreground/70 hover:text-foreground hover:bg-foreground/5"}`,
864
+ children: [/* @__PURE__ */ O(n, { className: "w-4 h-4" }), e.label]
865
+ }, e.path || e.id);
866
+ })
867
+ }) })]
868
+ })]
869
+ })] }) : /* @__PURE__ */ O("div", {
870
+ className: "w-full flex items-center gap-5 md:gap-10 mb-5 border-b border-[var(--panel-border)] px-1 whitespace-nowrap relative",
871
+ children: [
872
+ 56,
873
+ 72,
874
+ 64
875
+ ].map((e, t) => /* @__PURE__ */ k("span", {
876
+ className: "flex items-center gap-2 pb-2.5 md:pb-3 h-[30px] md:h-[33px] shrink-0",
877
+ "aria-hidden": "true",
878
+ children: [/* @__PURE__ */ O("span", { className: "w-4 h-4 md:w-[18px] md:h-[18px] rounded-md bg-foreground/5 animate-pulse" }), /* @__PURE__ */ O("span", {
879
+ className: "h-3.5 rounded bg-foreground/5 animate-pulse",
880
+ style: { width: e }
881
+ })]
882
+ }, t))
883
+ });
884
+ }
885
+ //#endregion
886
+ export { Ae as C, Ne as S, Ge as _, vt as a, F as b, rt as c, He as d, Ke as f, We as g, Ue as h, bt as i, et as l, Ve as m, Q as n, yt as o, qe as p, Tt as r, pt as s, Et as t, $e as u, H as v, je as w, Pe as x, I as y };