your-ai-workflow-firebase-os 2.0.1 → 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 (183) hide show
  1. package/dist/AccessNotice-BZ5Gt1nP.js +40 -0
  2. package/dist/AccessNotice-CN7kc70o.cjs +1 -0
  3. package/dist/{AddressField-R-HvndkG.js → AddressField-9Sqn8TvC.js} +3 -3
  4. package/dist/{AddressField-BkzFOo2t.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-BlYHb5e0.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-9J_YeJrb.js → TimeZoneField-DkI1Bkcz.js} +3382 -5513
  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-D0gLVNTL.cjs → bake-n2wyFw0B.cjs} +1 -1
  96. package/dist/{bake-OErV2MLy.js → bake-naZeMu98.js} +14 -14
  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/{dist-_zWHDDrc.js → dist-DUPvBnOA.js} +1 -1
  108. package/dist/email-BfnZnMwD.cjs +1 -0
  109. package/dist/email-Ddj8Dlu6.js +58 -0
  110. package/dist/{fileBytes-B0qxHYQL.cjs → fileBytes-BJPaiX9Y.cjs} +1 -1
  111. package/dist/{fileBytes-uhq3pGCS.js → fileBytes-bjgvCfWu.js} +2 -2
  112. package/dist/forms-Bvx9HTM6.js +75 -0
  113. package/dist/forms-CmNeTETW.cjs +1 -0
  114. package/dist/lib/ThemeContext.d.ts +0 -14
  115. package/dist/lib/bareImgWatch.d.ts +6 -1
  116. package/dist/lib/localEdits.d.ts +2 -0
  117. package/dist/lib/pageDesignLines.d.ts +1 -1
  118. package/dist/lib/paymentProducts.d.ts +8 -0
  119. package/dist/lib/payments.d.ts +11 -1
  120. package/dist/lib/people.d.ts +9 -0
  121. package/dist/lib/recordsKey.d.ts +24 -0
  122. package/dist/{lucide-react-DiyP8FA_.js → lucide-react-CA7GD7Nv.js} +8 -8
  123. package/dist/notices-B7iIrIEg.js +29 -0
  124. package/dist/notices-upMg8UVh.cjs +1 -0
  125. package/dist/openOnArrival-Buwqb86D.cjs +1 -0
  126. package/dist/openOnArrival-S2K6v-lB.js +35 -0
  127. package/dist/pageFiles--Ih60ITP.js +45 -0
  128. package/dist/pageFiles-UtBmlOcD.cjs +1 -0
  129. package/dist/pages/PagesAdmin.d.ts +69 -7
  130. package/dist/{pdf-DLuvpvHg.js → pdf-DRXcPGkr.js} +1 -1
  131. package/dist/{pdf.worker.min-C0gkd2Ec.js → pdf.worker.min-CfKZezeM.js} +1 -1
  132. package/dist/people-2jZE_pdI.js +102 -0
  133. package/dist/people-BpVvIr9-.cjs +1 -0
  134. package/dist/personName-CFw3pxuu.js +18 -0
  135. package/dist/personName-CbzN_i57.cjs +1 -0
  136. package/dist/publishSteps-C1cDFzzB.js +88 -0
  137. package/dist/publishSteps-SSm8afDw.cjs +1 -0
  138. package/dist/recordLock-DHVvI9bP.js +61 -0
  139. package/dist/recordLock-DWeIxiwh.cjs +1 -0
  140. package/dist/recordsKey-B7QrxdeU.cjs +1 -0
  141. package/dist/recordsKey-D5-wC0Aw.js +141 -0
  142. package/dist/registrationFields-CLeR2lQJ.js +181 -0
  143. package/dist/registrationFields-v4pOoRdn.cjs +1 -0
  144. package/dist/renderer.cjs.js +1 -1
  145. package/dist/renderer.es.js +1 -1
  146. package/dist/roles-D6VaHWfV.js +147 -0
  147. package/dist/roles-DQUFFBQe.cjs +1 -0
  148. package/dist/scheduleData-ATN8w5hI.js +727 -0
  149. package/dist/scheduleData-Cltj0ABZ.cjs +1 -0
  150. package/dist/server.cjs.js +6 -6
  151. package/dist/server.es.js +716 -715
  152. package/dist/serviceStatus-TQyZO_Y_.cjs +1 -0
  153. package/dist/serviceStatus-vS8AI7SZ.js +125 -0
  154. package/dist/tabAudience-BqpN6dsR.cjs +1 -0
  155. package/dist/tabAudience-CRyMvv0v.js +34 -0
  156. package/dist/transactions-BqMQDRx3.js +343 -0
  157. package/dist/transactions-CufFrdAM.cjs +1 -0
  158. package/dist/useIsPhone-BVGx_X3e.js +13 -0
  159. package/dist/useIsPhone-o63tNneA.cjs +1 -0
  160. package/dist/{validate-DzSJWuyL.js → validate-CmC_tLK-.js} +433 -351
  161. package/dist/validate-DZMwqSrb.cjs +103 -0
  162. package/dist/vite/validate.d.ts +14 -0
  163. package/dist/vite.cjs.js +1 -1
  164. package/dist/vite.es.js +1 -1
  165. package/dist/your-ai-workflow-firebase-os.cjs.js +15 -1431
  166. package/dist/your-ai-workflow-firebase-os.css +1 -1
  167. package/dist/your-ai-workflow-firebase-os.es.js +11695 -35911
  168. package/package.json +1 -1
  169. package/src/index.css +122 -2
  170. package/dist/ContactPopup-DF8qQCoY.cjs +0 -12
  171. package/dist/PhoneInputField-Btx07xvM.js +0 -2
  172. package/dist/aiModels-BIhoTNH0.cjs +0 -1
  173. package/dist/validate-e48WXJdP.cjs +0 -103
  174. /package/dist/{address-DI1YaCI4.cjs → address-Bsb8COq2.cjs} +0 -0
  175. /package/dist/{address-Ca1h_UZX.js → address-C2bHNxJU.js} +0 -0
  176. /package/dist/{dist-BLGlDv1e.cjs → dist-E4jTFPs7.cjs} +0 -0
  177. /package/dist/{lucide-react-BYniZ3lQ.cjs → lucide-react-BwV6L6Is.cjs} +0 -0
  178. /package/dist/{mediaKind-dk396a03.cjs → mediaKind-D0MWyv6b.cjs} +0 -0
  179. /package/dist/{mediaKind-De2Cx_kB.js → mediaKind-DmKMsjeY.js} +0 -0
  180. /package/dist/{pdf-CC5g01eC.cjs → pdf-jLjjhvjp.cjs} +0 -0
  181. /package/dist/{pdf.worker.min-pI_P-OCl.cjs → pdf.worker.min-bLgNWd7w.cjs} +0 -0
  182. /package/dist/{verifiedAccount-C1iCxopN.js → verifiedAccount-DRbRFJ6H.js} +0 -0
  183. /package/dist/{verifiedAccount-D3OeaOBo.cjs → verifiedAccount-DScyKk96.cjs} +0 -0
