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,595 @@
1
+ import { t as e } from "./PageTitle-D93YCiN8.js";
2
+ import { T as t, cr as n, o as r, sr as i, v as a, x as o } from "./TimeZoneField-DkI1Bkcz.js";
3
+ import { t as s } from "./DashboardNav-Dmn7PVSp.js";
4
+ import { R as c, on as l, qt as u, sn as d } from "./lucide-react-CA7GD7Nv.js";
5
+ import { t as f } from "./Setup-CHLgd-ag.js";
6
+ import { t as p } from "./SupportBar-CN_JGC-9.js";
7
+ import { r as m } from "./serviceStatus-vS8AI7SZ.js";
8
+ import { a as h, c as g, i as _, l as v, n as y, o as b, r as x, t as S, u as C } from "./publishSteps-C1cDFzzB.js";
9
+ import { useState as w } from "react";
10
+ import { Fragment as T, jsx as E, jsxs as D } from "react/jsx-runtime";
11
+ import { Link as O } from "react-router-dom";
12
+ //#region src/pages/PublishApp.tsx
13
+ var k = "text-accent underline underline-offset-2 font-semibold hover:text-accent-deep transition-colors", A = "space-y-2 list-decimal list-inside text-foreground/75 marker:font-bold marker:text-foreground/40";
14
+ function j({ href: e, children: t }) {
15
+ return /* @__PURE__ */ E("a", {
16
+ href: e,
17
+ target: "_blank",
18
+ rel: "noopener noreferrer",
19
+ className: k,
20
+ children: t
21
+ });
22
+ }
23
+ function M({ children: e }) {
24
+ return /* @__PURE__ */ E("h4", {
25
+ className: "text-[12px] font-extrabold uppercase tracking-[0.14em] text-foreground/40 pt-1",
26
+ children: e
27
+ });
28
+ }
29
+ function N({ number: e, title: r, done: a, open: o, onToggle: s, children: c }) {
30
+ let u = /* @__PURE__ */ D(T, { children: [
31
+ /* @__PURE__ */ E("span", {
32
+ className: `w-8 h-8 shrink-0 rounded-full flex items-center justify-center text-[13.5px] font-extrabold border ${a ? "bg-emerald-500/10 border-emerald-500/20 text-emerald-500" : "bg-accent/10 border-accent/20 text-accent"}`,
33
+ children: a ? /* @__PURE__ */ E(d, { className: "w-4 h-4" }) : e
34
+ }),
35
+ /* @__PURE__ */ E("span", {
36
+ className: "flex-1 min-w-0 text-[14.5px] sm:text-[15px] font-bold text-foreground tracking-tight truncate",
37
+ children: r
38
+ }),
39
+ s && /* @__PURE__ */ E(l, { className: `w-4 h-4 shrink-0 text-foreground/40 transition-transform duration-200 ${o ? "rotate-180" : ""}` })
40
+ ] });
41
+ return /* @__PURE__ */ D("div", {
42
+ className: "rounded-2xl border border-[var(--panel-border)]/60 bg-foreground/[0.015] overflow-hidden transition-all",
43
+ children: [s ? /* @__PURE__ */ E("button", {
44
+ type: "button",
45
+ onClick: s,
46
+ "aria-expanded": o,
47
+ className: "w-full px-4 sm:px-5 py-4 flex items-center gap-3 sm:gap-3.5 text-left cursor-pointer hover:bg-foreground/[0.02] transition-colors",
48
+ children: u
49
+ }) : /* @__PURE__ */ E("div", {
50
+ className: "w-full px-4 sm:px-5 py-4 flex items-center gap-3 sm:gap-3.5",
51
+ children: u
52
+ }), /* @__PURE__ */ E(n, {
53
+ initial: !1,
54
+ children: o && /* @__PURE__ */ E(i.div, {
55
+ initial: {
56
+ height: 0,
57
+ opacity: 0
58
+ },
59
+ animate: {
60
+ height: "auto",
61
+ opacity: 1
62
+ },
63
+ exit: {
64
+ height: 0,
65
+ opacity: 0
66
+ },
67
+ transition: t,
68
+ className: "overflow-hidden",
69
+ children: /* @__PURE__ */ E("div", {
70
+ className: "border-t border-[var(--panel-border)]/40 p-4 sm:p-5 flex flex-col gap-4 bg-background/30 text-[13.5px] sm:text-[14px] text-foreground/70 leading-relaxed",
71
+ children: c
72
+ })
73
+ })
74
+ })]
75
+ });
76
+ }
77
+ function P({ label: e, onDone: t, waitingFor: n }) {
78
+ return /* @__PURE__ */ D("div", {
79
+ className: "flex flex-col gap-2 pt-1",
80
+ children: [/* @__PURE__ */ D(i.button, {
81
+ type: "button",
82
+ whileHover: n ? void 0 : { scale: 1.01 },
83
+ whileTap: n ? void 0 : { scale: .99 },
84
+ onClick: t,
85
+ disabled: !!n,
86
+ className: `btn-primary inline-flex items-center justify-center gap-2 h-11 px-5 rounded-[var(--btn-radius,0.75rem)] text-[13px] font-bold text-white self-start max-sm:self-stretch shadow-lg ${n ? "opacity-40 cursor-not-allowed" : "cursor-pointer"}`,
87
+ children: [/* @__PURE__ */ E(d, { className: "w-4 h-4" }), e]
88
+ }), n && /* @__PURE__ */ E("span", {
89
+ className: "text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug",
90
+ children: n
91
+ })]
92
+ });
93
+ }
94
+ function F({ label: e, hint: t, placeholder: n, invalid: i, value: s, clean: c, preview: l, onSave: u }) {
95
+ let [f, p] = w(s), [m, h] = w(!1), [g, _] = w(""), v = c(f), y = f.trim().length > 0, b = v !== s;
96
+ return /* @__PURE__ */ D("div", {
97
+ className: "flex flex-col gap-2",
98
+ children: [/* @__PURE__ */ E(o, {
99
+ label: e,
100
+ hint: t,
101
+ value: f,
102
+ onChange: (e) => {
103
+ p(e), _("");
104
+ },
105
+ placeholder: n,
106
+ error: g,
107
+ action: /* @__PURE__ */ D("div", {
108
+ className: "flex items-center gap-2",
109
+ children: [s && !b && /* @__PURE__ */ E(a, {
110
+ state: "saved",
111
+ label: "Saved"
112
+ }), /* @__PURE__ */ E(r, {
113
+ icon: d,
114
+ onClick: async () => {
115
+ if (!v) {
116
+ _(i);
117
+ return;
118
+ }
119
+ h(!0);
120
+ let e = await u(v);
121
+ h(!1), _(e || ""), e || p(v);
122
+ },
123
+ busy: m,
124
+ disabled: !y || !b && !!s,
125
+ children: "Save"
126
+ })]
127
+ })
128
+ }), v && !g && /* @__PURE__ */ E("div", {
129
+ className: "px-3.5 py-2.5 rounded-xl border border-[var(--panel-border)]/60 bg-background",
130
+ children: /* @__PURE__ */ E("span", {
131
+ className: "text-[12.5px] font-mono text-foreground/60 truncate block",
132
+ children: l(v)
133
+ })
134
+ })]
135
+ });
136
+ }
137
+ function I({ label: e, url: t }) {
138
+ return /* @__PURE__ */ D("div", {
139
+ className: "flex max-sm:flex-col sm:items-center justify-between gap-2 sm:gap-3 px-3.5 py-3 rounded-xl border border-[var(--panel-border)]/60 bg-background",
140
+ children: [/* @__PURE__ */ D("div", {
141
+ className: "min-w-0 flex flex-col gap-0.5",
142
+ children: [/* @__PURE__ */ E("span", {
143
+ className: "text-[11px] font-bold uppercase tracking-[0.14em] text-foreground/40",
144
+ children: e
145
+ }), /* @__PURE__ */ E("span", {
146
+ className: "text-[12.5px] font-mono text-foreground/70 truncate",
147
+ children: t
148
+ })]
149
+ }), /* @__PURE__ */ E(f, {
150
+ compact: !0,
151
+ code: t,
152
+ label: "Copy"
153
+ })]
154
+ });
155
+ }
156
+ var L = [
157
+ "216.239.32.21",
158
+ "216.239.34.21",
159
+ "216.239.36.21",
160
+ "216.239.38.21"
161
+ ];
162
+ function R() {
163
+ let { loading: t, record: n, save: r } = v(), [a, o] = w(null), { status: l } = m(), d = b(n.done, a), k = (e) => d[S.indexOf(e)], R = y(n.appName), z = h(n.domain), B = n.done.length === S.length, V = B && g(l), H = B && !V, U = (e) => {
164
+ o(null), r({ done: C(n.done, e) });
165
+ }, W = (e) => e.open ? e.done ? () => o(null) : void 0 : () => o(e.done ? e.id : null), G = (e) => {
166
+ let t = k(e);
167
+ return {
168
+ done: t.done,
169
+ open: t.open,
170
+ onToggle: W(t)
171
+ };
172
+ };
173
+ return /* @__PURE__ */ D("main", {
174
+ 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",
175
+ children: [/* @__PURE__ */ D(i.div, {
176
+ initial: {
177
+ opacity: 0,
178
+ y: 20
179
+ },
180
+ animate: {
181
+ opacity: 1,
182
+ y: 0
183
+ },
184
+ className: "mb-6",
185
+ children: [/* @__PURE__ */ E(e, { children: "Publish App" }), /* @__PURE__ */ D("div", {
186
+ className: "flex items-center gap-2 text-foreground/40 font-bold uppercase tracking-[0.2em] text-[11px]",
187
+ children: [/* @__PURE__ */ E("span", { className: "w-8 h-[1px] bg-foreground/10" }), "/publish"]
188
+ })]
189
+ }), /* @__PURE__ */ D("div", {
190
+ className: "flex flex-col gap-6 flex-1 pb-16",
191
+ children: [
192
+ /* @__PURE__ */ E(s, {}),
193
+ /* @__PURE__ */ D(i.div, {
194
+ initial: {
195
+ opacity: 0,
196
+ y: 20
197
+ },
198
+ animate: {
199
+ opacity: 1,
200
+ y: 0
201
+ },
202
+ transition: { delay: .1 },
203
+ className: "glass-panel border border-[var(--panel-border)] rounded-3xl p-4 sm:p-6 md:p-8 shadow-2xl relative bg-background flex flex-col fbos-tab-fill",
204
+ children: [/* @__PURE__ */ E("div", {
205
+ className: "mb-6 pb-4 sm:mb-8 sm:pb-6 border-b border-[var(--panel-border)]/50",
206
+ children: /* @__PURE__ */ D("div", {
207
+ className: "min-w-0",
208
+ children: [/* @__PURE__ */ E("h2", {
209
+ className: "text-[17px] sm:text-xl font-bold text-foreground tracking-tight truncate",
210
+ children: "Putting your app in front of people"
211
+ }), /* @__PURE__ */ D("p", {
212
+ className: "text-[13px] font-medium text-foreground/50 mt-1 sm:mt-1.5 leading-snug truncate",
213
+ children: [/* @__PURE__ */ E("span", {
214
+ className: "sm:hidden",
215
+ children: "One step at a time. Stuck? Ask me below."
216
+ }), /* @__PURE__ */ E("span", {
217
+ className: "max-sm:hidden",
218
+ children: "One step at a time — the next one appears as you tick each off. Stuck anywhere? Ask me below."
219
+ })]
220
+ })]
221
+ })
222
+ }), !t && /* @__PURE__ */ D("div", {
223
+ className: "flex flex-col gap-3",
224
+ children: [
225
+ /* @__PURE__ */ D(N, {
226
+ number: 1,
227
+ title: "Publish in AI Studio",
228
+ ...G("published"),
229
+ children: [
230
+ /* @__PURE__ */ D("ol", {
231
+ className: A,
232
+ children: [
233
+ /* @__PURE__ */ D("li", { children: [
234
+ "In ",
235
+ /* @__PURE__ */ E(j, {
236
+ href: "https://aistudio.google.com",
237
+ children: "Google AI Studio"
238
+ }),
239
+ ", click",
240
+ " ",
241
+ /* @__PURE__ */ E("strong", { children: "Publish" }),
242
+ " in the top left corner, then ",
243
+ /* @__PURE__ */ E("strong", { children: "Get started" }),
244
+ "."
245
+ ] }),
246
+ /* @__PURE__ */ D("li", { children: [
247
+ "It asks for an app URL. Type a name for your app —",
248
+ " ",
249
+ /* @__PURE__ */ E("span", {
250
+ className: "text-accent",
251
+ children: "my-ai-project"
252
+ }),
253
+ " — and copy it, you need it again at the bottom of this step."
254
+ ] }),
255
+ /* @__PURE__ */ D("li", { children: [
256
+ "Follow the rest of AI Studio's instructions, then click ",
257
+ /* @__PURE__ */ E("strong", { children: "Publish your app" }),
258
+ "."
259
+ ] })
260
+ ]
261
+ }),
262
+ /* @__PURE__ */ D("p", { children: [
263
+ "If it says ",
264
+ /* @__PURE__ */ E("strong", { children: "Failed to publish app" }),
265
+ ", reload the page, unpublish, and publish again. It usually goes through the second time."
266
+ ] }),
267
+ /* @__PURE__ */ E(F, {
268
+ label: "Your app name",
269
+ hint: "The name you just typed into AI Studio. Saving only keeps it for step 3 — nothing changes in AI Studio, it just says Saved. Pasting the whole address is fine; only the name is kept.",
270
+ placeholder: "my-ai-project",
271
+ invalid: "That does not look like an app name — letters, numbers and dashes.",
272
+ value: n.appName,
273
+ clean: x,
274
+ preview: y,
275
+ onSave: (e) => r({ appName: e })
276
+ }),
277
+ /* @__PURE__ */ E(P, {
278
+ label: "My app is published",
279
+ onDone: () => U("published"),
280
+ waitingFor: n.appName ? void 0 : "Save your app name first — step 3 asks for this address."
281
+ })
282
+ ]
283
+ }),
284
+ k("connected").visible && /* @__PURE__ */ D(N, {
285
+ number: 2,
286
+ title: "Connect your website domain",
287
+ ...G("connected"),
288
+ children: [
289
+ /* @__PURE__ */ D("p", { children: [
290
+ "Your app is live at ",
291
+ /* @__PURE__ */ E("span", {
292
+ className: "font-mono text-foreground/80",
293
+ children: R || "your AI Studio address"
294
+ }),
295
+ " ",
296
+ "already. This step puts it on a domain of your own."
297
+ ] }),
298
+ /* @__PURE__ */ E(M, { children: "Start the mapping" }),
299
+ /* @__PURE__ */ D("ol", {
300
+ className: A,
301
+ children: [
302
+ /* @__PURE__ */ D("li", { children: [
303
+ "Back where you published, click ",
304
+ /* @__PURE__ */ E("strong", { children: "Advanced settings" }),
305
+ ". It takes you to Google Cloud Run."
306
+ ] }),
307
+ /* @__PURE__ */ D("li", { children: [
308
+ "In the menu on the left, open ",
309
+ /* @__PURE__ */ E("strong", { children: "Domain mappings" }),
310
+ ", then",
311
+ " ",
312
+ /* @__PURE__ */ E("strong", { children: "Add mapping" }),
313
+ " at the top."
314
+ ] }),
315
+ /* @__PURE__ */ D("li", { children: [
316
+ "Choose your service, then under ",
317
+ /* @__PURE__ */ E("strong", { children: "Select a verified domain" }),
318
+ " click",
319
+ " ",
320
+ /* @__PURE__ */ E("strong", { children: "Verify new domain" }),
321
+ "."
322
+ ] }),
323
+ /* @__PURE__ */ D("li", { children: [
324
+ "Type your domain — ",
325
+ /* @__PURE__ */ E("span", {
326
+ className: "text-accent",
327
+ children: "myaiproject.com"
328
+ }),
329
+ " — and click",
330
+ " ",
331
+ /* @__PURE__ */ E("strong", { children: "Continue" }),
332
+ ", then ",
333
+ /* @__PURE__ */ E("strong", { children: "Verify in Search Console" }),
334
+ "."
335
+ ] })
336
+ ]
337
+ }),
338
+ /* @__PURE__ */ E(M, { children: "Prove the domain is yours" }),
339
+ /* @__PURE__ */ D("ol", {
340
+ className: A,
341
+ children: [
342
+ /* @__PURE__ */ D("li", { children: [
343
+ "Google Search Console opens. Click ",
344
+ /* @__PURE__ */ E("strong", { children: "Add a website" }),
345
+ ", type the same domain, and click ",
346
+ /* @__PURE__ */ E("strong", { children: "Continue" }),
347
+ "."
348
+ ] }),
349
+ /* @__PURE__ */ D("li", { children: [
350
+ "On the next screen, under ",
351
+ /* @__PURE__ */ D("em", { children: ["Copy the TXT record below into the DNS configuration for ", _(n.domain) || "myaiproject.com"] }),
352
+ ", copy the",
353
+ " ",
354
+ /* @__PURE__ */ E("strong", { children: "TXT record" }),
355
+ " — a long line starting",
356
+ " ",
357
+ /* @__PURE__ */ E("span", {
358
+ className: "font-mono text-foreground/80",
359
+ children: "google-site-verification="
360
+ })
361
+ ] }),
362
+ /* @__PURE__ */ D("li", { children: [
363
+ "Open your domain registrar in another tab — GoDaddy, Namecheap, whoever you bought the domain from — go to its ",
364
+ /* @__PURE__ */ E("strong", { children: "DNS settings" }),
365
+ ", and click",
366
+ " ",
367
+ /* @__PURE__ */ E("strong", { children: "Add record" }),
368
+ ". Choose ",
369
+ /* @__PURE__ */ E("strong", { children: "TXT" }),
370
+ ", paste the line into",
371
+ " ",
372
+ /* @__PURE__ */ E("strong", { children: "Value" }),
373
+ ", and put ",
374
+ /* @__PURE__ */ E("span", {
375
+ className: "font-mono text-foreground/80",
376
+ children: "@"
377
+ }),
378
+ " ",
379
+ "in ",
380
+ /* @__PURE__ */ E("strong", { children: "Host" }),
381
+ " or ",
382
+ /* @__PURE__ */ E("strong", { children: "Name" }),
383
+ ". Save it."
384
+ ] }),
385
+ /* @__PURE__ */ D("li", { children: [
386
+ "Back in Search Console, click ",
387
+ /* @__PURE__ */ E("strong", { children: "Verify" }),
388
+ "."
389
+ ] }),
390
+ /* @__PURE__ */ D("li", { children: [
391
+ "Once it is verified you are done with Search Console — close that tab. Go back to the Google Cloud Run tab (",
392
+ /* @__PURE__ */ E("span", {
393
+ className: "font-mono text-foreground/80",
394
+ children: "console.cloud.google.com"
395
+ }),
396
+ ") where you clicked to verify, and press its ",
397
+ /* @__PURE__ */ E("strong", { children: "refresh" }),
398
+ " button. It should say ",
399
+ /* @__PURE__ */ D("em", { children: [
400
+ "Your ownership of ",
401
+ _(n.domain) || "myaiproject.com",
402
+ " has been successfully verified. You can now map this domain to your Cloud Run services."
403
+ ] })
404
+ ] })
405
+ ]
406
+ }),
407
+ /* @__PURE__ */ E(M, { children: "Point the domain at your app" }),
408
+ /* @__PURE__ */ D("ol", {
409
+ className: A,
410
+ children: [/* @__PURE__ */ D("li", { children: [
411
+ "Add a subdomain if you want one, then click ",
412
+ /* @__PURE__ */ E("strong", { children: "Continue" }),
413
+ ". Cloud Run now shows you the records to add."
414
+ ] }), /* @__PURE__ */ D("li", { children: [
415
+ "Back at your registrar, add each one as an ",
416
+ /* @__PURE__ */ E("strong", { children: "A record" }),
417
+ ", the same way you added the TXT. It is normally these four:"
418
+ ] })]
419
+ }),
420
+ /* @__PURE__ */ D("div", {
421
+ className: "rounded-xl border border-[var(--panel-border)]/60 bg-background overflow-hidden",
422
+ children: [/* @__PURE__ */ D("div", {
423
+ className: "flex items-center justify-between gap-3 px-3.5 py-2.5 border-b border-[var(--panel-border)]/40",
424
+ children: [/* @__PURE__ */ E("span", {
425
+ className: "text-[11px] font-bold uppercase tracking-[0.14em] text-foreground/40",
426
+ children: "A records"
427
+ }), /* @__PURE__ */ E(f, {
428
+ compact: !0,
429
+ code: L.join("\n"),
430
+ label: "Copy all four"
431
+ })]
432
+ }), /* @__PURE__ */ E("div", {
433
+ className: "px-3.5 py-2.5 flex flex-col gap-1",
434
+ children: L.map((e) => /* @__PURE__ */ E("span", {
435
+ className: "text-[12.5px] font-mono text-foreground/70",
436
+ children: e
437
+ }, e))
438
+ })]
439
+ }),
440
+ /* @__PURE__ */ E("p", {
441
+ className: "text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug",
442
+ children: "Use whatever your own Cloud Run screen shows if it differs from these — that screen is always right."
443
+ }),
444
+ /* @__PURE__ */ D("p", { children: [
445
+ "Once they are all in, press ",
446
+ /* @__PURE__ */ E("strong", { children: "Done" }),
447
+ " in Cloud Run and wait — this can take an hour or more. Check every few minutes by typing your domain into any browser, like ",
448
+ /* @__PURE__ */ E("span", {
449
+ className: "text-accent",
450
+ children: "myaiproject.com"
451
+ }),
452
+ ": when your published app comes up, it is connected."
453
+ ] }),
454
+ /* @__PURE__ */ E(F, {
455
+ label: "Your domain",
456
+ hint: "However you have it — with or without https:// and www. Only the domain itself is kept, for step 3.",
457
+ placeholder: "myaiproject.com",
458
+ invalid: "That does not look like a domain — something like myaiproject.com.",
459
+ value: n.domain,
460
+ clean: _,
461
+ preview: h,
462
+ onSave: (e) => r({ domain: e })
463
+ }),
464
+ /* @__PURE__ */ E(P, {
465
+ label: "My domain is verified and my app is connected",
466
+ onDone: () => U("connected"),
467
+ waitingFor: n.domain ? void 0 : "Save your domain first — step 3 asks for this address."
468
+ })
469
+ ]
470
+ }),
471
+ k("authorised").visible && /* @__PURE__ */ D(N, {
472
+ number: 3,
473
+ title: "Add your domains and email sender",
474
+ ...G("authorised"),
475
+ children: [
476
+ /* @__PURE__ */ D("p", { children: [
477
+ "Once your domain answers, head back to the",
478
+ " ",
479
+ /* @__PURE__ */ E(j, {
480
+ href: "https://console.firebase.google.com",
481
+ children: "Firebase console"
482
+ }),
483
+ ". Two jobs, both under ",
484
+ /* @__PURE__ */ E("strong", { children: "Security → Authentication" }),
485
+ "."
486
+ ] }),
487
+ /* @__PURE__ */ E(M, { children: "Authorise both addresses" }),
488
+ /* @__PURE__ */ D("p", { children: [
489
+ "Nobody can sign in from an address Firebase does not know. Open",
490
+ " ",
491
+ /* @__PURE__ */ E("strong", { children: "Security → Authentication → Settings → Authorised domains" }),
492
+ ", click",
493
+ " ",
494
+ /* @__PURE__ */ E("strong", { children: "Add domain" }),
495
+ ", and paste these in one at a time — both need to be there."
496
+ ] }),
497
+ /* @__PURE__ */ D("div", {
498
+ className: "flex flex-col gap-2",
499
+ children: [/* @__PURE__ */ E(I, {
500
+ label: "Your AI Studio address",
501
+ url: R ? `${x(n.appName)}.ai.studio` : "—"
502
+ }), /* @__PURE__ */ E(I, {
503
+ label: "Your own domain",
504
+ url: _(n.domain) || "—"
505
+ })]
506
+ }),
507
+ /* @__PURE__ */ E(M, { children: "Send email from your own domain" }),
508
+ /* @__PURE__ */ D("ol", {
509
+ className: A,
510
+ children: [
511
+ /* @__PURE__ */ D("li", { children: [
512
+ "On the same Authentication page, open the ",
513
+ /* @__PURE__ */ E("strong", { children: "Templates" }),
514
+ " tab. Every email Firebase sends for you lives here — password changes, email verification. You can reword them, but the one thing worth doing is the sender."
515
+ ] }),
516
+ /* @__PURE__ */ D("li", { children: [
517
+ "Click the pencil beside ",
518
+ /* @__PURE__ */ E("strong", { children: "From" }),
519
+ ". It will be something like",
520
+ " ",
521
+ /* @__PURE__ */ E("span", {
522
+ className: "font-mono text-foreground/80",
523
+ children: "noreply@your-project.firebaseapp.com"
524
+ })
525
+ ] }),
526
+ /* @__PURE__ */ D("li", { children: [
527
+ "On the right, click ",
528
+ /* @__PURE__ */ E("strong", { children: "Customise domain" }),
529
+ ", enter your own domain, and follow the steps it gives you — more records at your registrar, same as before."
530
+ ] })
531
+ ]
532
+ }),
533
+ /* @__PURE__ */ E("p", { children: "This is what keeps your emails out of people's spam folders, and it is why they arrive looking like they came from you." }),
534
+ /* @__PURE__ */ E(P, {
535
+ label: "I've added my domains and verified my email domain",
536
+ onDone: () => U("authorised")
537
+ })
538
+ ]
539
+ }),
540
+ V && /* @__PURE__ */ D(N, {
541
+ number: 4,
542
+ title: "Finalise your Stripe live setup",
543
+ done: !1,
544
+ open: !0,
545
+ children: [
546
+ /* @__PURE__ */ E("p", { children: "Your payments are not live yet — still on practice cards, or live without the webhook that sends receipts. Finish Go live on the Payments screen and your setup is complete." }),
547
+ /* @__PURE__ */ D("p", { children: [
548
+ "Switch ",
549
+ /* @__PURE__ */ E("strong", { children: "Go live" }),
550
+ " on and follow its steps. Its webhook step was waiting for your published address, and it is open now that step 3 is ticked."
551
+ ] }),
552
+ /* @__PURE__ */ D(O, {
553
+ to: "/payments",
554
+ className: "btn-primary inline-flex items-center justify-center gap-2 h-11 px-5 rounded-[var(--btn-radius,0.75rem)] text-[13px] font-bold text-white self-start max-sm:self-stretch shadow-lg cursor-pointer",
555
+ children: [/* @__PURE__ */ E(u, { className: "w-4 h-4" }), "Take me to Go live"]
556
+ })
557
+ ]
558
+ }),
559
+ H && /* @__PURE__ */ D("div", {
560
+ className: "mt-3 flex max-sm:flex-col sm:items-center gap-4 sm:gap-6 p-5 sm:p-6 rounded-2xl border border-emerald-500/20 bg-emerald-500/[0.06]",
561
+ children: [/* @__PURE__ */ E("div", {
562
+ className: "w-10 h-10 shrink-0 rounded-2xl flex items-center justify-center border border-emerald-500/20 bg-emerald-500/10 text-emerald-500",
563
+ children: /* @__PURE__ */ E(c, { className: "w-5 h-5" })
564
+ }), /* @__PURE__ */ D("div", {
565
+ className: "min-w-0 flex-1",
566
+ children: [/* @__PURE__ */ E("h3", {
567
+ className: "text-[15px] font-bold text-foreground tracking-tight",
568
+ children: "Your app is live"
569
+ }), /* @__PURE__ */ D("p", {
570
+ className: "text-[13px] text-foreground/60 font-medium leading-relaxed mt-1",
571
+ children: [
572
+ z ? /* @__PURE__ */ D(T, { children: [
573
+ "Anyone can open ",
574
+ /* @__PURE__ */ E(j, {
575
+ href: z,
576
+ children: _(n.domain)
577
+ }),
578
+ " and sign up."
579
+ ] }) : /* @__PURE__ */ E(T, { children: "Anyone can open your app and sign up." }),
580
+ " ",
581
+ "Any step above opens again if you need to check what you typed."
582
+ ]
583
+ })]
584
+ })]
585
+ })
586
+ ]
587
+ })]
588
+ }),
589
+ /* @__PURE__ */ E(p, {})
590
+ ]
591
+ })]
592
+ });
593
+ }
594
+ //#endregion
595
+ export { R as PublishApp };
@@ -0,0 +1,2 @@
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./PageTitle-CZhgmmDT.cjs`),t=require(`./TimeZoneField-qs7NPR30.cjs`),n=require(`./DashboardNav-CXa_ci-_.cjs`),r=require(`./lucide-react-BwV6L6Is.cjs`),i=require(`./Setup-CaDranTm.cjs`),a=require(`./SupportBar-CDT0HwdP.cjs`),o=require(`./serviceStatus-TQyZO_Y_.cjs`),s=require(`./publishSteps-SSm8afDw.cjs`);let c=require(`react`),l=require(`react/jsx-runtime`),u=require(`react-router-dom`);var d=`text-accent underline underline-offset-2 font-semibold hover:text-accent-deep transition-colors`,f=`space-y-2 list-decimal list-inside text-foreground/75 marker:font-bold marker:text-foreground/40`;function p({href:e,children:t}){return(0,l.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,className:d,children:t})}function m({children:e}){return(0,l.jsx)(`h4`,{className:`text-[12px] font-extrabold uppercase tracking-[0.14em] text-foreground/40 pt-1`,children:e})}function h({number:e,title:n,done:i,open:a,onToggle:o,children:s}){let c=(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(`span`,{className:`w-8 h-8 shrink-0 rounded-full flex items-center justify-center text-[13.5px] font-extrabold border ${i?`bg-emerald-500/10 border-emerald-500/20 text-emerald-500`:`bg-accent/10 border-accent/20 text-accent`}`,children:i?(0,l.jsx)(r.sn,{className:`w-4 h-4`}):e}),(0,l.jsx)(`span`,{className:`flex-1 min-w-0 text-[14.5px] sm:text-[15px] font-bold text-foreground tracking-tight truncate`,children:n}),o&&(0,l.jsx)(r.on,{className:`w-4 h-4 shrink-0 text-foreground/40 transition-transform duration-200 ${a?`rotate-180`:``}`})]});return(0,l.jsxs)(`div`,{className:`rounded-2xl border border-[var(--panel-border)]/60 bg-foreground/[0.015] overflow-hidden transition-all`,children:[o?(0,l.jsx)(`button`,{type:`button`,onClick:o,"aria-expanded":a,className:`w-full px-4 sm:px-5 py-4 flex items-center gap-3 sm:gap-3.5 text-left cursor-pointer hover:bg-foreground/[0.02] transition-colors`,children:c}):(0,l.jsx)(`div`,{className:`w-full px-4 sm:px-5 py-4 flex items-center gap-3 sm:gap-3.5`,children:c}),(0,l.jsx)(t.cr,{initial:!1,children:a&&(0,l.jsx)(t.sr.div,{initial:{height:0,opacity:0},animate:{height:`auto`,opacity:1},exit:{height:0,opacity:0},transition:t.T,className:`overflow-hidden`,children:(0,l.jsx)(`div`,{className:`border-t border-[var(--panel-border)]/40 p-4 sm:p-5 flex flex-col gap-4 bg-background/30 text-[13.5px] sm:text-[14px] text-foreground/70 leading-relaxed`,children:s})})})]})}function g({label:e,onDone:n,waitingFor:i}){return(0,l.jsxs)(`div`,{className:`flex flex-col gap-2 pt-1`,children:[(0,l.jsxs)(t.sr.button,{type:`button`,whileHover:i?void 0:{scale:1.01},whileTap:i?void 0:{scale:.99},onClick:n,disabled:!!i,className:`btn-primary inline-flex items-center justify-center gap-2 h-11 px-5 rounded-[var(--btn-radius,0.75rem)] text-[13px] font-bold text-white self-start max-sm:self-stretch shadow-lg ${i?`opacity-40 cursor-not-allowed`:`cursor-pointer`}`,children:[(0,l.jsx)(r.sn,{className:`w-4 h-4`}),e]}),i&&(0,l.jsx)(`span`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug`,children:i})]})}function _({label:e,hint:n,placeholder:i,invalid:a,value:o,clean:s,preview:u,onSave:d}){let[f,p]=(0,c.useState)(o),[m,h]=(0,c.useState)(!1),[g,_]=(0,c.useState)(``),v=s(f),y=f.trim().length>0,b=v!==o;return(0,l.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,l.jsx)(t.x,{label:e,hint:n,value:f,onChange:e=>{p(e),_(``)},placeholder:i,error:g,action:(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[o&&!b&&(0,l.jsx)(t.v,{state:`saved`,label:`Saved`}),(0,l.jsx)(t.o,{icon:r.sn,onClick:async()=>{if(!v){_(a);return}h(!0);let e=await d(v);h(!1),_(e||``),e||p(v)},busy:m,disabled:!y||!b&&!!o,children:`Save`})]})}),v&&!g&&(0,l.jsx)(`div`,{className:`px-3.5 py-2.5 rounded-xl border border-[var(--panel-border)]/60 bg-background`,children:(0,l.jsx)(`span`,{className:`text-[12.5px] font-mono text-foreground/60 truncate block`,children:u(v)})})]})}function v({label:e,url:t}){return(0,l.jsxs)(`div`,{className:`flex max-sm:flex-col sm:items-center justify-between gap-2 sm:gap-3 px-3.5 py-3 rounded-xl border border-[var(--panel-border)]/60 bg-background`,children:[(0,l.jsxs)(`div`,{className:`min-w-0 flex flex-col gap-0.5`,children:[(0,l.jsx)(`span`,{className:`text-[11px] font-bold uppercase tracking-[0.14em] text-foreground/40`,children:e}),(0,l.jsx)(`span`,{className:`text-[12.5px] font-mono text-foreground/70 truncate`,children:t})]}),(0,l.jsx)(i.t,{compact:!0,code:t,label:`Copy`})]})}var y=[`216.239.32.21`,`216.239.34.21`,`216.239.36.21`,`216.239.38.21`];function b(){let{loading:d,record:b,save:x}=s.l(),[S,C]=(0,c.useState)(null),{status:w}=o.r(),T=s.o(b.done,S),E=e=>T[s.t.indexOf(e)],D=s.n(b.appName),O=s.a(b.domain),k=b.done.length===s.t.length,A=k&&s.c(w),j=k&&!A,M=e=>{C(null),x({done:s.u(b.done,e)})},N=e=>e.open?e.done?()=>C(null):void 0:()=>C(e.done?e.id:null),P=e=>{let t=E(e);return{done:t.done,open:t.open,onToggle:N(t)}};return(0,l.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,l.jsxs)(t.sr.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},className:`mb-6`,children:[(0,l.jsx)(e.t,{children:`Publish App`}),(0,l.jsxs)(`div`,{className:`flex items-center gap-2 text-foreground/40 font-bold uppercase tracking-[0.2em] text-[11px]`,children:[(0,l.jsx)(`span`,{className:`w-8 h-[1px] bg-foreground/10`}),`/publish`]})]}),(0,l.jsxs)(`div`,{className:`flex flex-col gap-6 flex-1 pb-16`,children:[(0,l.jsx)(n.t,{}),(0,l.jsxs)(t.sr.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{delay:.1},className:`glass-panel border border-[var(--panel-border)] rounded-3xl p-4 sm:p-6 md:p-8 shadow-2xl relative bg-background flex flex-col fbos-tab-fill`,children:[(0,l.jsx)(`div`,{className:`mb-6 pb-4 sm:mb-8 sm:pb-6 border-b border-[var(--panel-border)]/50`,children:(0,l.jsxs)(`div`,{className:`min-w-0`,children:[(0,l.jsx)(`h2`,{className:`text-[17px] sm:text-xl font-bold text-foreground tracking-tight truncate`,children:`Putting your app in front of people`}),(0,l.jsxs)(`p`,{className:`text-[13px] font-medium text-foreground/50 mt-1 sm:mt-1.5 leading-snug truncate`,children:[(0,l.jsx)(`span`,{className:`sm:hidden`,children:`One step at a time. Stuck? Ask me below.`}),(0,l.jsx)(`span`,{className:`max-sm:hidden`,children:`One step at a time — the next one appears as you tick each off. Stuck anywhere? Ask me below.`})]})]})}),!d&&(0,l.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,l.jsxs)(h,{number:1,title:`Publish in AI Studio`,...P(`published`),children:[(0,l.jsxs)(`ol`,{className:f,children:[(0,l.jsxs)(`li`,{children:[`In `,(0,l.jsx)(p,{href:`https://aistudio.google.com`,children:`Google AI Studio`}),`, click`,` `,(0,l.jsx)(`strong`,{children:`Publish`}),` in the top left corner, then `,(0,l.jsx)(`strong`,{children:`Get started`}),`.`]}),(0,l.jsxs)(`li`,{children:[`It asks for an app URL. Type a name for your app —`,` `,(0,l.jsx)(`span`,{className:`text-accent`,children:`my-ai-project`}),` — and copy it, you need it again at the bottom of this step.`]}),(0,l.jsxs)(`li`,{children:[`Follow the rest of AI Studio's instructions, then click `,(0,l.jsx)(`strong`,{children:`Publish your app`}),`.`]})]}),(0,l.jsxs)(`p`,{children:[`If it says `,(0,l.jsx)(`strong`,{children:`Failed to publish app`}),`, reload the page, unpublish, and publish again. It usually goes through the second time.`]}),(0,l.jsx)(_,{label:`Your app name`,hint:`The name you just typed into AI Studio. Saving only keeps it for step 3 — nothing changes in AI Studio, it just says Saved. Pasting the whole address is fine; only the name is kept.`,placeholder:`my-ai-project`,invalid:`That does not look like an app name — letters, numbers and dashes.`,value:b.appName,clean:s.r,preview:s.n,onSave:e=>x({appName:e})}),(0,l.jsx)(g,{label:`My app is published`,onDone:()=>M(`published`),waitingFor:b.appName?void 0:`Save your app name first — step 3 asks for this address.`})]}),E(`connected`).visible&&(0,l.jsxs)(h,{number:2,title:`Connect your website domain`,...P(`connected`),children:[(0,l.jsxs)(`p`,{children:[`Your app is live at `,(0,l.jsx)(`span`,{className:`font-mono text-foreground/80`,children:D||`your AI Studio address`}),` `,`already. This step puts it on a domain of your own.`]}),(0,l.jsx)(m,{children:`Start the mapping`}),(0,l.jsxs)(`ol`,{className:f,children:[(0,l.jsxs)(`li`,{children:[`Back where you published, click `,(0,l.jsx)(`strong`,{children:`Advanced settings`}),`. It takes you to Google Cloud Run.`]}),(0,l.jsxs)(`li`,{children:[`In the menu on the left, open `,(0,l.jsx)(`strong`,{children:`Domain mappings`}),`, then`,` `,(0,l.jsx)(`strong`,{children:`Add mapping`}),` at the top.`]}),(0,l.jsxs)(`li`,{children:[`Choose your service, then under `,(0,l.jsx)(`strong`,{children:`Select a verified domain`}),` click`,` `,(0,l.jsx)(`strong`,{children:`Verify new domain`}),`.`]}),(0,l.jsxs)(`li`,{children:[`Type your domain — `,(0,l.jsx)(`span`,{className:`text-accent`,children:`myaiproject.com`}),` — and click`,` `,(0,l.jsx)(`strong`,{children:`Continue`}),`, then `,(0,l.jsx)(`strong`,{children:`Verify in Search Console`}),`.`]})]}),(0,l.jsx)(m,{children:`Prove the domain is yours`}),(0,l.jsxs)(`ol`,{className:f,children:[(0,l.jsxs)(`li`,{children:[`Google Search Console opens. Click `,(0,l.jsx)(`strong`,{children:`Add a website`}),`, type the same domain, and click `,(0,l.jsx)(`strong`,{children:`Continue`}),`.`]}),(0,l.jsxs)(`li`,{children:[`On the next screen, under `,(0,l.jsxs)(`em`,{children:[`Copy the TXT record below into the DNS configuration for `,s.i(b.domain)||`myaiproject.com`]}),`, copy the`,` `,(0,l.jsx)(`strong`,{children:`TXT record`}),` — a long line starting`,` `,(0,l.jsx)(`span`,{className:`font-mono text-foreground/80`,children:`google-site-verification=`})]}),(0,l.jsxs)(`li`,{children:[`Open your domain registrar in another tab — GoDaddy, Namecheap, whoever you bought the domain from — go to its `,(0,l.jsx)(`strong`,{children:`DNS settings`}),`, and click`,` `,(0,l.jsx)(`strong`,{children:`Add record`}),`. Choose `,(0,l.jsx)(`strong`,{children:`TXT`}),`, paste the line into`,` `,(0,l.jsx)(`strong`,{children:`Value`}),`, and put `,(0,l.jsx)(`span`,{className:`font-mono text-foreground/80`,children:`@`}),` `,`in `,(0,l.jsx)(`strong`,{children:`Host`}),` or `,(0,l.jsx)(`strong`,{children:`Name`}),`. Save it.`]}),(0,l.jsxs)(`li`,{children:[`Back in Search Console, click `,(0,l.jsx)(`strong`,{children:`Verify`}),`.`]}),(0,l.jsxs)(`li`,{children:[`Once it is verified you are done with Search Console — close that tab. Go back to the Google Cloud Run tab (`,(0,l.jsx)(`span`,{className:`font-mono text-foreground/80`,children:`console.cloud.google.com`}),`) where you clicked to verify, and press its `,(0,l.jsx)(`strong`,{children:`refresh`}),` button. It should say `,(0,l.jsxs)(`em`,{children:[`Your ownership of `,s.i(b.domain)||`myaiproject.com`,` has been successfully verified. You can now map this domain to your Cloud Run services.`]})]})]}),(0,l.jsx)(m,{children:`Point the domain at your app`}),(0,l.jsxs)(`ol`,{className:f,children:[(0,l.jsxs)(`li`,{children:[`Add a subdomain if you want one, then click `,(0,l.jsx)(`strong`,{children:`Continue`}),`. Cloud Run now shows you the records to add.`]}),(0,l.jsxs)(`li`,{children:[`Back at your registrar, add each one as an `,(0,l.jsx)(`strong`,{children:`A record`}),`, the same way you added the TXT. It is normally these four:`]})]}),(0,l.jsxs)(`div`,{className:`rounded-xl border border-[var(--panel-border)]/60 bg-background overflow-hidden`,children:[(0,l.jsxs)(`div`,{className:`flex items-center justify-between gap-3 px-3.5 py-2.5 border-b border-[var(--panel-border)]/40`,children:[(0,l.jsx)(`span`,{className:`text-[11px] font-bold uppercase tracking-[0.14em] text-foreground/40`,children:`A records`}),(0,l.jsx)(i.t,{compact:!0,code:y.join(`
2
+ `),label:`Copy all four`})]}),(0,l.jsx)(`div`,{className:`px-3.5 py-2.5 flex flex-col gap-1`,children:y.map(e=>(0,l.jsx)(`span`,{className:`text-[12.5px] font-mono text-foreground/70`,children:e},e))})]}),(0,l.jsx)(`p`,{className:`text-[11px] sm:text-[11.5px] text-foreground/40 font-medium leading-snug`,children:`Use whatever your own Cloud Run screen shows if it differs from these — that screen is always right.`}),(0,l.jsxs)(`p`,{children:[`Once they are all in, press `,(0,l.jsx)(`strong`,{children:`Done`}),` in Cloud Run and wait — this can take an hour or more. Check every few minutes by typing your domain into any browser, like `,(0,l.jsx)(`span`,{className:`text-accent`,children:`myaiproject.com`}),`: when your published app comes up, it is connected.`]}),(0,l.jsx)(_,{label:`Your domain`,hint:`However you have it — with or without https:// and www. Only the domain itself is kept, for step 3.`,placeholder:`myaiproject.com`,invalid:`That does not look like a domain — something like myaiproject.com.`,value:b.domain,clean:s.i,preview:s.a,onSave:e=>x({domain:e})}),(0,l.jsx)(g,{label:`My domain is verified and my app is connected`,onDone:()=>M(`connected`),waitingFor:b.domain?void 0:`Save your domain first — step 3 asks for this address.`})]}),E(`authorised`).visible&&(0,l.jsxs)(h,{number:3,title:`Add your domains and email sender`,...P(`authorised`),children:[(0,l.jsxs)(`p`,{children:[`Once your domain answers, head back to the`,` `,(0,l.jsx)(p,{href:`https://console.firebase.google.com`,children:`Firebase console`}),`. Two jobs, both under `,(0,l.jsx)(`strong`,{children:`Security → Authentication`}),`.`]}),(0,l.jsx)(m,{children:`Authorise both addresses`}),(0,l.jsxs)(`p`,{children:[`Nobody can sign in from an address Firebase does not know. Open`,` `,(0,l.jsx)(`strong`,{children:`Security → Authentication → Settings → Authorised domains`}),`, click`,` `,(0,l.jsx)(`strong`,{children:`Add domain`}),`, and paste these in one at a time — both need to be there.`]}),(0,l.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,l.jsx)(v,{label:`Your AI Studio address`,url:D?`${s.r(b.appName)}.ai.studio`:`—`}),(0,l.jsx)(v,{label:`Your own domain`,url:s.i(b.domain)||`—`})]}),(0,l.jsx)(m,{children:`Send email from your own domain`}),(0,l.jsxs)(`ol`,{className:f,children:[(0,l.jsxs)(`li`,{children:[`On the same Authentication page, open the `,(0,l.jsx)(`strong`,{children:`Templates`}),` tab. Every email Firebase sends for you lives here — password changes, email verification. You can reword them, but the one thing worth doing is the sender.`]}),(0,l.jsxs)(`li`,{children:[`Click the pencil beside `,(0,l.jsx)(`strong`,{children:`From`}),`. It will be something like`,` `,(0,l.jsx)(`span`,{className:`font-mono text-foreground/80`,children:`noreply@your-project.firebaseapp.com`})]}),(0,l.jsxs)(`li`,{children:[`On the right, click `,(0,l.jsx)(`strong`,{children:`Customise domain`}),`, enter your own domain, and follow the steps it gives you — more records at your registrar, same as before.`]})]}),(0,l.jsx)(`p`,{children:`This is what keeps your emails out of people's spam folders, and it is why they arrive looking like they came from you.`}),(0,l.jsx)(g,{label:`I've added my domains and verified my email domain`,onDone:()=>M(`authorised`)})]}),A&&(0,l.jsxs)(h,{number:4,title:`Finalise your Stripe live setup`,done:!1,open:!0,children:[(0,l.jsx)(`p`,{children:`Your payments are not live yet — still on practice cards, or live without the webhook that sends receipts. Finish Go live on the Payments screen and your setup is complete.`}),(0,l.jsxs)(`p`,{children:[`Switch `,(0,l.jsx)(`strong`,{children:`Go live`}),` on and follow its steps. Its webhook step was waiting for your published address, and it is open now that step 3 is ticked.`]}),(0,l.jsxs)(u.Link,{to:`/payments`,className:`btn-primary inline-flex items-center justify-center gap-2 h-11 px-5 rounded-[var(--btn-radius,0.75rem)] text-[13px] font-bold text-white self-start max-sm:self-stretch shadow-lg cursor-pointer`,children:[(0,l.jsx)(r.qt,{className:`w-4 h-4`}),`Take me to Go live`]})]}),j&&(0,l.jsxs)(`div`,{className:`mt-3 flex max-sm:flex-col sm:items-center gap-4 sm:gap-6 p-5 sm:p-6 rounded-2xl border border-emerald-500/20 bg-emerald-500/[0.06]`,children:[(0,l.jsx)(`div`,{className:`w-10 h-10 shrink-0 rounded-2xl flex items-center justify-center border border-emerald-500/20 bg-emerald-500/10 text-emerald-500`,children:(0,l.jsx)(r.R,{className:`w-5 h-5`})}),(0,l.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,l.jsx)(`h3`,{className:`text-[15px] font-bold text-foreground tracking-tight`,children:`Your app is live`}),(0,l.jsxs)(`p`,{className:`text-[13px] text-foreground/60 font-medium leading-relaxed mt-1`,children:[O?(0,l.jsxs)(l.Fragment,{children:[`Anyone can open `,(0,l.jsx)(p,{href:O,children:s.i(b.domain)}),` and sign up.`]}):(0,l.jsx)(l.Fragment,{children:`Anyone can open your app and sign up.`}),` `,`Any step above opens again if you need to check what you typed.`]})]})]})]})]}),(0,l.jsx)(a.t,{})]})]})}exports.PublishApp=b;