@@ -0,0 +1,164 @@
1
+ import { Ea as e, ba as t, wa as n } from "./TimeZoneField-DkI1Bkcz.js";
2
+ import { B as r, l as i, pt as a } from "./lucide-react-CA7GD7Nv.js";
3
+ import { useEffect as o, useRef as s, useState as c, useSyncExternalStore as l } from "react";
4
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
5
+ //#region src/lib/errorWatch.ts
6
+ var f = "fbos:trouble";
7
+ function p(e) {
8
+ typeof window > "u" || window.dispatchEvent(new CustomEvent(f, { detail: e }));
9
+ }
10
+ var m = 12e3, h = (e) => String(e?.message ?? e ?? "").toLowerCase().includes("websocket"), g = (e) => {
11
+ let t = String(e?.name || ""), n = String(e?.code || "").toLowerCase(), r = String(e?.message ?? e ?? "").toLowerCase();
12
+ return !(!r && !n && !t || h(e) || t === "AbortError" || n === "storage/canceled" || n === "cancelled" || r.includes("resizeobserver") || r === "script error." || r === "script error" || r.includes("the above error occurred"));
13
+ };
14
+ function _() {
15
+ let [t, n] = c(null), [r, i] = c(() => typeof navigator < "u" && navigator.onLine === !1), a = s({
16
+ words: "",
17
+ at: 0
18
+ }), l = s(0), u = s(null);
19
+ return o(() => {
20
+ if (typeof window > "u") return;
21
+ let t = (t, r) => {
22
+ if (!g(t)) {
23
+ h(t) && r?.preventDefault?.();
24
+ return;
25
+ }
26
+ console.warn("Your AI Firebase: something did not finish —", t), r?.preventDefault?.();
27
+ let i = `${t?.code || ""}|${t?.message ?? t ?? ""}`, o = Date.now();
28
+ a.current.words === i && o - a.current.at < 15e3 || (a.current = {
29
+ words: i,
30
+ at: o
31
+ }, l.current += 1, n({
32
+ error: t,
33
+ id: l.current
34
+ }), u.current && clearTimeout(u.current), e(t) || (u.current = setTimeout(() => n(null), m)));
35
+ }, r = (e) => t(e.reason, e), o = (e) => t(e.detail), s = (e) => {
36
+ typeof e.target?.tagName != "string" && t(e.error ?? e.message, e);
37
+ }, c = () => i(!0), d = () => {
38
+ i(!1), n(null), a.current = {
39
+ words: "",
40
+ at: 0
41
+ };
42
+ };
43
+ return window.addEventListener("unhandledrejection", r), window.addEventListener(f, o), window.addEventListener("error", s, !0), window.addEventListener("offline", c), window.addEventListener("online", d), () => {
44
+ window.removeEventListener("unhandledrejection", r), window.removeEventListener(f, o), window.removeEventListener("error", s, !0), window.removeEventListener("offline", c), window.removeEventListener("online", d), u.current && clearTimeout(u.current);
45
+ };
46
+ }, []), {
47
+ problem: t,
48
+ offline: r,
49
+ dismiss: () => n(null)
50
+ };
51
+ }
52
+ //#endregion
53
+ //#region src/components/Trouble.tsx
54
+ var v = () => {
55
+ typeof window < "u" && window.location.reload();
56
+ }, y = () => {
57
+ let e = typeof window < "u" ? window.location.pathname : "/";
58
+ return e && e !== "/login" && e !== "/" ? `/login?from=${encodeURIComponent(e)}` : "/login";
59
+ }, b = {
60
+ again: r,
61
+ reload: r,
62
+ signin: a,
63
+ none: r
64
+ }, x = "w-full flex items-center justify-center gap-2 py-2.5 bg-foreground/5 hover:bg-foreground/10 text-foreground text-[14px] font-bold rounded-xl transition-colors", S = "w-full text-center py-2 mt-2 text-[13px] font-bold text-foreground/50 hover:text-foreground/80 transition-colors";
65
+ function C({ found: e, onRetry: n, way: r, onTried: i }) {
66
+ let a = e.next === "again" && !n ? "reload" : e.next, o = b[a], s = t[a];
67
+ return a === "signin" ? /* @__PURE__ */ d("a", {
68
+ href: r.signInHref ?? y(),
69
+ className: x,
70
+ children: [/* @__PURE__ */ u(o, { className: "w-4 h-4 shrink-0" }), s]
71
+ }) : /* @__PURE__ */ d("button", {
72
+ type: "button",
73
+ onClick: () => {
74
+ i(), a === "again" && n ? n() : (r.reload ?? v)();
75
+ },
76
+ className: x,
77
+ children: [/* @__PURE__ */ u(o, { className: "w-4 h-4 shrink-0" }), s]
78
+ });
79
+ }
80
+ function w({ error: e, override: t, onRetry: r, size: i = "page", ...a }) {
81
+ let [o, s] = c(0), l = {
82
+ ...n(e),
83
+ ...t || {}
84
+ }, f = l.next === "again" && !!r;
85
+ return /* @__PURE__ */ u("div", {
86
+ className: i === "page" ? "flex-1 flex flex-col items-center justify-center relative z-10 min-h-[60vh] px-4 fbos-fade-in" : "w-full flex flex-col items-center justify-center py-10 px-4 fbos-fade-in",
87
+ role: "alert",
88
+ children: /* @__PURE__ */ d("div", {
89
+ className: "glass-panel p-8 md:p-10 rounded-3xl border border-[var(--panel-border)] text-center shadow-xl max-w-sm w-full relative overflow-hidden",
90
+ children: [
91
+ /* @__PURE__ */ u("div", { className: "absolute inset-0 bg-amber-500/5" }),
92
+ /* @__PURE__ */ u("h2", {
93
+ className: "text-2xl font-bold text-foreground mb-3 relative z-10 tracking-tight",
94
+ children: l.title
95
+ }),
96
+ /* @__PURE__ */ u("p", {
97
+ className: "text-[14px] text-foreground/70 font-medium leading-relaxed relative z-10 mb-6",
98
+ children: l.message
99
+ }),
100
+ /* @__PURE__ */ d("div", {
101
+ className: "relative z-10",
102
+ children: [/* @__PURE__ */ u(C, {
103
+ found: l,
104
+ onRetry: r,
105
+ way: a,
106
+ onTried: () => s((e) => e + 1)
107
+ }), f && o > 0 && /* @__PURE__ */ u("button", {
108
+ type: "button",
109
+ onClick: () => (a.reload ?? v)(),
110
+ className: S,
111
+ children: "Still not working? Reload the page"
112
+ })]
113
+ })
114
+ ]
115
+ })
116
+ });
117
+ }
118
+ var T = 0, E = /* @__PURE__ */ new Set(), D = () => E.forEach((e) => e()), O = (e) => (E.add(e), () => {
119
+ E.delete(e);
120
+ });
121
+ function k() {
122
+ return l(O, () => T > 0, () => !1);
123
+ }
124
+ function A({ error: e, offline: t, onRetry: a, onDismiss: s, ...c }) {
125
+ let l = n(e), f = t ? "You are offline. The app will catch up by itself the moment you are back." : l.short;
126
+ return o(() => (T += 1, D(), () => {
127
+ --T, D();
128
+ }), []), /* @__PURE__ */ u("div", {
129
+ className: "fixed bottom-4 left-1/2 -translate-x-1/2 z-[60] w-[calc(100%-2rem)] max-w-md px-0",
130
+ role: "status",
131
+ children: /* @__PURE__ */ d("div", {
132
+ className: "glass-panel rounded-2xl border border-[var(--panel-border)] shadow-xl px-4 py-3 flex items-center gap-3",
133
+ children: [
134
+ u(t ? i : r, { className: "w-4 h-4 shrink-0 text-amber-500" }),
135
+ /* @__PURE__ */ u("p", {
136
+ className: "text-[13px] font-semibold text-foreground/80 leading-snug flex-1",
137
+ children: f
138
+ }),
139
+ !t && /* @__PURE__ */ u("button", {
140
+ type: "button",
141
+ onClick: () => a ? a() : (c.reload ?? v)(),
142
+ className: "shrink-0 text-[13px] font-bold text-foreground hover:text-accent transition-colors whitespace-nowrap",
143
+ children: a ? "Try again" : "Reload"
144
+ }),
145
+ s && /* @__PURE__ */ u("button", {
146
+ type: "button",
147
+ onClick: s,
148
+ "aria-label": "Hide this",
149
+ className: "shrink-0 text-[13px] font-bold text-foreground/40 hover:text-foreground/70 transition-colors",
150
+ children: "✕"
151
+ })
152
+ ]
153
+ })
154
+ });
155
+ }
156
+ function j() {
157
+ let { problem: e, offline: t, dismiss: n } = _();
158
+ return t ? /* @__PURE__ */ u(A, { offline: !0 }) : e ? /* @__PURE__ */ u(A, {
159
+ error: e.error,
160
+ onDismiss: n
161
+ }, e.id) : null;
162
+ }
163
+ //#endregion
164
+ export { p as a, k as i, j as n, x as r, w as t };
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-CiTBaPhY.cjs`),t=require(`./PageTitle-CZhgmmDT.cjs`),n=require(`./TimeZoneField-qs7NPR30.cjs`),r=require(`./DashboardNav-CXa_ci-_.cjs`),i=require(`./verifiedAccount-DScyKk96.cjs`),a=require(`./lucide-react-BwV6L6Is.cjs`);require(`./scheduleData-Cltj0ABZ.cjs`);const o=require(`./registrationFields-v4pOoRdn.cjs`),s=require(`./roles-DQUFFBQe.cjs`),c=require(`./notices-upMg8UVh.cjs`),l=require(`./FormNote-BtdTGpml.cjs`),u=require(`./ConfirmModal-Di9GR-vV.cjs`),d=require(`./recordsKey-B7QrxdeU.cjs`),f=require(`./pageFiles-UtBmlOcD.cjs`),p=require(`./personName-CbzN_i57.cjs`),m=require(`./people-BpVvIr9-.cjs`),h=require(`./SystemTabContent-L3vGGF3P.cjs`),g=require(`./useIsPhone-o63tNneA.cjs`);let _=require(`react`);_=e.a(_,1);let v=require(`react/jsx-runtime`),y=require(`firebase/firestore`),b=require(`firebase/storage`),x=require(`react-router-dom`);function S(e){return e.length===1?/\bplan$/i.test(e[0])?e[0]:`${e[0]} plan`:`Plans: ${e.join(`, `)}`}var C=`flex flex-col divide-y divide-[var(--panel-border)]/60 rounded-2xl border border-[var(--panel-border)]/60`,w=`flex items-center gap-3 rounded-2xl border border-dashed border-[var(--panel-border)] px-4 py-3 sm:px-5`,T=`${n.c.replace(`h-11 `,`h-9 sm:h-10 `)} flex-1 min-w-0 max-w-sm`,E={user:`Everybody who signs up`,internal:`People you mark as your team`,admin:`People who run the app`};function D({roles:e,plans:r}){let[i,o]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),[f,p]=(0,_.useState)(``),[h,g]=(0,_.useState)(``),[y,b]=(0,_.useState)(!1),[x,D]=(0,_.useState)(``),[O,k]=(0,_.useState)(``),[A,M]=(0,_.useState)(null),[N,P]=(0,_.useState)(``),F=[...s.t(e),...e],I=d.u()||[],L=async t=>{let r=s.i(t.id,c,e);if(r){p(r);return}g(t.id);try{await s.a(t.id,c),o(``),p(``)}catch(e){p(n.Ta(e,`The new name could not be saved. Try again.`))}g(``)},ee=async e=>{g(e.id);try{M({role:e,standing:await s.s(e.id)})}catch{M({role:e,standing:{people:[],pages:[]}})}g(``)},R=()=>{b(!1),D(``),k(``)},z=async()=>{let t=s.o(x,e);if(t){k(t);return}g(`adding`);try{await s.n(x.trim()),R()}catch(e){k(n.Ta(e,`The role could not be saved. Try again.`))}g(``)};return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(n.h,{icon:a.w,title:`Roles`,description:`The words you mark people with, and the words your pages are kept for. Renaming one changes it everywhere.`,children:[(0,v.jsx)(`div`,{className:C,children:F.map(u=>{let d=n.pa(u.id),g=r[u.id]||[],_=m.n(u.id,m.t(u.id,I),e),y=s.u(u.id,e),b=d?!!n.fa(u.id):!!u.icon;return(0,v.jsxs)(`div`,{className:`px-4 py-2.5 sm:py-3`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2 sm:gap-3`,children:[(0,v.jsx)(t.l,{name:y,label:`Change the icon for ${u.name}`,open:N===u.id,onClick:()=>P(N===u.id?``:u.id)}),i===u.id?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`input`,{autoFocus:!0,value:c,disabled:h===u.id,placeholder:n.la[u.id]||u.name,"aria-label":`Rename ${u.name}`,onChange:e=>{l(e.target.value),f&&p(``)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),L(u)),e.key===`Escape`&&(e.preventDefault(),o(``),p(``))},className:T}),(0,v.jsx)(`span`,{className:`flex-1`}),(0,v.jsx)(n.o,{icon:a.sn,compact:!0,busy:h===u.id,title:`Save ${c||u.name}`,onClick:()=>L(u),children:`Save`}),(0,v.jsx)(n.o,{icon:a.o,compact:!0,title:`Keep the name`,onClick:()=>{o(``),p(``)},children:`Cancel`})]}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(`span`,{className:`flex-1 min-w-0 flex items-center gap-2.5`,children:[(0,v.jsx)(`span`,{className:`text-[13.5px] font-bold text-foreground leading-tight truncate`,children:u.name}),d&&(0,v.jsx)(`span`,{className:`max-sm:hidden text-[12px] font-medium text-foreground/45 truncate`,children:E[u.id]}),g.length>0&&(0,v.jsx)(`span`,{className:`max-sm:hidden min-w-0 overflow-hidden`,title:g.join(`, `),children:(0,v.jsx)(n.v,{state:`saved`,label:S(g)})})]}),(0,v.jsx)(n.o,{icon:a.X,compact:!0,title:`Rename ${u.name}`,onClick:()=>{o(u.id),l(u.name),p(``)},children:`Rename`}),!d&&(0,v.jsx)(n.o,{icon:a.C,tone:`danger`,compact:!0,busy:h===u.id,title:`Remove ${u.name}`,onClick:()=>ee(u),children:`Remove`})]})]}),N===u.id&&(0,v.jsx)(`div`,{className:`mt-2.5`,children:(0,v.jsx)(t.s,{label:`${u.name} is drawn as`,hint:`Type a word — anything close comes up. Until you pick one it follows the name.`,value:y,onPick:async e=>{P(``);try{await s.c(u.id,e)}catch(e){p(n.Ta(e,`The icon could not be saved. Try again.`))}},resetLabel:b?`Use the one the name suggests`:void 0,resetTitle:`Go back to the icon ${u.name} suggests`,onReset:b?async()=>{P(``);try{await s.c(u.id,``)}catch(e){p(n.Ta(e,`The icon could not be saved. Try again.`))}}:void 0})}),!!_&&i!==u.id&&(0,v.jsx)(`p`,{className:`max-sm:hidden text-[12px] font-medium text-foreground/45 leading-relaxed mt-1`,children:_})]},u.id)})}),!!f&&(0,v.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 px-1 -mt-2`,children:f}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,v.jsx)(`div`,{className:w,children:y?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`input`,{autoFocus:!0,value:x,placeholder:`Client`,disabled:h===`adding`,"aria-label":`Name the role`,onChange:e=>{D(e.target.value),O&&k(``)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),z()),e.key===`Escape`&&(e.preventDefault(),R())},className:T}),(0,v.jsx)(`span`,{className:`flex-1`}),(0,v.jsx)(n.o,{icon:a.sn,compact:!0,busy:h===`adding`,title:`Add this role`,onClick:z,children:`Add`}),(0,v.jsx)(n.o,{icon:a.o,compact:!0,title:`Cancel the new role`,onClick:R,children:`Cancel`})]}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(n.o,{icon:a.G,onClick:()=>{b(!0),k(``)},children:`Add a role`}),!e.length&&(0,v.jsxs)(`p`,{className:`text-[12.5px] text-foreground/55 font-medium leading-relaxed`,children:[(0,v.jsx)(`span`,{className:`sm:hidden`,children:`A word of your own — Client, say, or Supplier.`}),(0,v.jsx)(`span`,{className:`max-sm:hidden`,children:`A word of your own to mark people with — Client, say, or Supplier — and a page can be kept for them alone.`})]})]})}),!!O&&(0,v.jsx)(`p`,{className:`text-[12px] font-semibold text-red-500 px-1`,children:O})]}),(0,v.jsx)(`p`,{className:`${n.s} px-1 max-sm:hidden`,children:`A role you make opens nothing on its own. Tick it on a page's row on the Pages screen, or let a plan on the Payments screen give it. Renaming changes the word on every screen and nothing else — nobody loses a page and no rules have to be pasted again.`})]}),(0,v.jsx)(u.t,{isOpen:!!A,title:A?`Remove ${A.role.name}?`:``,message:A?j(A.standing):``,confirmText:`Yes, remove it`,cancelText:`Keep it`,isProcessing:h===`removing`,onCancel:()=>M(null),onConfirm:async()=>{if(A){g(`removing`);try{await s.r(A.role.id),M(null)}catch(e){p(n.Ta(e,`The role could not be removed. Try again.`)),M(null)}g(``)}}})]})}var O=`A group opens nothing on its own. Keep a tab to one on the Pages screen, and only people whose role is in it see that tab.`;function k(e){return`${e?`${e} ${e===1?`tab is`:`tabs are`} kept to it, and ${e===1?`goes`:`go`} back to everybody ticked on ${e===1?`it`:`them`}.`:`No tab is kept to it.`} Nobody’s role changes and no page is deleted — only the group itself goes.`}function A({roles:e}){let{groups:t}=r.v(),[i,o]=(0,_.useState)(``),[c,d]=(0,_.useState)(``),[f,p]=(0,_.useState)(``),[m,h]=(0,_.useState)(``),[g,y]=(0,_.useState)(!1),[b,x]=(0,_.useState)(``),[S,E]=(0,_.useState)(``),[D,A]=(0,_.useState)(null),j=[...s.t(e),...e].map(e=>({value:e.id,label:e.name})),M=async e=>{let i=r.m(c,t,e.id);if(i){p(i);return}h(e.id);try{await r.h(e.id,c),o(``),p(``)}catch(e){p(n.Ta(e,`The new name could not be saved. Try again.`))}h(``)},N=async(e,t)=>{let i=e.roles.includes(t)?e.roles.filter(e=>e!==t):[...e.roles,t];p(``);try{await r.g(e.id,i)}catch(e){p(n.Ta(e,`That could not be saved. Try again.`))}},P=async e=>{h(e.id);try{A({group:e,tabs:(await r._(e.id)).length})}catch{A({group:e,tabs:0})}h(``)},F=()=>{y(!1),x(``),E(``)},I=async()=>{let e=r.m(b,t);if(e){E(e);return}h(`adding`);try{await r.d(b.trim()),F()}catch(e){E(n.Ta(e,`The group could not be saved. Try again.`))}h(``)};return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(n.h,{icon:a.mn,title:`Groups`,description:`Roles that belong together — a department, a branch, a client’s company. A tab can be kept to one group.`,children:[t.length>0&&(0,v.jsx)(`div`,{className:C,children:t.map(e=>(0,v.jsxs)(`div`,{className:`px-4 py-2.5 sm:py-3 flex flex-col gap-2`,children:[(0,v.jsx)(`div`,{className:`flex items-center gap-2 sm:gap-3`,children:i===e.id?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`input`,{autoFocus:!0,value:c,disabled:m===e.id,placeholder:e.name,"aria-label":`Rename ${e.name}`,onChange:e=>{d(e.target.value),f&&p(``)},onKeyDown:t=>{t.key===`Enter`&&(t.preventDefault(),M(e)),t.key===`Escape`&&(t.preventDefault(),o(``),p(``))},className:T}),(0,v.jsx)(`span`,{className:`flex-1`}),(0,v.jsx)(n.o,{icon:a.sn,compact:!0,busy:m===e.id,title:`Save ${c||e.name}`,onClick:()=>M(e),children:`Save`}),(0,v.jsx)(n.o,{icon:a.o,compact:!0,title:`Keep the name`,onClick:()=>{o(``),p(``)},children:`Cancel`})]}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`span`,{className:`flex-1 min-w-0 text-[13.5px] font-bold text-foreground leading-tight truncate`,children:e.name}),(0,v.jsx)(`div`,{className:`max-sm:hidden shrink-0 min-w-0 max-w-[18rem]`,children:(0,v.jsx)(n.nr,{multiple:!0,compact:!0,portal:!0,direction:`auto`,className:`console-select`,ariaLabel:`Roles in ${e.name}`,placeholder:`Pick its roles`,values:e.roles,options:j,onChange:t=>N(e,t)})}),(0,v.jsx)(n.o,{icon:a.X,compact:!0,title:`Rename ${e.name}`,onClick:()=>{o(e.id),d(e.name),p(``)},children:`Rename`}),(0,v.jsx)(n.o,{icon:a.C,tone:`danger`,compact:!0,busy:m===e.id,title:`Remove ${e.name}`,onClick:()=>P(e),children:`Remove`})]})}),i!==e.id&&(0,v.jsx)(`div`,{className:`sm:hidden`,children:(0,v.jsx)(n.nr,{multiple:!0,dense:!0,portal:!0,direction:`auto`,className:`console-select`,ariaLabel:`Roles in ${e.name}`,placeholder:`Pick its roles`,values:e.roles,options:j,onChange:t=>N(e,t)})})]},e.id))}),!!f&&(0,v.jsx)(l.t,{tone:`error`,children:f}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,v.jsx)(`div`,{className:w,children:g?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`input`,{autoFocus:!0,value:b,placeholder:`Sales`,disabled:m===`adding`,"aria-label":`Name the group`,onChange:e=>{x(e.target.value),S&&E(``)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),I()),e.key===`Escape`&&(e.preventDefault(),F())},className:T}),(0,v.jsx)(`span`,{className:`flex-1`}),(0,v.jsx)(n.o,{icon:a.sn,compact:!0,busy:m===`adding`,title:`Add this group`,onClick:I,children:`Add`}),(0,v.jsx)(n.o,{icon:a.o,compact:!0,title:`Cancel the new group`,onClick:F,children:`Cancel`})]}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(n.o,{icon:a.G,onClick:()=>{y(!0),E(``)},children:`Add a group`}),!t.length&&(0,v.jsxs)(`p`,{className:`text-[12.5px] text-foreground/55 font-medium leading-relaxed`,children:[(0,v.jsx)(`span`,{className:`sm:hidden`,children:`Roles that belong together — Sales, say.`}),(0,v.jsx)(`span`,{className:`max-sm:hidden`,children:`A name for roles that belong together — Sales, say, or North branch — then tick the roles in it.`})]})]})}),!!S&&(0,v.jsx)(l.t,{tone:`error`,children:S})]}),(0,v.jsx)(`p`,{className:`${n.s} px-1 max-sm:hidden`,children:O})]}),(0,v.jsx)(u.t,{isOpen:!!D,title:D?`Remove ${D.group.name}?`:``,message:D?k(D.tabs):``,confirmText:`Yes, remove it`,cancelText:`Keep it`,isProcessing:m===`removing`,onCancel:()=>A(null),onConfirm:async()=>{if(D){h(`removing`);try{await r.f(D.group.id)}catch(e){p(n.Ta(e,`The group could not be removed. Try again.`))}A(null),h(``)}}})]})}function j(e){let t=e.people.length,n=e.pages.length,r=e.plans||[],i=[];t&&i.push(`${t} ${t===1?`person goes`:`people go`} back to being ${t===1?`a member`:`members`}`),n&&i.push(`${n} ${n===1?`page goes`:`pages go`} back to everybody signed in`),r.length&&i.push(r.length===1?`the ${r[0]} plan stops giving it`:`${r.length} plans stop giving it`);let a=i.length>2?`${i.slice(0,-1).join(`, `)}, and ${i[i.length-1]}`:i.join(`, and `),o=i.length?`${a.charAt(0).toUpperCase()}${a.slice(1)}. `:`Nobody is marked with it and no page is kept for it. `,s=r.length?` A plan keeps selling — pick it a new role on the Payments screen.`:``;return`${o}Whatever those pages have saved stays exactly where it is — you and your admins can still read it — but nobody else will, and the word itself is gone from every list.${n?` ${n===1?`That page was built to read what was kept for this role, so it needs building again: open it`:`Those pages were built to read what was kept for this role, so they need building again: open each one`} on your Pages screen and copy the sentence on its row.`:``}${s}`}function M(e){return`Everything this app keeps about ${e} is deleted — their name, their picture, their role, what they kept on pages only they could see, and their place in every list — and they are signed out at once. If they ever sign in or sign up again they start from nothing, as a new person with no role, like anybody else. Whatever they made on your pages for others stays exactly where it is, under the name the record itself saved. This cannot be undone.`}function N(e){let t=new Set;for(let[n,r]of e)!r||i.C(r)!==`user_`||t.add(d.r(r,`user_`,n));return[...t]}async function P(e){let t=new Map;for(let[e,n]of r.S())!n.isPublic&&n.config&&t.set(e,n.config);try{(await(0,y.getDocs)((0,y.collection)(n.ka,`sys_tabs`))).forEach(e=>t.set(e.id,{...t.get(e.id)||{},...e.data()}))}catch{}let i=f.i(`user_`);for(let r of N([...t.entries()]))try{let t=await(0,y.getDocs)((0,y.query)((0,y.collection)(n.ka,r),(0,y.where)(`uid`,`==`,e)));await Promise.all(t.docs.map(async e=>{await f.o({id:e.id,...e.data()},[],i),await(0,y.deleteDoc)(e.ref)}))}catch(e){console.warn(`${r}: a deleted person's own records could not be swept.`,e)}}function F({person:e,settings:t}){let r=o.c(e,t);return r.length?(0,v.jsxs)(`div`,{className:`pt-5 border-t border-[var(--panel-border)]/50 flex flex-col gap-3`,children:[(0,v.jsx)(`p`,{className:`${n.u} ml-1`,children:`What they told you`}),(0,v.jsx)(`div`,{className:`flex flex-col divide-y divide-[var(--panel-border)]/50 rounded-xl border border-[var(--panel-border)]/60`,children:r.map(t=>{let n=o.f(e,t);return(0,v.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3 px-3.5 py-2.5 min-w-0`,children:[(0,v.jsx)(`span`,{className:`text-[12.5px] font-medium text-foreground/50 shrink-0 max-w-[45%] truncate`,children:t.label}),(0,v.jsx)(`span`,{className:`text-[13px] font-semibold min-w-0 text-right [overflow-wrap:anywhere] ${n?`text-foreground`:`text-foreground/35 italic`}`,children:n?o.a(e,t):`Not given`})]},t.key)})})]}):null}var I=e=>{let t=n.yi(e);return i.d(t)||i.D(i.b(t))},L=`waiting`;function ee(e,t,n){let r=new Map,i=[];for(let t of e){if(!t.inactive&&n(t)){i.push(t);continue}let e=I(t);r.set(e,[...r.get(e)||[],t])}let a=[...r.keys()].filter(e=>![`admin`,`internal`,`user`,...t].includes(e)).sort(),o=[`admin`,`internal`,...t,...a,`user`];return[...i.length?[{id:L,people:i}]:[],...o.filter(e=>r.has(e)).map(e=>({id:e,people:r.get(e)}))]}var R=n.l.replace(`h-11 `,`h-9 `).replace(`px-4 `,`px-3 `),z=e=>e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase();function te(e,t){let n=z(t.trim());if(!n)return!0;let r=e.email||``;if([e.displayName,/[@.]/.test(n)?r:r.split(`@`)[0]].some(e=>!!e&&z(e).includes(n)))return!0;let i=n.replace(/\D/g,``);return!!i&&i.length===n.replace(/[\s+()-]/g,``).length&&(e.phone||``).replace(/\D/g,``).includes(i)}function ne({label:e,title:n,count:r,icon:i,plain:a,active:o,onClick:s}){return(0,v.jsxs)(`button`,{type:`button`,"aria-pressed":o,"aria-label":n,title:n,onClick:s,className:`inline-flex items-center gap-2 h-9 pl-3 pr-3.5 shrink-0 whitespace-nowrap rounded-full border text-[12.5px] font-semibold transition-all cursor-pointer active:scale-[0.98] ${o?`border-accent/35 bg-accent/10 text-foreground`:`border-[var(--panel-border)]/70 text-foreground/55 hover:text-foreground hover:border-accent/30 hover:bg-foreground/[0.03]`}`,children:[i===``?(0,v.jsx)(`span`,{className:`w-1.5 h-1.5 mx-1 rounded-full shrink-0 bg-accent animate-pulse`}):i&&(0,v.jsx)(t.c,{name:i,className:`w-3.5 h-3.5 shrink-0 ${a&&!o?`text-foreground/35`:`text-accent`}`}),(0,v.jsx)(`span`,{children:e}),(0,v.jsx)(`span`,{className:`tabular-nums font-medium ${o?`text-foreground/50`:`text-foreground/35`}`,children:r})]})}function B({label:e,plain:n,waiting:r,icon:i}){return(0,v.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-[11.5px] font-semibold whitespace-nowrap shrink-0 ${r?`text-foreground/70`:`text-foreground/50`}`,children:[i?(0,v.jsx)(t.c,{name:i,className:`w-3.5 h-3.5 shrink-0 ${n?`text-foreground/35`:`text-accent`} ${r?`animate-pulse`:``}`}):(0,v.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full shrink-0 ${n?`bg-foreground/25`:`bg-accent`} ${r?`animate-pulse`:``}`}),e]})}function V(){let{user:e,userRole:o}=n.dr(),d=s.l(),f=n.$r(),m=n.Ci(),{groups:S}=r.v(),[C,w]=(0,_.useState)(!0),T=(0,x.useNavigate)(),{id:E}=(0,x.useParams)(),O=g.n(),[k,j]=(0,_.useState)([]),[N,L]=(0,_.useState)(null),[z,V]=(0,_.useState)(null),[re,ie]=(0,_.useState)(!1),[ae,oe]=(0,_.useState)(``),[H,U]=(0,_.useState)(null),[se,ce]=(0,_.useState)(!1),W=ee(k,d.map(e=>e.id),e=>!!n.Pr(e)),G=W[0]?.people[0]?.id||``,[le,ue]=(0,_.useState)(``),[de,fe]=(0,_.useState)(``),K=W.some(e=>e.id===le)?le:``,q=k.length>=8,pe=W.filter(e=>!K||e.id===K).map(e=>({...e,people:e.people.filter(e=>te(e,q?de:``))})).filter(e=>e.people.length),J=E?k.find(e=>e.id===E)||null:k.find(e=>e.id===G)||null,Y=e=>{T(e?`/users/${e.id}`:`/users`)};(0,_.useEffect)(()=>{let e=(0,y.onSnapshot)((0,y.collection)(n.ka,`user_profiles`),e=>{let t=[];e.forEach(e=>{let n={id:e.id,...e.data()};n.removed||t.push(n)}),t.sort((e,t)=>Number(!!n.Pr(t))-Number(!!n.Pr(e))),j(t),L(null),w(!1)},e=>{console.error(`Error fetching users:`,e),L(e),w(!1)});return()=>e()},[]),(0,_.useEffect)(()=>{!E&&G&&!g.t()&&T(`/users/${G}`,{replace:!0})},[E,G,T]);let me=(0,_.useRef)(null),[he,ge]=(0,_.useState)(!1);(0,_.useEffect)(()=>{let e=me.current,t=e?.querySelector(`[aria-current="true"]`);if(!e||!t||e.scrollHeight<=e.clientHeight)return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.top<n.top?e.scrollTop-=n.top-r.top+12:r.bottom>n.bottom-40&&(e.scrollTop+=r.bottom-n.bottom+40)},[E,k.length,K]);let _e=k.find(t=>t.id===e?.uid),X=o===`admin`,Z=e=>!X||e.id===_e?.id?!1:e.role!==`admin`||!_e?.createdAt?!0:e.createdAt?new Date(_e.createdAt).getTime()<=new Date(e.createdAt).getTime():!1,ve=[...i.r.map(e=>({value:i.D(e),label:n.ha(i.D(e),d)})),...d.map(e=>({value:e.id,label:e.name}))],ye=ve.map(e=>({value:e.value,label:(0,v.jsxs)(`span`,{className:`inline-flex items-center gap-2 min-w-0`,children:[(0,v.jsx)(t.c,{name:s.u(e.value,d),className:`w-4 h-4 shrink-0 opacity-70`}),(0,v.jsx)(`span`,{className:`truncate`,children:e.label})]})})),Q=I,be=e=>{let t=S.filter(t=>i.m(Q(e),t)).map(e=>e.name);return t.length?`In ${t.length===1?`the group`:`the groups`} ${t.join(`, `)}`:``},xe=e=>{let t=n.Pr(e);return t?n.Ar(t.role,n.ha(t.role,d)):``},Se=e=>n.Wr(e)&&(e===`internal`||d.some(t=>t.id===e)),Ce=k.filter(e=>n.Pr(e)).length,we=e=>!n.xi(e)||n.yi(e)===`user`?``:`Paid plan · until ${new Date(n.bi(e)).toLocaleDateString(void 0,{day:`numeric`,month:`short`,year:`numeric`})}`,Te=e=>e===i.D(`free`)?n.Mr():n.kr(),Ee=async(e,t,r)=>{if(o!==`admin`||!Z(e)||Q(e)===t)return;let i=n.Pr(e);try{await(0,y.updateDoc)((0,y.doc)(n.ka,`user_profiles`,e.id),{role:t,...n.vi(),...i?n.jr():{}}),i&&await c.n(e.id,Te(t)),V({text:`Role set to ${r}`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}},De=async(e,t)=>{if(!(o!==`admin`||!Z(e)||!Se(t)))try{await(0,y.updateDoc)((0,y.doc)(n.ka,`user_profiles`,e.id),{role:t,...n.vi(),...n.jr()}),await c.n(e.id,n.kr()),V({text:`${p.n(e)} is ${n.Zr(t,n.ha(t,d))} now`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}},Oe=async e=>{if(o!==`admin`||!Z(e))return;let t=n.Pr(e);try{await(0,y.updateDoc)((0,y.doc)(n.ka,`user_profiles`,e.id),n.jr()),t&&await c.n(e.id,n.Mr()),V({text:`Request cleared — ${p.n(e)} stays a member`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}},ke=async(e,t)=>{if(!(o!==`admin`||!Z(e)))try{await(0,y.updateDoc)((0,y.doc)(n.ka,`user_profiles`,e.id),{inactive:t}),V({text:`User ${t?`deactivated`:`activated`} successfully`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}},Ae=async e=>{if(!(o!==`admin`||!Z(e))){ce(!0);try{let t=Date.now();await(0,y.setDoc)((0,y.doc)(n.ka,`user_profiles`,e.id),{removed:!0,inactive:!0,removedAt:new Date(t).toISOString(),removedMs:t}),await(0,b.deleteObject)((0,b.ref)(n.ja,`user_avatars/${e.id}/file.png`)).catch(()=>{}),await P(e.id),ce(!1),U(null),Y(null),V({text:`Person deleted`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){ce(!1),U(null),V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}}},je=async()=>{if(ie(!1),!(!J||!Z(J)||ae===J.displayName))try{await(0,y.updateDoc)((0,y.doc)(n.ka,`user_profiles`,J.id),{displayName:ae}),V({text:`Name updated successfully`,type:`success`}),setTimeout(()=>V(null),3e3)}catch(e){V({text:e.message,type:`error`}),setTimeout(()=>V(null),3e3)}},[Me,Ne]=(0,_.useState)(!1);if((0,_.useEffect)(()=>{let e;return C&&k.length===0?e=setTimeout(()=>Ne(!0),150):Ne(!1),()=>clearTimeout(e)},[C,k.length]),C&&k.length===0)return Me?(0,v.jsx)(`div`,{className:`fixed inset-0 z-[100] flex items-center justify-center bg-background/60 backdrop-blur-xl transition-all duration-300`,children:(0,v.jsx)(a.ht,{className:`w-8 h-8 animate-spin text-accent`})}):null;let $=O&&!!E,Pe=!$,Fe=!O||!!E,Ie=e=>q&&(0,v.jsxs)(`div`,{className:`${R} md:w-56 shrink-0`,children:[(0,v.jsx)(a.F,{className:`w-3.5 h-3.5 mr-2 shrink-0 text-foreground/35`}),(0,v.jsx)(`input`,{value:de,onFocus:e,onChange:e=>fe(e.target.value),onKeyDown:e=>{e.key===`Escape`&&fe(``)},placeholder:`Find somebody`,"aria-label":`Find somebody`,className:`flex-1 min-w-0 h-full bg-transparent border-none outline-none shadow-none text-[14px] text-foreground placeholder:text-foreground/35 disabled:cursor-not-allowed text-[13px]`}),!!de&&(0,v.jsx)(`button`,{type:`button`,onClick:()=>fe(``),"aria-label":`Clear the search`,className:`shrink-0 -mr-1 w-6 h-6 flex items-center justify-center rounded-full text-foreground/40 hover:text-foreground hover:bg-foreground/5 transition-colors cursor-pointer`,children:(0,v.jsx)(a.o,{className:`w-3.5 h-3.5`})})]}),Le=Ce?`${Ce} ${Ce===1?`person is`:`people are`} waiting for an answer — first in the list.`:`${k.length} ${k.length===1?`person has`:`people have`} signed up. ${O?`Tap somebody to `:`Pick somebody to `}${X?`change what they can open.`:`see their details.`}`;return(0,v.jsxs)(`main`,{className:`flex-1 w-full max-w-7xl mx-auto p-4 pt-2 md:p-8 md:pt-4 z-10 flex flex-col min-h-screen`,children:[(0,v.jsxs)(n.sr.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},className:`mb-6`,children:[(0,v.jsx)(t.t,{children:`Users`}),(0,v.jsxs)(`div`,{className:`flex items-center gap-2 text-foreground/40 font-bold uppercase tracking-[0.2em] text-[11px]`,children:[(0,v.jsx)(`span`,{className:`w-8 h-[1px] bg-foreground/10`}),`/users`]})]}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-6 flex-1 pb-16`,children:[(0,v.jsx)(n.cr,{children:z&&(0,v.jsx)(n.sr.div,{exit:{opacity:0,y:-6},children:(0,v.jsx)(l.t,{tone:z.type===`error`?`error`:`done`,children:z.text})})}),(0,v.jsx)(r.t,{}),(0,v.jsx)(h.n,{tab:`users`}),(0,v.jsxs)(`div`,{className:`glass-panel border border-[var(--panel-border)] rounded-3xl p-4 sm:p-5 md:p-8 shadow-2xl relative bg-background flex flex-col fbos-tab-fill gap-4`,children:[(0,v.jsx)(n.h,{icon:a.h,title:`People`,description:k.length?Le:N?void 0:`Nobody has signed up yet.`,actions:O||!q?void 0:({open:e})=>Ie(e),children:k.length===0&&N?(0,v.jsx)(l.t,{tone:`error`,children:n.Ta(N,`The people could not be read.`)}):k.length===0?(0,v.jsx)(n.g,{children:`Everybody who signs in to your app appears here, and this is where you say what each of them can open.`}):(0,v.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-[minmax(0,5fr)_minmax(0,7fr)] gap-x-6 lg:gap-x-8 gap-y-5 items-start`,children:[Pe&&(W.length>1||q)&&(0,v.jsxs)(`div`,{className:`md:col-span-2 flex flex-col md:flex-row md:items-start gap-3 md:gap-4 min-w-0`,children:[W.length>1&&(0,v.jsxs)(`div`,{role:`group`,"aria-label":`Show`,className:`flex-1 min-w-0 flex items-center gap-2 md:flex-wrap max-md:overflow-x-auto max-md:-mx-4 max-md:px-4 hide-scrollbar`,children:[(0,v.jsx)(ne,{label:`Everyone`,title:`Show everyone`,count:k.length,active:!K,onClick:()=>ue(``)}),W.map(e=>{let t=e.id===`waiting`,r=t?`Waiting`:n.ha(e.id,d);return(0,v.jsx)(ne,{label:r,title:t?`Show only whoever is waiting for an answer`:`Show only ${r}`,count:e.people.length,icon:t?``:s.u(e.id,d),plain:e.id===`user`,active:K===e.id,onClick:()=>ue(K===e.id?``:e.id)},e.id)})]}),O&&Ie()]}),Pe&&(0,v.jsxs)(`div`,{ref:me,onScroll:e=>ge(e.currentTarget.scrollTop>2),className:`flex flex-col gap-6 min-w-0 md:max-h-[min(72vh,680px)] md:overflow-y-auto md:pb-8 md:-mr-2 md:pr-2 hide-scrollbar ${he?`md:[mask-image:linear-gradient(to_bottom,transparent,black_1.5rem,black_calc(100%-2rem),transparent)]`:`md:[mask-image:linear-gradient(to_bottom,black_calc(100%-2rem),transparent)]`}`,children:[pe.length===0&&(0,v.jsx)(`p`,{className:`px-3 py-6 text-[13px] font-medium text-foreground/50`,children:`Nobody here by that name.`}),pe.map(e=>{let r=e.id===`waiting`;return(0,v.jsxs)(`div`,{className:`flex flex-col gap-1.5 min-w-0`,children:[(0,v.jsxs)(`div`,{role:`heading`,"aria-level":4,className:`flex items-center gap-2.5 px-3 text-[13px] font-bold text-foreground/85 leading-tight`,children:[(0,v.jsx)(`span`,{className:`w-7 h-7 rounded-[10px] flex items-center justify-center shrink-0 ${e.id===`user`?`bg-foreground/[0.05] text-foreground/40`:`bg-accent/10 text-accent`}`,children:r?(0,v.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-accent animate-pulse`}):(0,v.jsx)(t.c,{name:s.u(e.id,d),className:`w-3.5 h-3.5`})}),(0,v.jsx)(`span`,{className:`truncate`,children:r?`Waiting for an answer`:n.ha(e.id,d)}),(0,v.jsx)(`span`,{className:`shrink-0 text-[11.5px] font-semibold text-foreground/35 tabular-nums`,children:e.people.length})]}),(0,v.jsx)(`div`,{className:`flex flex-col gap-0.5 min-w-0 ${r?`rounded-2xl border border-accent/20 bg-accent/[0.04] p-1`:``}`,children:e.people.map(e=>{let t=!!E&&J?.id===e.id;return(0,v.jsxs)(`div`,{role:`button`,tabIndex:0,"aria-current":t||void 0,onClick:()=>Y(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),Y(e))},className:`flex items-center gap-3 px-3 py-2.5 rounded-xl transition-colors cursor-pointer outline-none focus-visible:bg-foreground/[0.05] ${t?`bg-accent/[0.09]`:`hover:bg-foreground/[0.035]`} ${e.inactive?`opacity-55`:``}`,children:[(0,v.jsxs)(`span`,{className:`flex flex-col gap-0.5 min-w-0 flex-1`,children:[(0,v.jsx)(`span`,{className:`text-[14px] font-semibold text-foreground leading-tight truncate`,children:p.n(e)}),(0,v.jsx)(`span`,{className:`max-sm:hidden text-[12.5px] text-foreground/45 leading-snug truncate`,children:p.t(e)})]}),!e.inactive&&n.Pr(e)?O?(0,v.jsx)(B,{label:n.ha(n.Pr(e).role,d),icon:s.u(n.Pr(e).role,d),plain:!1,waiting:!0}):(0,v.jsx)(B,{label:xe(e),plain:!1,waiting:!0}):e.inactive?(0,v.jsx)(B,{label:`Off`,plain:!0}):null,O?(0,v.jsx)(a.in,{className:`w-4 h-4 text-foreground/25 shrink-0 -mr-1`}):t&&(0,v.jsx)(a.in,{className:`w-4 h-4 text-accent/70 shrink-0 -mr-0.5`})]},e.id)})})]},e.id)})]}),Fe&&(J?(0,v.jsxs)(`div`,{className:`rounded-2xl border border-[var(--panel-border)]/60 bg-foreground/[0.015] overflow-hidden fbos-fade-in min-w-0`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-3 px-4 sm:px-5 py-4 border-b border-[var(--panel-border)]/50 min-w-0`,children:[$&&(0,v.jsx)(`button`,{type:`button`,onClick:()=>Y(null),"aria-label":`Back to all users`,className:`shrink-0 -ml-1.5 w-8 h-8 flex items-center justify-center rounded-lg text-foreground/45 hover:text-foreground active:bg-foreground/5 transition-colors cursor-pointer`,children:(0,v.jsx)(a.bn,{className:`w-4.5 h-4.5`})}),(0,v.jsx)(`span`,{"aria-hidden":!0,className:`max-sm:hidden w-10 h-10 rounded-2xl flex items-center justify-center shrink-0 border border-[var(--panel-border)]/50 ${J.inactive||Q(J)===`user`?`bg-foreground/[0.04] text-foreground/40`:`bg-accent/10 text-accent`}`,children:(0,v.jsx)(t.c,{name:s.u(Q(J),d),className:`w-5 h-5`})}),(0,v.jsxs)(`div`,{className:`flex flex-col flex-1 min-w-0 gap-0.5`,children:[re?(0,v.jsx)(`input`,{autoFocus:!0,value:ae,"aria-label":`Name`,onChange:e=>oe(e.target.value),onBlur:je,onKeyDown:e=>e.key===`Enter`&&je(),className:`text-[17px] sm:text-[18px] font-bold tracking-tight leading-tight bg-transparent border-b-2 border-accent outline-none text-foreground w-full`}):(0,v.jsx)(`h3`,{onDoubleClick:()=>{Z(J)&&(oe(J.displayName||``),ie(!0))},className:`text-[17px] sm:text-[18px] font-bold tracking-tight leading-tight text-foreground select-none truncate ${Z(J)?`cursor-pointer hover:text-accent transition-colors`:``}`,title:Z(J)?`Double-click to rename`:``,children:p.n(J)}),(0,v.jsx)(`p`,{className:`text-[12.5px] text-foreground/50 leading-snug truncate`,children:p.t(J)})]}),J.inactive&&(0,v.jsx)(`span`,{className:`max-sm:hidden`,children:(0,v.jsx)(B,{label:`Off`,plain:!0})})]}),(0,v.jsxs)(`div`,{className:`flex flex-col gap-5 p-4 sm:p-5`,children:[(()=>{let e=n.Pr(J);if(!e)return null;let t=Se(e.role),r=e.at?new Date(e.at).toLocaleDateString(void 0,{day:`numeric`,month:`short`}):``;return(0,v.jsxs)(`div`,{className:`rounded-xl border border-accent/30 bg-accent/[0.05] px-4 py-3 flex items-center gap-3 flex-wrap`,children:[(0,v.jsxs)(`div`,{className:`flex flex-col gap-0.5 min-w-0 flex-1`,children:[(0,v.jsx)(`span`,{className:`text-[13px] font-bold text-foreground leading-tight`,children:xe(J)}),(0,v.jsx)(`span`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug`,children:t?`${r?`Asked ${r}. `:``}A member until you say otherwise.`:`That role no longer exists — clear the request, or pick them another role below.`})]}),Z(J)&&(0,v.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[t&&(0,v.jsx)(n.o,{icon:a.sn,compact:!0,title:`Approve ${p.n(J)} as ${n.ha(e.role,d)}`,onClick:()=>De(J,e.role),children:`Approve`}),(0,v.jsx)(n.o,{icon:a.o,compact:!0,title:t?`Decline the request`:`Clear the request`,onClick:()=>Oe(J),children:t?`Decline`:`Clear`})]})]})})(),(0,v.jsx)(n.i,{label:`Role`,hint:[we(J),be(J)].filter(Boolean).join(` · `)||void 0,children:(0,v.jsx)(n.nr,{ariaLabel:`Role`,value:Q(J),options:ye,onChange:e=>{let t=ve.find(t=>t.value===e);t&&Ee(J,t.value,t.label)},disabled:!Z(J),className:`console-select`,dense:!0,portal:!0,direction:`auto`})}),X&&!Z(J)&&J.id!==_e?.id&&(0,v.jsxs)(`p`,{className:`-mt-3 flex items-center gap-1.5 px-1 text-[12px] font-medium text-foreground/45`,children:[(0,v.jsx)(a.mt,{className:`w-3 h-3 shrink-0`}),`Admin since before you, so only they can change this account.`]}),(0,v.jsx)(F,{person:J,settings:f.finishRegistration}),(0,v.jsx)(`div`,{className:`pt-5 border-t border-[var(--panel-border)]/50`,children:(0,v.jsx)(n.C,{label:`Can use the app`,hint:J.inactive?`Switched off — every page is closed to them.`:`Switch off to close every page to them.`,hintWideOnly:!0,enabled:!J.inactive,onChange:e=>ke(J,!e),disabled:!Z(J)})}),Z(J)&&(0,v.jsxs)(`div`,{className:`flex items-center justify-between gap-4 pt-5 border-t border-[var(--panel-border)]/50`,children:[(0,v.jsxs)(`div`,{className:`flex flex-col gap-0.5 min-w-0 ml-1`,children:[(0,v.jsx)(`span`,{className:`text-[13px] font-medium text-foreground/80`,children:`Delete this person`}),(0,v.jsx)(`span`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug max-sm:hidden`,children:`Everything about them goes, their sign-in with it. What they made on your pages stays.`})]}),(0,v.jsx)(n.o,{icon:a.C,tone:`danger`,compact:!0,title:`Delete ${p.n(J)}`,onClick:()=>U(J),children:`Delete`})]})]})]}):(0,v.jsx)(`div`,{className:`rounded-2xl border border-dashed border-[var(--panel-border)] min-h-[200px] flex flex-col items-center justify-center gap-3 px-4 text-center`,children:$&&!C?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`p`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug`,children:`This person is not on the list any more.`}),(0,v.jsx)(n.o,{onClick:()=>T(`/users`,{replace:!0}),children:`Back to all users`})]}):(0,v.jsx)(`p`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug`,children:`Pick somebody to see their role.`})}))]})}),X&&(0,v.jsx)(`div`,{hidden:$,children:(0,v.jsx)(D,{roles:d,plans:m})}),X&&(0,v.jsx)(`div`,{hidden:$,children:(0,v.jsx)(A,{roles:d})})]})]}),(0,v.jsx)(u.t,{isOpen:!!H,title:H?`Delete ${p.n(H,`this person`)}?`:``,message:H?M(p.n(H,`this person`)):``,confirmText:`Yes, delete them`,cancelText:`Keep them`,isProcessing:se,onCancel:()=>U(null),onConfirm:()=>H&&Ae(H)})]})}exports.UsersTab=V;