@oneclick.dev/cms-core-modules 0.0.105 → 0.0.107

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 (574) hide show
  1. package/dist/Acquisition-DypEyPSO.js +1 -0
  2. package/dist/Acquisition-TCNX-th6.mjs +308 -0
  3. package/dist/AgendaOpeningHoursCard-BIhm0vpV.js +1 -0
  4. package/dist/AgendaOpeningHoursCard-BKUdJxRI.mjs +133 -0
  5. package/dist/AppointmentDetailsCard-C5rQ5jsW.js +1 -0
  6. package/dist/AppointmentDetailsCard-NRHeNP2L.mjs +111 -0
  7. package/dist/AppointmentEditor-BcF8CiD-.mjs +150 -0
  8. package/dist/AppointmentEditor-BlhFtoCm.js +1 -0
  9. package/dist/AppointmentListTable-B-ReBVtV.js +1 -0
  10. package/dist/AppointmentListTable-DHmy-iid.mjs +129 -0
  11. package/dist/Audience-Cq1Gu-Vo.mjs +394 -0
  12. package/dist/Audience-h5PfXPz4.js +1 -0
  13. package/dist/Components-BehelN4r.js +1 -0
  14. package/dist/Components-CR6zukUU.mjs +468 -0
  15. package/dist/Content-C5Iye3t0.mjs +257 -0
  16. package/dist/Content-eOfBx52Y.js +1 -0
  17. package/dist/ContentEditor-BgL4qEeg.mjs +26835 -0
  18. package/dist/ContentEditor-Tlu3w0Hu.js +462 -0
  19. package/dist/CountryBreakdownCard-CWVyB8be.mjs +151 -0
  20. package/dist/CountryBreakdownCard-Db-pMiNe.js +1 -0
  21. package/dist/Create-B1it8S4m.js +1 -0
  22. package/dist/Create-DbYi0FAI.mjs +907 -0
  23. package/dist/DateFormatter-DLrDYkby.mjs +630 -0
  24. package/dist/DateFormatter-Dni0Oq8r.js +1 -0
  25. package/dist/Detail-D-eahJGO.mjs +21 -0
  26. package/dist/Detail-D0kdPPIm.mjs +2757 -0
  27. package/dist/Detail-DAafePYi.mjs +485 -0
  28. package/dist/Detail-DYpv4fYg.js +1 -0
  29. package/dist/Detail-Dc_ui4LM.js +1 -0
  30. package/dist/Detail-DccUekl_.js +1 -0
  31. package/dist/Detail-Dhz0V0Vf.js +1 -0
  32. package/dist/Detail-DjnGY0F8.mjs +282 -0
  33. package/dist/Detail-DplAitHg.mjs +447 -0
  34. package/dist/Detail-SugyeSxb.js +1 -0
  35. package/dist/DeviceBreakdownCard-CzxZT6To.js +1 -0
  36. package/dist/DeviceBreakdownCard-eEwPjzKl.mjs +115 -0
  37. package/dist/EditLayout-Bnz9q_jd.js +1 -0
  38. package/dist/EditLayout-J_DGXb8v.mjs +99 -0
  39. package/dist/Entries-CgpWg6fE.js +1 -0
  40. package/dist/Entries-CkGTXcAq.mjs +575 -0
  41. package/dist/Find-Bz0TNJzk.mjs +164 -0
  42. package/dist/Find-D-ItTXaZ.js +1 -0
  43. package/dist/GlobalStyling-CSQPF7o_.mjs +1162 -0
  44. package/dist/GlobalStyling-DabldMZh.js +15 -0
  45. package/dist/NewReservationDialog-BhIiY2B9.js +1 -0
  46. package/dist/NewReservationDialog-CN49aGcM.mjs +1002 -0
  47. package/dist/OrderDetailDialog-BJ01DZFe.js +1 -0
  48. package/dist/OrderDetailDialog-CoVQ_rzs.mjs +215 -0
  49. package/dist/Overview-9FMgn5hT.mjs +492 -0
  50. package/dist/Overview-BOOwMQ-c.mjs +636 -0
  51. package/dist/Overview-Biz3h60w.js +1 -0
  52. package/dist/Overview-C2K2ofdS.js +1 -0
  53. package/dist/Overview-CFHOXP9N.mjs +123 -0
  54. package/dist/Overview-CTJe7J5_.js +1 -0
  55. package/dist/Overview-Cvj2i9eW.js +1 -0
  56. package/dist/Overview-D2I1F8Dm.mjs +21 -0
  57. package/dist/Overview-DFOc9emt.mjs +345 -0
  58. package/dist/Overview-Dmhfb94Y.js +1 -0
  59. package/dist/Overview-PPzv7weG.mjs +450 -0
  60. package/dist/Overview-qFKcXHVF.js +1 -0
  61. package/dist/Overview-xkmYYTae.mjs +133 -0
  62. package/dist/Overview-yPsLvR2c.js +1 -0
  63. package/dist/PeakHoursCard-CtgEP-ez.mjs +157 -0
  64. package/dist/PeakHoursCard-DPeoMyhu.js +1 -0
  65. package/dist/ProductDetailsCard-B0WhmzO-.mjs +98 -0
  66. package/dist/ProductDetailsCard-C1ROuH6l.js +1 -0
  67. package/dist/RealtimeCard-DQno-Okz.js +1 -0
  68. package/dist/RealtimeCard-dR-g1iDo.mjs +92 -0
  69. package/dist/ReservationDetailDialog-Cdo6h0RD.mjs +2163 -0
  70. package/dist/ReservationDetailDialog-DZTFD2xI.js +349 -0
  71. package/dist/SearchTermsCard-BXJSXz_k.js +1 -0
  72. package/dist/SearchTermsCard-DsaxLKwP.mjs +146 -0
  73. package/dist/SendPush-Bssi-OZD.mjs +150 -0
  74. package/dist/SendPush-BuaYboRH.js +1 -0
  75. package/dist/SeoHealth-CP-kL0us.js +1 -0
  76. package/dist/SeoHealth-Cxp_Gb3Y.mjs +459 -0
  77. package/dist/TableView-7iwBkQ_k.mjs +4757 -0
  78. package/dist/TableView-BB_oIYYZ.js +4 -0
  79. package/dist/TemplateList-CNcM_Kgq.mjs +56 -0
  80. package/dist/TemplateList-VuPcBUJO.js +1 -0
  81. package/dist/TopPagesCard-CvDECn3_.mjs +117 -0
  82. package/dist/TopPagesCard-DNdATXJE.js +1 -0
  83. package/dist/TrafficSourcesCard-BLpBr7u0.mjs +151 -0
  84. package/dist/TrafficSourcesCard-_3gRUCw3.js +1 -0
  85. package/dist/View-DSnUHI7h.mjs +30 -0
  86. package/dist/View-Dbcfpdqh.js +1 -0
  87. package/dist/VisitorStatsCard-CFEnXSjF.mjs +185 -0
  88. package/dist/VisitorStatsCard-C_jhQxDW.js +1 -0
  89. package/dist/_plugin-vue_export-helper-5u7tqpWC.js +1 -0
  90. package/dist/_plugin-vue_export-helper-BJQSo0im.mjs +8 -0
  91. package/dist/agenda-CzMRcQTA.mjs +989 -0
  92. package/dist/agenda-D4zWRYSQ.js +1 -0
  93. package/dist/appointments-9syR5TZE.js +1 -0
  94. package/dist/appointments-BBmOJMhM.mjs +23 -0
  95. package/dist/array-BH1uH7XT.js +1 -0
  96. package/dist/array-DnDL9cFz.mjs +98 -0
  97. package/dist/availability-CAXB7Yd6.js +1 -0
  98. package/dist/availability-Dp7eF-ZK.mjs +215 -0
  99. package/dist/booking-data-Bysf6e5x.mjs +724 -0
  100. package/dist/booking-data-C6SGjC2X.js +1 -0
  101. package/dist/chunk-DQi1bQcV.js +1 -0
  102. package/dist/cms-core-modules.css +2 -1
  103. package/dist/contentManager-D7JxXCwE.js +1 -0
  104. package/dist/contentManager-tfy0x1LD.mjs +22 -0
  105. package/dist/context-AQKfnJ4t.mjs +3809 -0
  106. package/dist/context-ubyMq9Xe.js +54 -0
  107. package/dist/core-Dhgr4ctC.mjs +202 -0
  108. package/dist/core-_HKfBlaZ.js +1 -0
  109. package/dist/countries-MXLT3mVe.mjs +4 -0
  110. package/dist/countries-OCd5qPxG.js +1 -0
  111. package/dist/create-BfNc2C7N.js +1 -0
  112. package/dist/create-C7JlIlIh.mjs +95 -0
  113. package/dist/custom-BwN9-6Mb.js +1 -0
  114. package/dist/custom-INNwaWla.mjs +13 -0
  115. package/dist/dist-BCVg7FKM.js +1 -0
  116. package/dist/dist-DIhK9VWh.mjs +3045 -0
  117. package/dist/edit-BiI2VG60.js +35 -0
  118. package/dist/edit-DD3iFBEh.mjs +1097 -0
  119. package/dist/exceptions-DICMaDcH.mjs +462 -0
  120. package/dist/exceptions-DpWqMNuG.js +1 -0
  121. package/dist/google-Bcc4XZnV.mjs +4 -0
  122. package/dist/google-DTSRmJ51.js +1 -0
  123. package/dist/googleAnalytics-BSaqRR_L.js +1 -0
  124. package/dist/googleAnalytics-Cg-iWblZ.mjs +47 -0
  125. package/dist/index.cjs.js +1 -1
  126. package/dist/index.mjs +1095 -806
  127. package/dist/interpolation-B8OzkMyi.mjs +131 -0
  128. package/dist/interpolation-DpAqtGOW.js +1 -0
  129. package/dist/lib-4wSi00Vr.js +1 -0
  130. package/dist/lib-BZgXUui5.mjs +198 -0
  131. package/dist/line-DJdnFNI7.js +75 -0
  132. package/dist/line-tYLnEDGV.mjs +1500 -0
  133. package/dist/mailTemplates-BNk8fhVS.mjs +23 -0
  134. package/dist/mailTemplates-DswHzyQe.js +1 -0
  135. package/dist/orders-CIc0JlKX.mjs +512 -0
  136. package/dist/orders-DwPSi_pD.js +1 -0
  137. package/dist/payment-BsNWFaDm.js +1 -0
  138. package/dist/payment-Ced5_dpa.mjs +718 -0
  139. package/dist/productCollections-Cuvw_8zC.js +1 -0
  140. package/dist/productCollections-D0AxRlzr.mjs +23 -0
  141. package/dist/products-DUD-ZMkR.mjs +22 -0
  142. package/dist/products-DvX9B-Ul.js +1 -0
  143. package/dist/promoCodes-BCWqN6w4.mjs +23 -0
  144. package/dist/promoCodes-CEZ4LYot.js +1 -0
  145. package/dist/push-notifications-BGp4XWo9.js +1 -0
  146. package/dist/push-notifications-C7W7KuzR.mjs +23 -0
  147. package/dist/regular-BCFrS6lK.mjs +908 -0
  148. package/dist/regular-DBqPgT8C.js +1 -0
  149. package/dist/resources-DwsMmWgm.mjs +669 -0
  150. package/dist/resources-Dz81GkHe.js +1 -0
  151. package/dist/server-handlers.cjs.js +1 -1
  152. package/dist/server-handlers.mjs +1049 -996
  153. package/dist/shippingOptions-C3NEJff1.mjs +23 -0
  154. package/dist/shippingOptions-Cy040ZW1.js +1 -0
  155. package/dist/single-container-BJmmqq65.mjs +468 -0
  156. package/dist/single-container-Xoo0Xzxv.js +58 -0
  157. package/dist/src/appointments/composables/useHorizontalScroll.d.ts +20 -0
  158. package/dist/src/appointments/index.d.ts +9 -12
  159. package/dist/src/appointments/metadata.d.ts +1 -1
  160. package/dist/src/appointments/routes.d.ts +3 -6
  161. package/dist/src/contentManager/components/content-editor/tiptap-extensions/LockBlocks.d.ts +15 -0
  162. package/dist/src/contentManager/components/content-editor/tiptap-extensions/TrailingNodeInContainers.d.ts +4 -1
  163. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/index.d.ts +12 -132
  164. package/dist/src/contentManager/index.d.ts +5 -14
  165. package/dist/src/contentManager/metadata.d.ts +1 -1
  166. package/dist/src/contentManager/routes.d.ts +3 -12
  167. package/dist/src/custom/index.d.ts +2 -2
  168. package/dist/src/custom/routes.d.ts +1 -1
  169. package/dist/src/googleAnalytics/index.d.ts +10 -10
  170. package/dist/src/googleAnalytics/routes.d.ts +1 -1
  171. package/dist/src/lib/interpolation.d.ts +6 -0
  172. package/dist/src/mailTemplates/index.d.ts +3 -3
  173. package/dist/src/mailTemplates/metadata.d.ts +1 -1
  174. package/dist/src/mailTemplates/routes.d.ts +1 -1
  175. package/dist/src/productCollections/index.d.ts +3 -3
  176. package/dist/src/productCollections/metadata.d.ts +1 -1
  177. package/dist/src/productCollections/routes.d.ts +1 -1
  178. package/dist/src/products/index.d.ts +4 -4
  179. package/dist/src/products/metadata.d.ts +1 -1
  180. package/dist/src/products/routes.d.ts +1 -1
  181. package/dist/src/promoCodes/index.d.ts +3 -3
  182. package/dist/src/promoCodes/metadata.d.ts +1 -1
  183. package/dist/src/promoCodes/routes.d.ts +1 -1
  184. package/dist/src/push-notifications/index.d.ts +3 -3
  185. package/dist/src/push-notifications/metadata.d.ts +1 -1
  186. package/dist/src/push-notifications/routes.d.ts +1 -1
  187. package/dist/src/shippingOptions/index.d.ts +3 -3
  188. package/dist/src/shippingOptions/metadata.d.ts +1 -1
  189. package/dist/src/shippingOptions/routes.d.ts +1 -1
  190. package/dist/src/table/flow-builder-extensions/row-item.d.ts +3 -17
  191. package/dist/src/table/index.d.ts +2 -2
  192. package/dist/src/table/routes.d.ts +1 -1
  193. package/dist/src/types/index.d.ts +6 -0
  194. package/dist/src/vue-shim.d.ts +7 -0
  195. package/dist/table-DWw0fs3S.js +1 -0
  196. package/dist/table-LXt5DQOL.mjs +23 -0
  197. package/dist/utils-CVIHqQsU.js +3 -0
  198. package/dist/utils-h3owcMtS.mjs +37 -0
  199. package/dist/vee-validate-zod-BmXMJo8W.js +1 -0
  200. package/dist/vee-validate-zod-D9dZzbWZ.mjs +4985 -0
  201. package/dist/xy-container-CuQSwrtB.mjs +3180 -0
  202. package/dist/xy-container-_6YpscZh.js +158 -0
  203. package/package.json +55 -55
  204. package/dist/Acquisition-Br1Pfny3.js +0 -1
  205. package/dist/Acquisition-CPlZzUBo.mjs +0 -400
  206. package/dist/AgendaOpeningHoursCard-B7ROIPWw.js +0 -1
  207. package/dist/AgendaOpeningHoursCard-Cp4wxUeK.mjs +0 -172
  208. package/dist/AppointmentDetailsCard-33WpATpV.mjs +0 -161
  209. package/dist/AppointmentDetailsCard-DpLM5IrB.js +0 -1
  210. package/dist/AppointmentEditor-BeOtYV6u.mjs +0 -196
  211. package/dist/AppointmentEditor-CaTfbkIf.js +0 -1
  212. package/dist/AppointmentListTable-DZJNmTMb.mjs +0 -177
  213. package/dist/AppointmentListTable-Dieu9US_.js +0 -1
  214. package/dist/Audience-BfkrmBuQ.js +0 -1
  215. package/dist/Audience-DTblSAiL.mjs +0 -489
  216. package/dist/Components-C83O-xlF.mjs +0 -623
  217. package/dist/Components-DXbx0RLV.js +0 -1
  218. package/dist/Content-BHr_rPVY.js +0 -1
  219. package/dist/Content-CYOZKvWK.mjs +0 -358
  220. package/dist/ContentEditor-B1nfKG_5.mjs +0 -30676
  221. package/dist/ContentEditor-DdFU8piH.js +0 -462
  222. package/dist/CountryBreakdownCard-D7BK3nRD.js +0 -1
  223. package/dist/CountryBreakdownCard-DVxNz2DJ.mjs +0 -196
  224. package/dist/Create-BRBh0xjM.mjs +0 -1247
  225. package/dist/Create-qPeQxkdl.js +0 -1
  226. package/dist/DateFormatter-Bw-87W31.mjs +0 -734
  227. package/dist/DateFormatter-CYAD4GBN.js +0 -1
  228. package/dist/Detail-Byk781b4.mjs +0 -26
  229. package/dist/Detail-C1Blq61w.mjs +0 -585
  230. package/dist/Detail-C857g62L.js +0 -1
  231. package/dist/Detail-C8wQiDcv.js +0 -1
  232. package/dist/Detail-CPqug27l.js +0 -1
  233. package/dist/Detail-CjuhjPby.js +0 -1
  234. package/dist/Detail-CtItxMX4.mjs +0 -649
  235. package/dist/Detail-CujdFApD.mjs +0 -379
  236. package/dist/Detail-Dnpnmy4-.mjs +0 -3477
  237. package/dist/Detail-mvSGbnFU.js +0 -1
  238. package/dist/DeviceBreakdownCard-DRhQ9ufG.js +0 -1
  239. package/dist/DeviceBreakdownCard-W1frLe0L.mjs +0 -159
  240. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs +0 -76
  241. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js +0 -1
  242. package/dist/Entries-BaS6H6ak.js +0 -1
  243. package/dist/Entries-C8UJkrVC.mjs +0 -728
  244. package/dist/Find-B24ZEhYM.mjs +0 -229
  245. package/dist/Find-D4Qa45qC.js +0 -1
  246. package/dist/GlobalStyling-C9VthHWK.mjs +0 -1588
  247. package/dist/GlobalStyling-CnSlXkZc.js +0 -25
  248. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-9Q7TMm4u.mjs +0 -401
  249. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-DiNzGl-q.js +0 -1
  250. package/dist/Overview-3HWhsqaz.mjs +0 -860
  251. package/dist/Overview-BCpJNiEB.mjs +0 -190
  252. package/dist/Overview-BDlBCUI_.js +0 -1
  253. package/dist/Overview-BYMrsZjM.mjs +0 -332
  254. package/dist/Overview-BbvfH1u-.js +0 -1
  255. package/dist/Overview-BrCwozey.js +0 -1
  256. package/dist/Overview-CIa1E-HH.mjs +0 -178
  257. package/dist/Overview-CpHhuiaV.js +0 -1
  258. package/dist/Overview-DAxCu9XC.js +0 -1
  259. package/dist/Overview-D_T3K6aq.mjs +0 -632
  260. package/dist/Overview-Su8ZUbMs.mjs +0 -26
  261. package/dist/Overview-T-lsy3UZ.js +0 -1
  262. package/dist/Overview-kaMhsIUq.mjs +0 -567
  263. package/dist/Overview-t0pG5xjA.js +0 -1
  264. package/dist/PeakHoursCard-9-EZFZLR.mjs +0 -182
  265. package/dist/PeakHoursCard-BR5zmta4.js +0 -1
  266. package/dist/ProductDetailsCard-6nHikw4V.mjs +0 -121
  267. package/dist/ProductDetailsCard-Bn7qrgmc.js +0 -1
  268. package/dist/RealtimeCard--APfRNc8.js +0 -1
  269. package/dist/RealtimeCard-fvQlJcM7.mjs +0 -126
  270. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-Cz_22Oce.mjs +0 -2927
  271. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-DPPNc-Z5.js +0 -349
  272. package/dist/SearchTermsCard-BsB-63aH.js +0 -1
  273. package/dist/SearchTermsCard-BzVrHKqQ.mjs +0 -201
  274. package/dist/SendPush-COns44j7.js +0 -1
  275. package/dist/SendPush-CPIOjVX4.mjs +0 -184
  276. package/dist/SeoHealth-09sEOu3G.js +0 -1
  277. package/dist/SeoHealth-BzcWd_w7.mjs +0 -615
  278. package/dist/TableView-CPAw3h8g.js +0 -4
  279. package/dist/TableView-DXmEF6pY.mjs +0 -6143
  280. package/dist/TemplateList.vue_vue_type_script_setup_true_lang-B_AtWnHa.js +0 -1
  281. package/dist/TemplateList.vue_vue_type_script_setup_true_lang-Cmovy7kk.mjs +0 -40
  282. package/dist/TopPagesCard-BDeA997A.js +0 -1
  283. package/dist/TopPagesCard-CTozhOr_.mjs +0 -159
  284. package/dist/TrafficSourcesCard-BxtCKsqx.mjs +0 -197
  285. package/dist/TrafficSourcesCard-C3ziDTUL.js +0 -1
  286. package/dist/View-CsudjxCE.mjs +0 -30
  287. package/dist/View-Dw_wA6kK.js +0 -1
  288. package/dist/VisitorStatsCard-BmByE_Hi.js +0 -1
  289. package/dist/VisitorStatsCard-CXizEbVK.mjs +0 -174
  290. package/dist/_plugin-vue_export-helper-BHFhmbuH.js +0 -1
  291. package/dist/_plugin-vue_export-helper-CHgC5LLL.mjs +0 -9
  292. package/dist/agenda-BNG05SAq.js +0 -1
  293. package/dist/agenda-D1RxMxBS.mjs +0 -1152
  294. package/dist/array-CbATeQbk.js +0 -1
  295. package/dist/array-CvmZXzxF.mjs +0 -108
  296. package/dist/availability-CMrRa5y2.mjs +0 -269
  297. package/dist/availability-Cf2YfMwM.js +0 -1
  298. package/dist/booking-data-DgJd0BcM.mjs +0 -889
  299. package/dist/booking-data-Di5GmH_8.js +0 -1
  300. package/dist/countries-BTPvmrsb.mjs +0 -4
  301. package/dist/countries-CgZ081No.js +0 -1
  302. package/dist/exceptions-CI0B4xVj.js +0 -1
  303. package/dist/exceptions-vo8SA5SE.mjs +0 -646
  304. package/dist/google-CvtuJwgk.mjs +0 -4
  305. package/dist/google-D4N3gb01.js +0 -1
  306. package/dist/index-4tjmIans.js +0 -1
  307. package/dist/index-9HVlmvK3.js +0 -1
  308. package/dist/index-BWDwEd8D.mjs +0 -24
  309. package/dist/index-BfBBm9uY.mjs +0 -24
  310. package/dist/index-Bkq58CeQ.mjs +0 -22
  311. package/dist/index-BtujSJeg.js +0 -35
  312. package/dist/index-BuzLn4Km.js +0 -54
  313. package/dist/index-C4YUVWzJ.js +0 -75
  314. package/dist/index-CJQQBRLY.js +0 -1
  315. package/dist/index-CMk3uhUt.mjs +0 -3837
  316. package/dist/index-CQkOH2_3.mjs +0 -24
  317. package/dist/index-CSxYBeVA.js +0 -1
  318. package/dist/index-CU-tbS5W.mjs +0 -24
  319. package/dist/index-CZn2nDLv.mjs +0 -34
  320. package/dist/index-CkiNvRzs.js +0 -1
  321. package/dist/index-Co4ON2Di.js +0 -1
  322. package/dist/index-Cpnn_Pxd.mjs +0 -24
  323. package/dist/index-CrgzoTyR.mjs +0 -110
  324. package/dist/index-CsVeM3PA.mjs +0 -24
  325. package/dist/index-CwqrAU-H.js +0 -1
  326. package/dist/index-CxETuRsG.js +0 -1
  327. package/dist/index-Cz-baGax.js +0 -1
  328. package/dist/index-D3L8WAJI.js +0 -58
  329. package/dist/index-DFQGVHTs.js +0 -1
  330. package/dist/index-DPd3waTN.js +0 -1
  331. package/dist/index-DQYBP8Js.js +0 -158
  332. package/dist/index-DRqJOqUR.mjs +0 -3484
  333. package/dist/index-DjDCYQ_6.mjs +0 -441
  334. package/dist/index-DjWuIBxh.js +0 -1
  335. package/dist/index-Dnn2SCSl.js +0 -1
  336. package/dist/index-Dpl9sU6a.mjs +0 -12
  337. package/dist/index-DrXxXB2F.mjs +0 -138
  338. package/dist/index-MYWjg0zi.mjs +0 -176
  339. package/dist/index-R2oUDsjx.js +0 -1
  340. package/dist/index-RLz1QPrf.mjs +0 -203
  341. package/dist/index-UtjLbLw-.js +0 -1
  342. package/dist/index-_2lRVt_k.mjs +0 -2942
  343. package/dist/index-cOnxXTbF.mjs +0 -24
  344. package/dist/index-dOdMm1pV.mjs +0 -1105
  345. package/dist/index-hlylYYgy.mjs +0 -24
  346. package/dist/index-ijdf0d9-.js +0 -1
  347. package/dist/index-p5Uqu8c2.mjs +0 -1438
  348. package/dist/interpolation-DEDSLETn.mjs +0 -128
  349. package/dist/interpolation-DERg6Lwt.js +0 -1
  350. package/dist/orders-CzzcFQha.mjs +0 -559
  351. package/dist/orders-ETtbA4aQ.js +0 -1
  352. package/dist/payment-C3ohkehF.mjs +0 -1080
  353. package/dist/payment-Dfr-Ro-a.js +0 -1
  354. package/dist/regular-1LXNPviB.js +0 -1
  355. package/dist/regular-_05oq5Tx.mjs +0 -1101
  356. package/dist/resources-CxeFd57z.js +0 -1
  357. package/dist/resources-WI_4SO6T.mjs +0 -811
  358. package/dist/src/appointments/chat-components/AgendaOpeningHoursCard.vue.d.ts +0 -15
  359. package/dist/src/appointments/chat-components/AppointmentDetailsCard.vue.d.ts +0 -14
  360. package/dist/src/appointments/chat-components/AppointmentEditor.vue.d.ts +0 -14
  361. package/dist/src/appointments/chat-components/AppointmentListTable.vue.d.ts +0 -14
  362. package/dist/src/appointments/components/create/StepNavigation.vue.d.ts +0 -32
  363. package/dist/src/appointments/components/create/regular/Step1.vue.d.ts +0 -2
  364. package/dist/src/appointments/components/create/regular/Step2.vue.d.ts +0 -2
  365. package/dist/src/appointments/components/create/regular/Step3.vue.d.ts +0 -2
  366. package/dist/src/appointments/components/create/regular/Step4.vue.d.ts +0 -2
  367. package/dist/src/appointments/components/edit/CustomerInformationFieldEditorDialog.vue.d.ts +0 -24
  368. package/dist/src/appointments/components/edit/EditLayout.vue.d.ts +0 -17
  369. package/dist/src/appointments/components/edit/Event24hSidebar.vue.d.ts +0 -2
  370. package/dist/src/appointments/components/edit/EventDialog/ApproveReservationDialog.vue.d.ts +0 -8
  371. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +0 -127
  372. package/dist/src/appointments/components/edit/EventDialog/CancelReservationDialog.vue.d.ts +0 -8
  373. package/dist/src/appointments/components/edit/EventDialog/EventDialog.vue.d.ts +0 -11
  374. package/dist/src/appointments/components/edit/EventDialog/RejectReservationDialog.vue.d.ts +0 -8
  375. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +0 -82
  376. package/dist/src/appointments/components/edit/EventDialog/TimelineChart.vue.d.ts +0 -24
  377. package/dist/src/appointments/components/edit/EventDialog/TransferReservationDialog.vue.d.ts +0 -4
  378. package/dist/src/appointments/components/edit/EventTimeIndicator.vue.d.ts +0 -12
  379. package/dist/src/appointments/components/edit/EventTimeline.vue.d.ts +0 -48
  380. package/dist/src/appointments/components/edit/EventView.vue.d.ts +0 -9
  381. package/dist/src/appointments/components/edit/ExceptionDialog.vue.d.ts +0 -29
  382. package/dist/src/appointments/components/edit/MetadataSchemaEditorDialog.vue.d.ts +0 -12
  383. package/dist/src/appointments/components/edit/NewReservationDialog/NewReservationDialog.vue.d.ts +0 -2
  384. package/dist/src/appointments/components/edit/OrderMetadataDisplay.vue.d.ts +0 -21
  385. package/dist/src/appointments/components/edit/PaymentAddons/Addon.vue.d.ts +0 -22
  386. package/dist/src/appointments/components/edit/PaymentAddons/AddonList.vue.d.ts +0 -5
  387. package/dist/src/appointments/components/edit/PaymentAddons/index.vue.d.ts +0 -15
  388. package/dist/src/appointments/components/edit/ResourceEditorDialog.vue.d.ts +0 -13
  389. package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +0 -110
  390. package/dist/src/appointments/components/edit/dashboard/Timeline.vue.d.ts +0 -34
  391. package/dist/src/appointments/components/edit/dashboard/timeline/ResourceSelector.vue.d.ts +0 -50
  392. package/dist/src/appointments/index.vue.d.ts +0 -22
  393. package/dist/src/appointments/pages/Overview.vue.d.ts +0 -4
  394. package/dist/src/appointments/pages/create/index.vue.d.ts +0 -2
  395. package/dist/src/appointments/pages/create/regular.vue.d.ts +0 -6
  396. package/dist/src/appointments/pages/edit/agenda.vue.d.ts +0 -4
  397. package/dist/src/appointments/pages/edit/availability.vue.d.ts +0 -2
  398. package/dist/src/appointments/pages/edit/booking-data.vue.d.ts +0 -65
  399. package/dist/src/appointments/pages/edit/index.vue.d.ts +0 -2
  400. package/dist/src/appointments/pages/edit/orders.vue.d.ts +0 -98
  401. package/dist/src/appointments/pages/edit/payment.vue.d.ts +0 -2
  402. package/dist/src/appointments/pages/edit/resources.vue.d.ts +0 -28
  403. package/dist/src/contentManager/components/components/ComponentDialog.vue.d.ts +0 -12
  404. package/dist/src/contentManager/components/components/ComponentGridItem.vue.d.ts +0 -16
  405. package/dist/src/contentManager/components/content-editor/ApiDocs.vue.d.ts +0 -2
  406. package/dist/src/contentManager/components/content-editor/ContentLayout.vue.d.ts +0 -49
  407. package/dist/src/contentManager/components/content-editor/ContentSettings.vue.d.ts +0 -24
  408. package/dist/src/contentManager/components/content-editor/ContentStructuredContentSections.vue.d.ts +0 -4
  409. package/dist/src/contentManager/components/content-editor/Header.vue.d.ts +0 -64
  410. package/dist/src/contentManager/components/content-editor/LivePreviewWrapper.vue.d.ts +0 -53
  411. package/dist/src/contentManager/components/content-editor/Locales.vue.d.ts +0 -44
  412. package/dist/src/contentManager/components/content-editor/NewSectionDialog.vue.d.ts +0 -21
  413. package/dist/src/contentManager/components/content-editor/PageSettings.vue.d.ts +0 -2
  414. package/dist/src/contentManager/components/content-editor/SEO.vue.d.ts +0 -14
  415. package/dist/src/contentManager/components/content-editor/SidebarSectionWrapper.vue.d.ts +0 -39
  416. package/dist/src/contentManager/components/content-editor/Status.vue.d.ts +0 -2
  417. package/dist/src/contentManager/components/content-editor/Versions.vue.d.ts +0 -63
  418. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Button.vue.d.ts +0 -94
  419. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Card.vue.d.ts +0 -92
  420. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Column.vue.d.ts +0 -92
  421. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Container.vue.d.ts +0 -92
  422. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Divider.vue.d.ts +0 -92
  423. package/dist/src/contentManager/components/content-editor/tiptap-extensions/EmptySpace.vue.d.ts +0 -94
  424. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Heading.vue.d.ts +0 -92
  425. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Image.vue.d.ts +0 -92
  426. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Map.vue.d.ts +0 -92
  427. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Paragraph.vue.d.ts +0 -92
  428. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Row.vue.d.ts +0 -115
  429. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Stack.vue.d.ts +0 -115
  430. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Video.vue.d.ts +0 -92
  431. package/dist/src/contentManager/components/content-editor/tiptap-extensions/extension-details/DetailsNodeView.vue.d.ts +0 -92
  432. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/NodeLabel.vue.d.ts +0 -108
  433. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/ResizeHandlers.vue.d.ts +0 -20
  434. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/TopMarginDragger.vue.d.ts +0 -104
  435. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuClassBuilder.vue.d.ts +0 -19
  436. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuLinkBuilder.vue.d.ts +0 -19
  437. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuToggleButton.vue.d.ts +0 -29
  438. package/dist/src/contentManager/components/content-editor/tiptap-menus/DefaultBubbleMenu.vue.d.ts +0 -13
  439. package/dist/src/contentManager/components/content-editor/tiptap-menus/ElementEditorMenu.vue.d.ts +0 -19
  440. package/dist/src/contentManager/components/content-editor/tiptap-menus/EmojiMenu.vue.d.ts +0 -8
  441. package/dist/src/contentManager/components/content-editor/tiptap-menus/NewNodeView.vue.d.ts +0 -47
  442. package/dist/src/contentManager/components/content-editor/tiptap-menus/SlashMenu.vue.d.ts +0 -6
  443. package/dist/src/contentManager/components/content-editor/tiptap-menus/SlashMenuButton.vue.d.ts +0 -17
  444. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ButtonMenu.vue.d.ts +0 -13
  445. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/CardMenu.vue.d.ts +0 -13
  446. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ColumnMenu.vue.d.ts +0 -13
  447. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/DividerMenu.vue.d.ts +0 -13
  448. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/EmptySpaceMenu.vue.d.ts +0 -13
  449. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/HeadingMenu.vue.d.ts +0 -13
  450. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ImageMenu.vue.d.ts +0 -13
  451. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/MapMenu.vue.d.ts +0 -13
  452. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/RowMenu.vue.d.ts +0 -13
  453. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/StackMenu.vue.d.ts +0 -13
  454. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/TextMenu.vue.d.ts +0 -13
  455. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/VideoMenu.vue.d.ts +0 -13
  456. package/dist/src/contentManager/components/overview/CollectionDialog.vue.d.ts +0 -30
  457. package/dist/src/contentManager/components/overview/CollectionsGridView.vue.d.ts +0 -18
  458. package/dist/src/contentManager/components/overview/ContentEntryContextMenu.vue.d.ts +0 -27
  459. package/dist/src/contentManager/components/overview/FilterPopover.vue.d.ts +0 -2
  460. package/dist/src/contentManager/components/overview/ListView.vue.d.ts +0 -12
  461. package/dist/src/contentManager/components/styling/ButtonStyleDialog.vue.d.ts +0 -24
  462. package/dist/src/contentManager/components/styling/CardStyleDialog.vue.d.ts +0 -24
  463. package/dist/src/contentManager/components/styling/SectionStyleDialog.vue.d.ts +0 -24
  464. package/dist/src/contentManager/index.vue.d.ts +0 -22
  465. package/dist/src/contentManager/pages/Components.vue.d.ts +0 -27
  466. package/dist/src/contentManager/pages/ContentEditor.vue.d.ts +0 -14
  467. package/dist/src/contentManager/pages/Entries.vue.d.ts +0 -16
  468. package/dist/src/contentManager/pages/GlobalStyling.vue.d.ts +0 -117
  469. package/dist/src/contentManager/pages/Overview.vue.d.ts +0 -57
  470. package/dist/src/custom/index.vue.d.ts +0 -2
  471. package/dist/src/custom/pages/View.vue.d.ts +0 -2
  472. package/dist/src/googleAnalytics/chat-components/CountryBreakdownCard.vue.d.ts +0 -14
  473. package/dist/src/googleAnalytics/chat-components/DeviceBreakdownCard.vue.d.ts +0 -14
  474. package/dist/src/googleAnalytics/chat-components/PeakHoursCard.vue.d.ts +0 -14
  475. package/dist/src/googleAnalytics/chat-components/RealtimeCard.vue.d.ts +0 -14
  476. package/dist/src/googleAnalytics/chat-components/SearchTermsCard.vue.d.ts +0 -14
  477. package/dist/src/googleAnalytics/chat-components/TopPagesCard.vue.d.ts +0 -14
  478. package/dist/src/googleAnalytics/chat-components/TrafficSourcesCard.vue.d.ts +0 -14
  479. package/dist/src/googleAnalytics/chat-components/VisitorStatsCard.vue.d.ts +0 -14
  480. package/dist/src/googleAnalytics/components/seo-health/SeoClicksChart.vue.d.ts +0 -5
  481. package/dist/src/googleAnalytics/components/seo-health/SeoImpressionsChart.vue.d.ts +0 -5
  482. package/dist/src/googleAnalytics/components/seo-health/SeoKeywordsTab.vue.d.ts +0 -5
  483. package/dist/src/googleAnalytics/components/seo-health/SeoKpiCards.vue.d.ts +0 -10
  484. package/dist/src/googleAnalytics/components/seo-health/SeoMappingTab.vue.d.ts +0 -5
  485. package/dist/src/googleAnalytics/components/seo-health/SeoPagesTab.vue.d.ts +0 -5
  486. package/dist/src/googleAnalytics/components/seo-health/SeoRankingDistribution.vue.d.ts +0 -5
  487. package/dist/src/googleAnalytics/index.vue.d.ts +0 -2
  488. package/dist/src/googleAnalytics/pages/Acquisition.vue.d.ts +0 -2
  489. package/dist/src/googleAnalytics/pages/Audience.vue.d.ts +0 -2
  490. package/dist/src/googleAnalytics/pages/Content.vue.d.ts +0 -2
  491. package/dist/src/googleAnalytics/pages/Overview.vue.d.ts +0 -2
  492. package/dist/src/googleAnalytics/pages/SeoHealth.vue.d.ts +0 -2
  493. package/dist/src/mailTemplates/components/TemplateList.vue.d.ts +0 -2
  494. package/dist/src/mailTemplates/index.vue.d.ts +0 -22
  495. package/dist/src/mailTemplates/pages/Detail.vue.d.ts +0 -14
  496. package/dist/src/mailTemplates/pages/Overview.vue.d.ts +0 -14
  497. package/dist/src/productCollections/components/detail/Main.vue.d.ts +0 -2
  498. package/dist/src/productCollections/components/detail/SEO.vue.d.ts +0 -2
  499. package/dist/src/productCollections/components/detail/Status.vue.d.ts +0 -2
  500. package/dist/src/productCollections/components/overview/ListView.vue.d.ts +0 -12
  501. package/dist/src/productCollections/index.vue.d.ts +0 -22
  502. package/dist/src/productCollections/pages/Detail.vue.d.ts +0 -14
  503. package/dist/src/productCollections/pages/Overview.vue.d.ts +0 -16
  504. package/dist/src/products/chat-components/ProductDetailsCard.vue.d.ts +0 -14
  505. package/dist/src/products/components/detail/Collections.vue.d.ts +0 -14
  506. package/dist/src/products/components/detail/Inventory.vue.d.ts +0 -2
  507. package/dist/src/products/components/detail/Main.vue.d.ts +0 -2
  508. package/dist/src/products/components/detail/NewSection.vue.d.ts +0 -2
  509. package/dist/src/products/components/detail/Price.vue.d.ts +0 -2
  510. package/dist/src/products/components/detail/SEO.vue.d.ts +0 -2
  511. package/dist/src/products/components/detail/Shipping.vue.d.ts +0 -2
  512. package/dist/src/products/components/detail/Status.vue.d.ts +0 -2
  513. package/dist/src/products/components/detail/price/UnitPriceDialog.vue.d.ts +0 -17
  514. package/dist/src/products/components/detail/variants/Option.vue.d.ts +0 -33
  515. package/dist/src/products/components/detail/variants/VariantList.vue.d.ts +0 -38
  516. package/dist/src/products/components/overview/FilterPopover.vue.d.ts +0 -2
  517. package/dist/src/products/components/overview/GridView.vue.d.ts +0 -12
  518. package/dist/src/products/components/overview/ListView.vue.d.ts +0 -12
  519. package/dist/src/products/components/overview/ProductContextMenu.vue.d.ts +0 -27
  520. package/dist/src/products/index.vue.d.ts +0 -22
  521. package/dist/src/products/pages/Detail.vue.d.ts +0 -14
  522. package/dist/src/products/pages/Overview.vue.d.ts +0 -16
  523. package/dist/src/promoCodes/components/create/DateRange.vue.d.ts +0 -2
  524. package/dist/src/promoCodes/components/create/MultiCodes.vue.d.ts +0 -2
  525. package/dist/src/promoCodes/components/create/Note.vue.d.ts +0 -2
  526. package/dist/src/promoCodes/components/create/SingleCode.vue.d.ts +0 -2
  527. package/dist/src/promoCodes/components/create/TypeAndValue/TypeDetailDialog.vue.d.ts +0 -6
  528. package/dist/src/promoCodes/components/create/TypeAndValue/TypeManageDialog.vue.d.ts +0 -18
  529. package/dist/src/promoCodes/components/create/TypeAndValue/index.vue.d.ts +0 -2
  530. package/dist/src/promoCodes/index.vue.d.ts +0 -22
  531. package/dist/src/promoCodes/pages/Create.vue.d.ts +0 -16
  532. package/dist/src/promoCodes/pages/Detail.vue.d.ts +0 -14
  533. package/dist/src/promoCodes/pages/Find.vue.d.ts +0 -16
  534. package/dist/src/push-notifications/components/PreviewAndroid.vue.d.ts +0 -28
  535. package/dist/src/push-notifications/components/PreviewIPhone.vue.d.ts +0 -28
  536. package/dist/src/push-notifications/components/PushPreview.vue.d.ts +0 -28
  537. package/dist/src/push-notifications/index.vue.d.ts +0 -22
  538. package/dist/src/push-notifications/pages/SendPush.vue.d.ts +0 -14
  539. package/dist/src/shared/BrandLogo.vue.d.ts +0 -12
  540. package/dist/src/shared/DrawerToggle.vue.d.ts +0 -60
  541. package/dist/src/shared/VerticalToggle.vue.d.ts +0 -60
  542. package/dist/src/shippingOptions/components/detail/Condition.vue.d.ts +0 -2
  543. package/dist/src/shippingOptions/components/detail/Countries.vue.d.ts +0 -2
  544. package/dist/src/shippingOptions/components/detail/Example.vue.d.ts +0 -2
  545. package/dist/src/shippingOptions/components/detail/Main.vue.d.ts +0 -2
  546. package/dist/src/shippingOptions/components/overview/ListView.vue.d.ts +0 -12
  547. package/dist/src/shippingOptions/index.vue.d.ts +0 -22
  548. package/dist/src/shippingOptions/pages/Detail.vue.d.ts +0 -14
  549. package/dist/src/shippingOptions/pages/Overview.vue.d.ts +0 -16
  550. package/dist/src/table/components/DataTable.vue.d.ts +0 -18
  551. package/dist/src/table/components/DataTableAction.vue.d.ts +0 -14
  552. package/dist/src/table/components/DataTableMobileRowActionDrawer.vue.d.ts +0 -4
  553. package/dist/src/table/components/DataTablePagination.vue.d.ts +0 -6
  554. package/dist/src/table/components/actions/ActionDialog.vue.d.ts +0 -19
  555. package/dist/src/table/components/actions/CtaActionDialog.vue.d.ts +0 -4
  556. package/dist/src/table/components/columns/ColumnDropdown.vue.d.ts +0 -2
  557. package/dist/src/table/components/columns/ColumnEditorDialog.vue.d.ts +0 -34
  558. package/dist/src/table/components/columns/DialogTableColumnItem.vue.d.ts +0 -12
  559. package/dist/src/table/components/date-range-filter/DateRangeFilter.vue.d.ts +0 -2
  560. package/dist/src/table/components/date-range-filter/DateRangeSettingsDialog.vue.d.ts +0 -27
  561. package/dist/src/table/components/filters/FilterDialog.vue.d.ts +0 -12
  562. package/dist/src/table/components/filters/Filters.vue.d.ts +0 -27
  563. package/dist/src/table/components/search/Search.vue.d.ts +0 -2
  564. package/dist/src/table/components/sort/SortMode.vue.d.ts +0 -2
  565. package/dist/src/table/components/sort/SortModeSettingsDialog.vue.d.ts +0 -18
  566. package/dist/src/table/components/stats/StatDialog.vue.d.ts +0 -12
  567. package/dist/src/table/components/stats/Stats.vue.d.ts +0 -27
  568. package/dist/src/table/flow-builder-extensions/TableRowEditor.vue.d.ts +0 -16
  569. package/dist/src/table/index.vue.d.ts +0 -22
  570. package/dist/src/table/pages/TableView.vue.d.ts +0 -54
  571. package/dist/utils-CanmrIWO.mjs +0 -47
  572. package/dist/utils-Yd6F5mea.js +0 -3
  573. package/dist/vee-validate-zod-ByykgYKJ.js +0 -1
  574. package/dist/vee-validate-zod-CcOwoF6y.mjs +0 -4402
@@ -0,0 +1 @@
1
+ require(`./chunk-DQi1bQcV.js`);const e=require(`./EditLayout-Bnz9q_jd.js`),t=require(`./core-_HKfBlaZ.js`);let n=require(`@oneclick.dev/cms-kit`),r=require(`vue`),i=require(`@lucide/vue`);var a={class:`space-y-5 py-4`},o={class:`flex flex-wrap gap-2 mt-2`},s=[`onClick`],c={class:`space-y-2`},l={class:`flex items-center justify-between mb-2`},u={class:`text-sm font-medium`},d={class:`flex items-center gap-1`},f={class:`space-y-2`},p={key:0,class:`text-sm text-muted-foreground italic py-1`},m={class:`flex items-center justify-between rounded-lg border p-4`},h={class:`space-y-0.5`},g={class:`text-xs text-muted-foreground`},_={class:`w-full flex justify-between items-center gap-4 flex-col @sm/dialog-footer:flex-row`},v={class:`flex items-center gap-2 ml-auto w-full @sm/dialog-footer:w-auto flex-col-reverse @sm/dialog-footer:flex-row`},y=(0,r.defineComponent)({__name:`ResourceEditorDialog`,emits:[`add-resource`,`update-resource`,`remove-resource`],setup(e,{expose:t,emit:n}){let y=n,b=(0,r.ref)(!1),x=(0,r.ref)(`add`),S=[`#ef4444`,`#f97316`,`#f59e0b`,`#eab308`,`#84cc16`,`#22c55e`,`#10b981`,`#14b8a6`,`#06b6d4`,`#0ea5e9`,`#3b82f6`,`#6366f1`,`#8b5cf6`,`#a855f7`,`#d946ef`,`#ec4899`,`#f43f5e`],C=[{value:1,label:`Monday`},{value:2,label:`Tuesday`},{value:3,label:`Wednesday`},{value:4,label:`Thursday`},{value:5,label:`Friday`},{value:6,label:`Saturday`},{value:0,label:`Sunday`}],w=(0,r.reactive)({id:``,name:``,publicLabel:``,avatarLabel:``,description:``,capacity:1,interval:30,openingHours:{0:[],1:[{start:`09:00`,end:`17:00`}],2:[{start:`09:00`,end:`17:00`}],3:[{start:`09:00`,end:`17:00`}],4:[{start:`09:00`,end:`17:00`}],5:[{start:`09:00`,end:`17:00`}],6:[]},color:`blue`,isActive:!0}),T=e=>{x.value=e?`edit`:`add`,w.id=e?.id||``,w.name=e?.name||``,w.publicLabel=e?.publicLabel||``,w.avatarLabel=e?.avatarLabel||``,w.description=e?.description||``,w.capacity=e?.capacity||1,w.interval=e?.interval||30,w.openingHours=e?.openingHours||{0:[],1:[{start:`09:00`,end:`17:00`}],2:[{start:`09:00`,end:`17:00`}],3:[{start:`09:00`,end:`17:00`}],4:[{start:`09:00`,end:`17:00`}],5:[{start:`09:00`,end:`17:00`}],6:[]},w.color=e?.color||`blue`,w.isActive=e?.isActive===void 0?!0:e.isActive,b.value=!0},E=()=>{b.value=!1},D=()=>{y(`add-resource`,{...w}),b.value=!1},O=()=>{y(`update-resource`,{...w}),b.value=!1},k=()=>{y(`remove-resource`,w.id),b.value=!1},A=(0,r.computed)(()=>w.name.trim().length>0),j=e=>{w.openingHours[e]||(w.openingHours[e]=[]),w.openingHours[e].push({start:`09:00`,end:`17:00`})},M=(e,t)=>{w.openingHours[e].splice(t,1)},ee=e=>{let t=w.openingHours[e];C.forEach(e=>{w.openingHours[e.value]=JSON.parse(JSON.stringify(t))})},te=e=>{w.openingHours[e]=[]};return t({openDialog:T}),(e,t)=>{let n=(0,r.resolveComponent)(`DialogTitle`),y=(0,r.resolveComponent)(`DialogDescription`),T=(0,r.resolveComponent)(`DialogHeader`),N=(0,r.resolveComponent)(`Label`),P=(0,r.resolveComponent)(`Input`),F=(0,r.resolveComponent)(`NumberFieldDecrement`),I=(0,r.resolveComponent)(`NumberFieldInput`),L=(0,r.resolveComponent)(`NumberFieldIncrement`),R=(0,r.resolveComponent)(`NumberFieldContent`),z=(0,r.resolveComponent)(`NumberField`),B=(0,r.resolveComponent)(`SelectValue`),V=(0,r.resolveComponent)(`SelectTrigger`),H=(0,r.resolveComponent)(`SelectItem`),U=(0,r.resolveComponent)(`SelectContent`),W=(0,r.resolveComponent)(`Select`),G=(0,r.resolveComponent)(`Button`),K=(0,r.resolveComponent)(`DropdownMenuTrigger`),q=(0,r.resolveComponent)(`DropdownMenuItem`),J=(0,r.resolveComponent)(`DropdownMenuContent`),Y=(0,r.resolveComponent)(`DropdownMenu`),X=(0,r.resolveComponent)(`Textarea`),Z=(0,r.resolveComponent)(`Switch`),Q=(0,r.resolveComponent)(`DialogFooter`),$=(0,r.resolveComponent)(`DialogScrollContent`),ne=(0,r.resolveComponent)(`Dialog`);return(0,r.openBlock)(),(0,r.createBlock)(ne,{open:b.value,"onUpdate:open":t[7]||=e=>b.value=e},{default:(0,r.withCtx)(()=>[(0,r.createVNode)($,{class:`sm:max-w-xl lg:max-w-2xl`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(T,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(n,null,{default:(0,r.withCtx)(()=>[(0,r.createTextVNode)((0,r.toDisplayString)(x.value===`add`?`Add New Resource`:`Edit Resource`),1)]),_:1}),(0,r.createVNode)(y,null,{default:(0,r.withCtx)(()=>[(0,r.createTextVNode)((0,r.toDisplayString)(x.value===`add`?`Define a new bookable resource such as staff member, room, or equipment.`:`Update the details of this resource.`),1)]),_:1})]),_:1}),(0,r.createElementVNode)(`div`,a,[(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-name`},{default:(0,r.withCtx)(()=>[...t[8]||=[(0,r.createTextVNode)(` Resource Name `,-1),(0,r.createElementVNode)(`span`,{class:`text-destructive`},`*`,-1)]]),_:1}),(0,r.createVNode)(P,{modelValue:w.name,"onUpdate:modelValue":t[0]||=e=>w.name=e,id:`resource-name`,placeholder:`e.g., James, Box 1, Meeting Room A`},null,8,[`modelValue`]),t[9]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` Internal name visible to your team. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-public-label`},{default:(0,r.withCtx)(()=>[...t[10]||=[(0,r.createTextVNode)(` Public Label `,-1)]]),_:1}),(0,r.createVNode)(P,{modelValue:w.publicLabel,"onUpdate:modelValue":t[1]||=e=>w.publicLabel=e,id:`resource-public-label`,placeholder:`Name shown to customers`},null,8,[`modelValue`]),t[11]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` If empty, the internal name will be displayed to customers. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-avatar-label`},{default:(0,r.withCtx)(()=>[...t[12]||=[(0,r.createTextVNode)(` Avatar Label `,-1)]]),_:1}),(0,r.createVNode)(P,{modelValue:w.avatarLabel,"onUpdate:modelValue":t[2]||=e=>w.avatarLabel=e,id:`resource-avatar-label`,placeholder:`e.g., B1, 1, JD`,maxlength:`3`},null,8,[`modelValue`]),t[13]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` Short text shown in the colored circle (max 3 characters). If empty, first letter of name is used. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`},{default:(0,r.withCtx)(()=>[...t[14]||=[(0,r.createTextVNode)(`Color`,-1)]]),_:1}),(0,r.createElementVNode)(`div`,o,[((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(S,e=>(0,r.createElementVNode)(`button`,{key:e,type:`button`,class:(0,r.normalizeClass)([`size-7 rounded-full transition-all ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,[w.color===e?`ring-2 ring-ring ring-offset-2`:`hover:scale-110`]]),style:(0,r.normalizeStyle)({background:e}),onClick:t=>w.color=e},null,14,s)),64))]),t[15]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-2`},` Used for visual identification in the calendar. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-capacity`},{default:(0,r.withCtx)(()=>[...t[16]||=[(0,r.createTextVNode)(` Capacity `,-1)]]),_:1}),(0,r.createVNode)(z,{id:`resource-capacity`,modelValue:w.capacity,"onUpdate:modelValue":t[3]||=e=>w.capacity=e,min:1,max:999},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(R,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(F),(0,r.createVNode)(I),(0,r.createVNode)(L)]),_:1})]),_:1},8,[`modelValue`]),t[17]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` Maximum simultaneous bookings allowed for this resource. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-interval`},{default:(0,r.withCtx)(()=>[...t[18]||=[(0,r.createTextVNode)(` Booking Interval `,-1)]]),_:1}),(0,r.createVNode)(W,{modelValue:w.interval,"onUpdate:modelValue":t[4]||=e=>w.interval=e,modelModifiers:{number:!0}},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(V,{id:`resource-interval`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(B,{placeholder:`Select interval`})]),_:1}),(0,r.createVNode)(U,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(H,{value:5},{default:(0,r.withCtx)(()=>[...t[19]||=[(0,r.createTextVNode)(`5 minutes`,-1)]]),_:1}),(0,r.createVNode)(H,{value:10},{default:(0,r.withCtx)(()=>[...t[20]||=[(0,r.createTextVNode)(`10 minutes`,-1)]]),_:1}),(0,r.createVNode)(H,{value:15},{default:(0,r.withCtx)(()=>[...t[21]||=[(0,r.createTextVNode)(`15 minutes`,-1)]]),_:1}),(0,r.createVNode)(H,{value:30},{default:(0,r.withCtx)(()=>[...t[22]||=[(0,r.createTextVNode)(`30 minutes`,-1)]]),_:1}),(0,r.createVNode)(H,{value:60},{default:(0,r.withCtx)(()=>[...t[23]||=[(0,r.createTextVNode)(`1 hour`,-1)]]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t[24]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` Time slots will be generated at this interval within operating hours. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-2 flex items-center gap-2`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Clock),{class:`w-4 h-4`}),t[25]||=(0,r.createTextVNode)(` Operating Hours `,-1)]),_:1}),(0,r.createElementVNode)(`div`,c,[((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(C,e=>(0,r.createElementVNode)(`div`,{key:e.value,class:`rounded-md bg-muted/30 p-2 sm:p-3`},[(0,r.createElementVNode)(`div`,l,[(0,r.createElementVNode)(`span`,u,(0,r.toDisplayString)(e.label),1),(0,r.createElementVNode)(`div`,d,[(0,r.createVNode)(G,{variant:`outline`,size:`sm`,class:`h-7 px-2 text-xs`,onClick:t=>j(e.value)},{default:(0,r.withCtx)(()=>[...t[26]||=[(0,r.createTextVNode)(` Add `,-1)]]),_:1},8,[`onClick`]),(0,r.createVNode)(Y,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(K,{"as-child":``},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(G,{variant:`ghost`,size:`icon`,class:`size-7`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.MoreHorizontal),{class:`w-4 h-4`})]),_:1})]),_:1}),(0,r.createVNode)(J,{align:`end`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(q,{onClick:t=>ee(e.value)},{default:(0,r.withCtx)(()=>[...t[27]||=[(0,r.createTextVNode)(` Copy to all days `,-1)]]),_:1},8,[`onClick`]),(0,r.createVNode)(q,{onClick:t=>te(e.value),variant:`destructive`},{default:(0,r.withCtx)(()=>[...t[28]||=[(0,r.createTextVNode)(` Set as closed `,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)])]),(0,r.createElementVNode)(`div`,f,[w.openingHours[e.value]?.length===0?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,p,` Closed `)):(0,r.createCommentVNode)(``,!0),((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(w.openingHours[e.value],(n,a)=>((0,r.openBlock)(),(0,r.createElementBlock)(`div`,{key:a,class:`flex items-center gap-1.5 sm:gap-2`},[(0,r.createVNode)(P,{modelValue:n.start,"onUpdate:modelValue":e=>n.start=e,type:`time`,class:`flex-1 min-w-0 h-8 text-sm`},null,8,[`modelValue`,`onUpdate:modelValue`]),t[29]||=(0,r.createElementVNode)(`span`,{class:`text-muted-foreground text-xs sm:text-sm shrink-0`},`to`,-1),(0,r.createVNode)(P,{modelValue:n.end,"onUpdate:modelValue":e=>n.end=e,type:`time`,class:`flex-1 min-w-0 h-8 text-sm`},null,8,[`modelValue`,`onUpdate:modelValue`]),(0,r.createVNode)(G,{variant:`ghost`,size:`icon`,class:`size-7 shrink-0`,onClick:t=>M(e.value,a)},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Trash2),{class:`w-3.5 h-3.5 text-destructive`})]),_:1},8,[`onClick`])]))),128))])])),64))]),t[30]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-2`},` Define when this resource is available. You can add multiple time ranges per day for split shifts. `,-1)]),(0,r.createElementVNode)(`div`,null,[(0,r.createVNode)(N,{class:`text-sm font-normal mb-1.5`,for:`resource-description`},{default:(0,r.withCtx)(()=>[...t[31]||=[(0,r.createTextVNode)(` Description `,-1)]]),_:1}),(0,r.createVNode)(X,{modelValue:w.description,"onUpdate:modelValue":t[5]||=e=>w.description=e,id:`resource-description`,placeholder:`Internal notes about this resource...`,rows:`3`},null,8,[`modelValue`]),t[32]||=(0,r.createElementVNode)(`p`,{class:`text-xs text-muted-foreground mt-1`},` Admin-only notes. Not shown to customers. `,-1)]),(0,r.createElementVNode)(`div`,m,[(0,r.createElementVNode)(`div`,h,[(0,r.createVNode)(N,{class:`text-sm font-medium`},{default:(0,r.withCtx)(()=>[...t[33]||=[(0,r.createTextVNode)(`Active`,-1)]]),_:1}),(0,r.createElementVNode)(`p`,g,(0,r.toDisplayString)(w.isActive?`Resource can be used for new slots and bookings.`:`Existing bookings stay, but no new ones can be created.`),1)]),(0,r.createVNode)(Z,{modelValue:w.isActive,"onUpdate:modelValue":t[6]||=e=>w.isActive=e},null,8,[`modelValue`])])]),(0,r.createVNode)(Q,{class:`@container/dialog-footer gap-2`},{default:(0,r.withCtx)(()=>[(0,r.createElementVNode)(`div`,_,[x.value===`edit`?((0,r.openBlock)(),(0,r.createBlock)(G,{key:0,variant:`destructive`,onClick:k,class:`w-full @sm/dialog-footer:w-auto`},{default:(0,r.withCtx)(()=>[...t[34]||=[(0,r.createTextVNode)(` Delete Resource `,-1)]]),_:1})):(0,r.createCommentVNode)(``,!0),(0,r.createElementVNode)(`div`,v,[(0,r.createVNode)(G,{variant:`outline`,onClick:E,class:`w-full @sm/dialog-footer:w-auto`},{default:(0,r.withCtx)(()=>[...t[35]||=[(0,r.createTextVNode)(` Cancel `,-1)]]),_:1}),x.value===`add`?((0,r.openBlock)(),(0,r.createBlock)(G,{key:0,onClick:D,disabled:!A.value,class:`w-full @sm/dialog-footer:w-auto`},{default:(0,r.withCtx)(()=>[...t[36]||=[(0,r.createTextVNode)(` Add Resource `,-1)]]),_:1},8,[`disabled`])):((0,r.openBlock)(),(0,r.createBlock)(G,{key:1,onClick:O,disabled:!A.value,class:`w-full @sm/dialog-footer:w-auto`},{default:(0,r.withCtx)(()=>[...t[37]||=[(0,r.createTextVNode)(` Save Changes `,-1)]]),_:1},8,[`disabled`]))])])]),_:1})]),_:1})]),_:1},8,[`open`])}}}),b={class:`@container/resources`},x={class:`flex flex-col @lg/resources:flex-row @lg/resources:items-center @lg/resources:justify-between gap-4 mb-6`},S={class:`space-y-6`},C={key:0,class:`flex flex-col @md/resources:flex-row gap-4 items-start @md/resources:items-center justify-between`},w={class:`relative w-full @md/resources:w-64`},T={class:`text-sm text-muted-foreground`},E={key:1,class:`grid grid-cols-1 @2xl/resources:grid-cols-2 @4xl/resources:grid-cols-3 gap-4`},D={class:`p-4 pl-5`},O={class:`flex items-start gap-3`},k={class:`flex-1 min-w-0`},A={class:`flex items-center gap-2`},j={class:`font-semibold truncate text-base`},M={key:0},ee={key:0,class:`text-sm text-muted-foreground truncate`},te={key:0,class:`text-sm text-muted-foreground mt-3 line-clamp-2`},N={class:`flex items-center flex-wrap gap-3 mt-4 pt-3 border-t`},P={class:`flex items-center gap-1.5 text-xs text-muted-foreground`},F={class:`flex items-center gap-1.5 text-xs text-muted-foreground`},I={class:`flex items-center gap-2`},L={class:`text-xs text-muted-foreground`},R={key:1,class:`flex items-center gap-1.5 text-xs text-orange-500`},z={key:2,class:`text-center py-8 text-muted-foreground`},B={key:3,class:`flex justify-center py-12`},V={key:5,class:`fixed bottom-4 right-4 bg-background border rounded-lg px-4 py-2 shadow-lg flex items-center gap-2`},H=(0,r.defineComponent)({__name:`resources`,setup(a){let{width:o}=t.n(),{params:s}=(0,n.useModuleRoute)(),{confirm:c}=(0,n.useConfirmation)(),{config:l}=(0,n.useModule)(),u=(0,n.useFirebaseIntegration)(l.project),d=(0,r.ref)([]),f=(0,r.ref)(!1),p=(0,r.ref)(!0),m=(0,r.ref)(),h=(0,r.ref)(``),g=()=>Date.now().toString(36)+Math.random().toString(36).substr(2),_=async()=>{try{p.value=!0,d.value=(await u.get(l.agendaCollection,s.value.id)).resources||[]}catch(e){console.error(`Error loading resources:`,e)}finally{p.value=!1}},v=async()=>{f.value=!0;try{await u.update(l.agendaCollection,s.value.id,{resources:d.value})}catch(e){console.error(`Error saving resources:`,e)}finally{f.value=!1}},H=e=>{let t={...e,id:g()};d.value.push(t),v()},U=e=>{let t=d.value.findIndex(t=>t.id===e.id);t!==-1&&(d.value[t]=e),v()},W=async e=>{await c(`Are you sure you want to delete this resource? This action cannot be undone.`,`Delete Resource`,`Delete`)&&(d.value=d.value.filter(t=>t.id!==e),v())},G=async e=>{let t=d.value.findIndex(t=>t.id===e.id);t!==-1&&(d.value[t].isActive=!d.value[t].isActive,await v())},K=e=>{let t={...e,id:g(),name:`${e.name} (Copy)`,publicLabel:e.publicLabel?`${e.publicLabel} (Copy)`:``};d.value.push(t),v()},q=()=>{m.value?.openDialog()},J=e=>{m.value?.openDialog(e)},Y=(0,r.computed)(()=>{if(!h.value.trim())return d.value;let e=h.value.toLowerCase();return d.value.filter(t=>t.name.toLowerCase().includes(e)||t.publicLabel?.toLowerCase().includes(e))}),X=(0,r.computed)(()=>d.value.filter(e=>e.isActive).length),Z=(0,r.computed)(()=>d.value.length);return _(),(t,n)=>{let a=(0,r.resolveComponent)(`Button`),s=(0,r.resolveComponent)(`Input`),c=(0,r.resolveComponent)(`DropdownMenuTrigger`),l=(0,r.resolveComponent)(`DropdownMenuItem`),u=(0,r.resolveComponent)(`DropdownMenuSeparator`),g=(0,r.resolveComponent)(`DropdownMenuContent`),_=(0,r.resolveComponent)(`DropdownMenu`),v=(0,r.resolveComponent)(`Switch`),Q=(0,r.resolveComponent)(`Card`),$=(0,r.resolveComponent)(`Spinner`),ne=(0,r.resolveComponent)(`EmptyMedia`),re=(0,r.resolveComponent)(`EmptyTitle`),ie=(0,r.resolveComponent)(`EmptyDescription`),ae=(0,r.resolveComponent)(`EmptyHeader`),oe=(0,r.resolveComponent)(`EmptyContent`),se=(0,r.resolveComponent)(`Empty`);return(0,r.openBlock)(),(0,r.createBlock)(e.t,null,{default:(0,r.withCtx)(()=>[(0,r.createElementVNode)(`div`,b,[(0,r.createElementVNode)(`div`,x,[n[2]||=(0,r.createElementVNode)(`div`,null,[(0,r.createElementVNode)(`h1`,{class:`text-lg font-medium`},`Resource Management`),(0,r.createElementVNode)(`p`,{class:`text-muted-foreground text-sm mt-1`},` Define the rooms, boxes, or staff that can be booked in this agenda. `)],-1),d.value.length>0?((0,r.openBlock)(),(0,r.createBlock)(a,{key:0,onClick:q},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Plus),{class:`size-4 mr-1.5`}),n[1]||=(0,r.createTextVNode)(` Add Resource `,-1)]),_:1})):(0,r.createCommentVNode)(``,!0)]),(0,r.createElementVNode)(`div`,S,[d.value.length>0?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,C,[(0,r.createElementVNode)(`div`,w,[(0,r.createVNode)(s,{modelValue:h.value,"onUpdate:modelValue":n[0]||=e=>h.value=e,placeholder:`Search resources...`,class:`pl-9`},null,8,[`modelValue`]),n[3]||=(0,r.createElementVNode)(`svg`,{class:`absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground`,xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},[(0,r.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z`})],-1)]),(0,r.createElementVNode)(`div`,T,(0,r.toDisplayString)(X.value)+` active of `+(0,r.toDisplayString)(Z.value)+` resource`+(0,r.toDisplayString)(Z.value===1?``:`s`),1)])):(0,r.createCommentVNode)(``,!0),Y.value.length>0?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,E,[((0,r.openBlock)(!0),(0,r.createElementBlock)(r.Fragment,null,(0,r.renderList)(Y.value,e=>((0,r.openBlock)(),(0,r.createBlock)(Q,{key:e.id,class:(0,r.normalizeClass)([`group relative overflow-hidden transition-all duration-200 hover:shadow-md`,e.isActive?``:`opacity-60 grayscale-[30%]`])},{default:(0,r.withCtx)(()=>[(0,r.createElementVNode)(`div`,{class:`absolute inset-y-0 left-0 w-1 transition-all duration-200 group-hover:w-1.5`,style:(0,r.normalizeStyle)({background:e.color})},null,4),(0,r.createElementVNode)(`div`,D,[(0,r.createElementVNode)(`div`,O,[(0,r.createElementVNode)(`div`,{class:`size-11 rounded-xl flex-shrink-0 flex items-center justify-center text-white font-semibold text-sm shadow-sm`,style:(0,r.normalizeStyle)({background:e.color})},(0,r.toDisplayString)(e.avatarLabel||e.name.charAt(0).toUpperCase()),5),(0,r.createElementVNode)(`div`,k,[(0,r.createElementVNode)(`div`,A,[(0,r.createElementVNode)(`h3`,j,[(0,r.createTextVNode)((0,r.toDisplayString)(e.name)+` `,1),e.isActive?(0,r.createCommentVNode)(``,!0):((0,r.openBlock)(),(0,r.createElementBlock)(`span`,M,`(Inactive)`))])]),e.publicLabel&&e.publicLabel!==e.name?((0,r.openBlock)(),(0,r.createElementBlock)(`p`,ee,(0,r.toDisplayString)(e.publicLabel),1)):(0,r.createCommentVNode)(``,!0)]),(0,r.createVNode)(_,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(c,{"as-child":``},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(a,{variant:`ghost`,size:`icon`,class:`size-8`},{default:(0,r.withCtx)(()=>[...n[4]||=[(0,r.createElementVNode)(`svg`,{class:`size-4`,xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},[(0,r.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z`})],-1)]]),_:1})]),_:1}),(0,r.createVNode)(g,{align:`end`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(l,{onClick:t=>J(e)},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Pencil),{class:`size-4 mr-2`}),n[5]||=(0,r.createTextVNode)(` Edit `,-1)]),_:1},8,[`onClick`]),(0,r.createVNode)(l,{onClick:t=>K(e)},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Copy),{class:`size-4 mr-2`}),n[6]||=(0,r.createTextVNode)(` Duplicate `,-1)]),_:1},8,[`onClick`]),(0,r.createVNode)(u),(0,r.createVNode)(l,{variant:`destructive`,onClick:t=>W(e.id)},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Trash2),{class:`size-4 mr-2`}),n[7]||=(0,r.createTextVNode)(` Delete `,-1)]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024)]),e.description?((0,r.openBlock)(),(0,r.createElementBlock)(`p`,te,(0,r.toDisplayString)(e.description),1)):(0,r.createCommentVNode)(``,!0),(0,r.createElementVNode)(`div`,N,[(0,r.createElementVNode)(`div`,P,[(0,r.createVNode)((0,r.unref)(i.Users),{class:`size-3.5`}),(0,r.createElementVNode)(`span`,null,(0,r.toDisplayString)(e.capacity)+` `+(0,r.toDisplayString)(e.capacity===1?`slot`:`slots`),1)]),(0,r.createElementVNode)(`div`,F,[n[8]||=(0,r.createElementVNode)(`svg`,{class:`size-3.5`,xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},[(0,r.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),(0,r.createElementVNode)(`span`,null,(0,r.toDisplayString)(e.interval)+` min`,1)]),(0,r.unref)(o)>=640?((0,r.openBlock)(),(0,r.createElementBlock)(r.Fragment,{key:0},[n[9]||=(0,r.createElementVNode)(`div`,{class:`flex-1`},null,-1),(0,r.createElementVNode)(`div`,I,[(0,r.createElementVNode)(`span`,L,(0,r.toDisplayString)(e.isActive?`Active`:`Inactive`),1),(0,r.createVNode)(v,{defaultValue:e.isActive,"onUpdate:modelValue":t=>G(e),class:`scale-90`},null,8,[`defaultValue`,`onUpdate:modelValue`])])],64)):e.isActive?(0,r.createCommentVNode)(``,!0):((0,r.openBlock)(),(0,r.createElementBlock)(`div`,R,[(0,r.createVNode)((0,r.unref)(i.CircleAlert),{class:`size-3.5`}),n[10]||=(0,r.createElementVNode)(`span`,null,`Inactive`,-1)]))])])]),_:2},1032,[`class`]))),128))])):d.value.length>0&&Y.value.length===0?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,z,[...n[11]||=[(0,r.createElementVNode)(`p`,null,`No resources match your search.`,-1)]])):p.value?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,B,[(0,r.createVNode)($,{class:`size-8`})])):((0,r.openBlock)(),(0,r.createBlock)(se,{key:4,class:`border border-dashed`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)(ae,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(ne,{variant:`icon`},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Users),{class:`size-6`})]),_:1}),(0,r.createVNode)(re,null,{default:(0,r.withCtx)(()=>[...n[12]||=[(0,r.createTextVNode)(`No Resources Yet`,-1)]]),_:1}),(0,r.createVNode)(ie,null,{default:(0,r.withCtx)(()=>[...n[13]||=[(0,r.createTextVNode)(` You haven't added any bookable resources yet. Define your staff, rooms, or equipment to start configuring availability. `,-1)]]),_:1})]),_:1}),(0,r.createVNode)(oe,null,{default:(0,r.withCtx)(()=>[(0,r.createVNode)(a,{variant:`outline`,onClick:q},{default:(0,r.withCtx)(()=>[(0,r.createVNode)((0,r.unref)(i.Plus),{class:`size-4 mr-1.5`}),n[14]||=(0,r.createTextVNode)(` Add Your First Resource `,-1)]),_:1})]),_:1})]),_:1})),f.value?((0,r.openBlock)(),(0,r.createElementBlock)(`div`,V,[(0,r.createVNode)($,{class:`size-4`}),n[15]||=(0,r.createElementVNode)(`span`,{class:`text-sm`},`Saving...`,-1)])):(0,r.createCommentVNode)(``,!0)])]),(0,r.createVNode)(y,{ref_key:`resourceDialogRef`,ref:m,onAddResource:H,onUpdateResource:U,onRemoveResource:W},null,512)]),_:1})}}});exports.default=H;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("h3");require("vue");function b(w){const{initFirebase:A,normalizeTimestamps:D}=w,p=n.createRouter();async function m(l){const{supabase:c,instanceId:u}=l.context.module,{data:e,error:o}=await c.from("project_modules").select("config").eq("id",u).single();if(o||!e?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load module config."});const s=e.config,t=s.project,a=s.productCollection||"products";if(!t)throw n.createError({statusCode:400,statusMessage:"Products module has no Firebase integration configured."});return{firebase:await A(l,t),collection:a}}return p.get("/products",n.defineEventHandler(async l=>{try{const{firebase:c,collection:u}=await m(l);return(await c.firestore().collection(u).get()).docs.map(o=>D({id:o.id,...o.data()}))}catch(c){throw console.error("Products handler — list error:",c),n.createError({statusCode:c.statusCode||500,statusMessage:c.statusMessage||"Failed to list products"})}})),p.get("/products/:productId",n.defineEventHandler(async l=>{const c=n.getRouterParam(l,"productId");if(!c)throw n.createError({statusCode:400,statusMessage:"Product ID is required."});try{const{firebase:u,collection:e}=await m(l),o=await u.firestore().collection(e).doc(c).get();if(!o.exists)throw n.createError({statusCode:404,statusMessage:"Product not found."});return D({id:o.id,...o.data()})}catch(u){throw console.error("Products handler — get error:",u),n.createError({statusCode:u.statusCode||500,statusMessage:u.statusMessage||"Failed to get product"})}})),p.get("/empty-stock",n.defineEventHandler(async l=>{const u=n.getQuery(l).category;try{const{firebase:e,collection:o}=await m(l);let s=e.firestore().collection(o).where("stock","==",0);u&&(s=s.where("collections","array-contains",u));const a=(await s.get()).docs.map(r=>D({id:r.id,...r.data()}));return{count:a.length,products:a.map(r=>({id:r.id,title:r.title,slug:r.slug,stock:r.stock,price:r.price,currency:r.currency,status:r.status}))}}catch(e){throw console.error("Products handler — empty-stock error:",e),n.createError({statusCode:e.statusCode||500,statusMessage:e.statusMessage||"Failed to query empty stock"})}})),p.handler}function T(w){const{initFirebase:A,normalizeTimestamps:D}=w,p=n.createRouter();async function m(c){const{supabase:u,instanceId:e}=c.context.module,{data:o,error:s}=await u.from("project_modules").select("config").eq("id",e).single();if(s||!o?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load module config."});const t=o.config,a=t.project,r=t.reservationsCollection||"bookings_orders",i=t.agendaCollection||"agendas";if(!a)throw n.createError({statusCode:400,statusMessage:"Appointments module has no Firebase integration configured."});return{firebase:await A(c,a),reservationsCollection:r,agendaCollection:i}}function l(c){return(c.reservations||[]).map(e=>({orderId:c.id,reservationId:e.id,customerInfo:c.customerInfo,date:e.date,startTime:e.timeslot?.startTime,endTime:e.timeslot?.endTime,spots:e.spots,status:c.status,reservationStatus:e.status,resourceId:e.resourceId,reservationPrice:e.totalPrice,reservationBasePrice:e.basePrice,reservationAddOnsPrice:e.addOnsPrice,pricingOption:e.pricingOption,amountDue:c.amountDue,amountPaid:c.amountPaid,createdAt:c.createdAt,metadata:c.metadata||{},reservationMetadata:e.metadata||{}}))}return p.get("/agendas",n.defineEventHandler(async c=>{try{const{firebase:u,agendaCollection:e}=await m(c),s=(await u.firestore().collection(e).get()).docs.map(t=>{const a=t.data();return{id:t.id,serviceName:a.serviceName||"",type:a.type||"regular"}});return{count:s.length,agendas:s}}catch(u){throw console.error("Appointments handler — list agendas error:",u),n.createError({statusCode:u.statusCode||500,statusMessage:u.statusMessage||"Failed to list agendas"})}})),p.get("/agendas/:agendaId/opening-hours",n.defineEventHandler(async c=>{const u=n.getRouterParam(c,"agendaId"),o=n.getQuery(c).date;if(!u)throw n.createError({statusCode:400,statusMessage:"Agenda ID is required."});if(!o)throw n.createError({statusCode:400,statusMessage:"Date is required (YYYY-MM-DD)."});try{const{firebase:s,agendaCollection:t}=await m(c),a=await s.firestore().collection(t).doc(u).get();if(!a.exists)throw n.createError({statusCode:404,statusMessage:"Agenda not found."});const r=a.data(),i=(r.resources||[]).filter(f=>f.isActive),d=r.exceptions||[],y=new Date(o+"T00:00:00").getDay(),h=i.map(f=>{const E=f.openingHours?.[y]||[],C=d.find(I=>{const P=o>=I.startDate&&o<=I.endDate,R=!I.resourceIds||I.resourceIds.length===0||I.resourceIds.includes(f.id);return P&&R});return C?{resourceId:f.id,resourceName:f.name,date:o,dayOfWeek:y,isClosed:C.isClosed,hours:C.isClosed?[]:(C.timeslots||[]).map(I=>({start:I.startTime,end:I.endTime})),isException:!0}:{resourceId:f.id,resourceName:f.name,date:o,dayOfWeek:y,isClosed:E.length===0,hours:E,isException:!1}});return{agendaId:u,serviceName:r.serviceName||"",date:o,resources:h}}catch(s){throw console.error("Appointments handler — opening hours error:",s),n.createError({statusCode:s.statusCode||500,statusMessage:s.statusMessage||"Failed to get opening hours"})}})),p.get("/appointments",n.defineEventHandler(async c=>{const u=n.getQuery(c),e=Math.min(Number(u.quantity)||20,100),o=u.status||"confirmed";try{const{firebase:s,reservationsCollection:t}=await m(c),r=(await s.firestore().collection(t).orderBy("createdAt","desc").where("status","==",o).limit(e).get()).docs.flatMap(i=>l(D({id:i.id,...i.data()})));return{count:r.length,appointments:r}}catch(s){throw console.error("Appointments handler — list error:",s),n.createError({statusCode:s.statusCode||500,statusMessage:s.statusMessage||"Failed to list appointments"})}})),p.get("/appointments/find",n.defineEventHandler(async c=>{const u=n.getQuery(c),e=(u.name||"").toLowerCase().trim(),o=(u.email||"").toLowerCase().trim(),s=u.date;try{const{firebase:t,reservationsCollection:a}=await m(c);let r=t.firestore().collection(a);o&&(r=r.where("customerInfo.email","==",o));let d=(await r.orderBy("createdAt","desc").limit(200).get()).docs.flatMap(g=>l(D({id:g.id,...g.data()})));return s&&(d=d.filter(g=>g.date===s)),e&&(d=d.filter(g=>{const y=(g.customerInfo?.firstName||"").toLowerCase(),h=(g.customerInfo?.lastName||"").toLowerCase();return y.includes(e)||h.includes(e)||`${y} ${h}`.includes(e)})),{count:d.length,appointments:d}}catch(t){throw console.error("Appointments handler — find error:",t),n.createError({statusCode:t.statusCode||500,statusMessage:t.statusMessage||"Failed to find appointments"})}})),p.get("/appointments/:appointmentId",n.defineEventHandler(async c=>{const u=n.getRouterParam(c,"appointmentId");if(!u)throw n.createError({statusCode:400,statusMessage:"Appointment ID is required."});try{const{firebase:e,reservationsCollection:o}=await m(c),s=await e.firestore().collection(o).doc(u).get();if(!s.exists)throw n.createError({statusCode:404,statusMessage:"Appointment not found."});const t=D({id:s.id,...s.data()});return{...t,reservations:l(t)}}catch(e){throw console.error("Appointments handler — get error:",e),n.createError({statusCode:e.statusCode||500,statusMessage:e.statusMessage||"Failed to get appointment"})}})),p.handler}const S="https://analyticsdata.googleapis.com/v1beta",N=["https://www.googleapis.com/auth/analytics.readonly","https://www.googleapis.com/auth/webmasters.readonly"],k="https://searchconsole.googleapis.com/webmasters/v3";function H(w){const{decrypt:A,getGoogleAccessToken:D}=w,p=n.createRouter();async function m(e){const{supabase:o,instanceId:s}=e.context.module,{data:t,error:a}=await o.from("project_modules").select("config").eq("id",s).single();if(a||!t?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load module config."});const r=t.config,i=r.propertyId,d=r.serviceAccount,g=r.siteUrl||"";if(!d)throw n.createError({statusCode:400,statusMessage:"No Google Service Account configured for this module."});if(!i)throw n.createError({statusCode:400,statusMessage:"No GA4 Property ID configured for this module."});const{data:y,error:h}=await o.from("integrations").select("config").eq("id",d).single();let f=y?.config;if(h||!f){const{data:R,error:q}=await o.from("agency_integrations").select("config").eq("id",d).single();if(q||!R?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load Google Service Account credentials."});f=R.config}const E=A(f.clientEmail),C=A(f.privateKey),I=A(f.projectId);return{accessToken:await D({clientEmail:E,privateKey:C,projectId:I},N),propertyId:i,siteUrl:g}}async function l(e,o,s){const t=await fetch(`${S}/properties/${o}:runReport`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(s)});if(!t.ok){const a=await t.json().catch(()=>({}));throw console.error("GA4 runReport failed:",a),n.createError({statusCode:t.status,statusMessage:a?.error?.message||"GA4 API request failed"})}return t.json()}p.get("/report",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=a.match(/^(\d+)daysAgo$/),d=i?parseInt(i[1],10):30,g=`${d*2}daysAgo`,y=`${d+1}daysAgo`,h=[{name:"sessions"},{name:"totalUsers"},{name:"screenPageViews"},{name:"bounceRate"},{name:"averageSessionDuration"},{name:"newUsers"},{name:"engagementRate"},{name:"sessionsPerUser"},{name:"screenPageViewsPerSession"}];let f,E=!0;try{f=await l(o,s,{dateRanges:[{startDate:a,endDate:r,name:"current"},{startDate:g,endDate:y,name:"previous"}],dimensions:[{name:"date"}],metrics:h,metricAggregations:["TOTAL"],orderBys:[{dimension:{dimensionName:"date"}}]})}catch{E=!1,f=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"date"}],metrics:h,metricAggregations:["TOTAL"],orderBys:[{dimension:{dimensionName:"date"}}]})}return U(f,E)})),p.get("/realtime",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=await fetch(`${S}/properties/${s}:runRealtimeReport`,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"},body:JSON.stringify({dimensions:[{name:"unifiedScreenName"}],metrics:[{name:"activeUsers"}],orderBys:[{metric:{metricName:"activeUsers"},desc:!0}],limit:5})});if(!t.ok){const d=await t.json().catch(()=>({}));throw n.createError({statusCode:t.status,statusMessage:d?.error?.message||"Realtime API failed"})}const a=await t.json(),r=(a?.rows||[]).reduce((d,g)=>d+parseInt(g.metricValues?.[0]?.value||"0",10),0),i=(a?.rows||[]).map(d=>({page:d.dimensionValues?.[0]?.value||"(not set)",activeUsers:parseInt(d.metricValues?.[0]?.value||"0",10)}));return{activeUsers:r,activePages:i}})),p.get("/top-pages",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=parseInt(t.limit||"10",10),d=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"pagePath"}],metrics:[{name:"screenPageViews"},{name:"totalUsers"},{name:"averageSessionDuration"}],orderBys:[{metric:{metricName:"screenPageViews"},desc:!0}],limit:i*2}),g=v(d,"pagePath"),y=new Map;for(const f of g.rows){const E=f.pagePath.toLowerCase().replace(/\/+$/,""),C=y.get(E);if(C){C.screenPageViews+=f.screenPageViews||0,C.totalUsers+=f.totalUsers||0;const I=C.screenPageViews;I>0&&(C.averageSessionDuration=(C.averageSessionDuration*(I-(f.screenPageViews||0))+(f.averageSessionDuration||0)*(f.screenPageViews||0))/I)}else y.set(E,{...f})}return{rows:[...y.values()].sort((f,E)=>(E.screenPageViews||0)-(f.screenPageViews||0)).slice(0,i),rowCount:g.rowCount}})),p.get("/top-sources",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"sessionSource"}],metrics:[{name:"sessions"},{name:"totalUsers"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:10});return v(i,"sessionSource")})),p.get("/devices",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"deviceCategory"}],metrics:[{name:"sessions"},{name:"totalUsers"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}]});return v(i,"deviceCategory")})),p.get("/countries",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"country"}],metrics:[{name:"sessions"},{name:"totalUsers"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:10});return v(i,"country")})),p.get("/acquisition/channels",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"sessionDefaultChannelGroup"}],metrics:[{name:"sessions"},{name:"totalUsers"},{name:"newUsers"},{name:"engagementRate"},{name:"averageSessionDuration"},{name:"screenPageViewsPerSession"},{name:"conversions"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:15});return v(i,"sessionDefaultChannelGroup")})),p.get("/acquisition/source-medium",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"sessionSourceMedium"}],metrics:[{name:"sessions"},{name:"totalUsers"},{name:"newUsers"},{name:"bounceRate"},{name:"averageSessionDuration"},{name:"conversions"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:20});return v(i,"sessionSourceMedium")})),p.get("/acquisition/referrals",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"sessionSource"}],dimensionFilter:{filter:{fieldName:"sessionMedium",stringFilter:{value:"referral"}}},metrics:[{name:"sessions"},{name:"totalUsers"},{name:"engagementRate"},{name:"averageSessionDuration"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:20});return v(i,"sessionSource")})),p.get("/acquisition/campaigns",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"sessionCampaignName"}],dimensionFilter:{notExpression:{filter:{fieldName:"sessionCampaignName",stringFilter:{value:"(not set)"}}}},metrics:[{name:"sessions"},{name:"totalUsers"},{name:"conversions"},{name:"engagementRate"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:20});return v(i,"sessionCampaignName")})),p.get("/content/all-pages",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=parseInt(t.limit||"50",10),d=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"pagePath"}],metrics:[{name:"screenPageViews"},{name:"totalUsers"},{name:"averageSessionDuration"},{name:"bounceRate"},{name:"engagementRate"},{name:"sessions"},{name:"userEngagementDuration"}],orderBys:[{metric:{metricName:"screenPageViews"},desc:!0}],limit:i});return v(d,"pagePath")})),p.get("/content/landing-pages",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"landingPagePlusQueryString"}],metrics:[{name:"sessions"},{name:"totalUsers"},{name:"bounceRate"},{name:"averageSessionDuration"},{name:"screenPageViews"},{name:"engagementRate"}],orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:30});return v(i,"landingPagePlusQueryString")})),p.get("/content/exit-pages",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"pagePath"}],metrics:[{name:"sessions"},{name:"screenPageViews"},{name:"totalUsers"},{name:"bounceRate"}],orderBys:[{metric:{metricName:"screenPageViews"},desc:!0}],limit:20}),d=v(i,"pagePath");return d.rows=d.rows.map(g=>({...g,exitRate:g.bounceRate||0})),d})),p.get("/content/search-terms",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s,siteUrl:t}=await m(e),a=n.getQuery(e),r=a.startDate||"30daysAgo",i=a.endDate||"today";if(t)try{const y=`${k}/sites/${encodeURIComponent(t)}/searchAnalytics/query`,h=await fetch(y,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"},body:JSON.stringify({startDate:c(r),endDate:c(i),dimensions:["query"],rowLimit:30})});if(h.ok){const E=((await h.json()).rows||[]).map(C=>({query:C.keys[0],clicks:C.clicks,impressions:C.impressions,ctr:C.ctr,position:C.position}));if(E.length>0)return{rows:E,rowCount:E.length,source:"search_console"}}else{const f=await h.text().catch(()=>"");console.error(`[GA Module] Search Console API error (${h.status}):`,f)}}catch(y){console.error("[GA Module] Search Console request failed:",y?.message||y)}else console.log("[GA Module] No siteUrl configured, skipping Search Console");try{const y=await l(o,s,{dateRanges:[{startDate:r,endDate:i}],dimensions:[{name:"sessionGoogleAdsQuery"}],metrics:[{name:"sessions"},{name:"totalUsers"},{name:"engagementRate"}],dimensionFilter:{andGroup:{expressions:[{notExpression:{filter:{fieldName:"sessionGoogleAdsQuery",stringFilter:{value:"(not set)"}}}},{notExpression:{filter:{fieldName:"sessionGoogleAdsQuery",stringFilter:{value:"(not provided)"}}}}]}},orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:30}),h=v(y,"sessionGoogleAdsQuery");if(h.rows.length>0)return{...h,source:"google_ads"}}catch{}const d=await l(o,s,{dateRanges:[{startDate:r,endDate:i}],dimensions:[{name:"landingPagePlusQueryString"}],metrics:[{name:"sessions"},{name:"totalUsers"},{name:"engagementRate"}],dimensionFilter:{andGroup:{expressions:[{filter:{fieldName:"sessionMedium",stringFilter:{matchType:"EXACT",value:"organic"}}},{notExpression:{filter:{fieldName:"landingPagePlusQueryString",stringFilter:{value:"(not set)"}}}}]}},orderBys:[{metric:{metricName:"sessions"},desc:!0}],limit:30});return{...v(d,"landingPagePlusQueryString"),source:"organic_landing_pages"}})),p.get("/audience/overview",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"newVsReturning"}],metrics:[{name:"totalUsers"},{name:"sessions"},{name:"engagementRate"},{name:"averageSessionDuration"},{name:"screenPageViewsPerSession"}],metricAggregations:["TOTAL"]});return v(i,"newVsReturning")})),p.get("/audience/technology",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=t.dimension||"browser",g=["browser","operatingSystem","screenResolution"].includes(i)?i:"browser",y=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:g}],metrics:[{name:"totalUsers"},{name:"sessions"},{name:"engagementRate"}],orderBys:[{metric:{metricName:"totalUsers"},desc:!0}],limit:10});return v(y,g)})),p.get("/audience/languages",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"language"}],metrics:[{name:"totalUsers"},{name:"sessions"}],orderBys:[{metric:{metricName:"totalUsers"},desc:!0}],limit:15});return v(i,"language")})),p.get("/audience/hours",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"dayOfWeekName"},{name:"hour"}],metrics:[{name:"sessions"}],orderBys:[{dimension:{dimensionName:"dayOfWeekName"}},{dimension:{dimensionName:"hour"}}],limit:168});return M(i,["dayOfWeekName","hour"])})),p.get("/audience/cities",n.defineEventHandler(async e=>{const{accessToken:o,propertyId:s}=await m(e),t=n.getQuery(e),a=t.startDate||"30daysAgo",r=t.endDate||"today",i=await l(o,s,{dateRanges:[{startDate:a,endDate:r}],dimensions:[{name:"city"},{name:"country"}],metrics:[{name:"totalUsers"},{name:"sessions"}],dimensionFilter:{notExpression:{filter:{fieldName:"city",stringFilter:{value:"(not set)"}}}},orderBys:[{metric:{metricName:"totalUsers"},desc:!0}],limit:20});return M(i,["city","country"])}));function c(e){const o=e.match(/^(\d+)daysAgo$/);if(o){const s=new Date;return s.setDate(s.getDate()-parseInt(o[1],10)),s.toISOString().slice(0,10)}if(e==="today")return new Date().toISOString().slice(0,10);if(e==="yesterday"){const s=new Date;return s.setDate(s.getDate()-1),s.toISOString().slice(0,10)}return e}async function u(e,o,s){const t=`${k}/sites/${encodeURIComponent(o)}/searchAnalytics/query`,a=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify(s)});if(!a.ok){const r=await a.json().catch(()=>({}));throw n.createError({statusCode:a.status,statusMessage:r?.error?.message||"Search Console API request failed"})}return a.json()}return p.get("/seo/keywords",n.defineEventHandler(async e=>{const{accessToken:o,siteUrl:s}=await m(e);if(!s)throw n.createError({statusCode:400,statusMessage:"Search Console Site URL is not configured. Add it in module settings."});const t=n.getQuery(e),a=c(t.startDate||"30daysAgo"),r=c(t.endDate||"today"),i=Math.min(parseInt(t.limit)||50,100),d=await u(o,s,{startDate:a,endDate:r,dimensions:["query"],rowLimit:i});return{rows:(d.rows||[]).map(g=>({query:g.keys[0],clicks:g.clicks,impressions:g.impressions,ctr:g.ctr,position:g.position})),rowCount:d.rows?.length||0}})),p.get("/seo/pages",n.defineEventHandler(async e=>{const{accessToken:o,siteUrl:s}=await m(e);if(!s)throw n.createError({statusCode:400,statusMessage:"Search Console Site URL is not configured."});const t=n.getQuery(e),a=c(t.startDate||"30daysAgo"),r=c(t.endDate||"today"),i=Math.min(parseInt(t.limit)||50,100),d=await u(o,s,{startDate:a,endDate:r,dimensions:["page"],rowLimit:i});return{rows:(d.rows||[]).map(g=>({page:g.keys[0],clicks:g.clicks,impressions:g.impressions,ctr:g.ctr,position:g.position})),rowCount:d.rows?.length||0}})),p.get("/seo/trends",n.defineEventHandler(async e=>{const{accessToken:o,siteUrl:s}=await m(e);if(!s)throw n.createError({statusCode:400,statusMessage:"Search Console Site URL is not configured."});const t=n.getQuery(e),a=c(t.startDate||"30daysAgo"),r=c(t.endDate||"today"),d=((await u(o,s,{startDate:a,endDate:r,dimensions:["date"],rowLimit:500})).rows||[]).map(y=>({date:y.keys[0],clicks:y.clicks,impressions:y.impressions,ctr:y.ctr,position:y.position})).sort((y,h)=>y.date.localeCompare(h.date)),g=d.reduce((y,h)=>({clicks:y.clicks+h.clicks,impressions:y.impressions+h.impressions}),{clicks:0,impressions:0});return g.ctr=g.impressions>0?g.clicks/g.impressions:0,g.avgPosition=d.length>0?d.reduce((y,h)=>y+h.position,0)/d.length:0,{rows:d,totals:g,rowCount:d.length}})),p.get("/seo/query-pages",n.defineEventHandler(async e=>{const{accessToken:o,siteUrl:s}=await m(e);if(!s)throw n.createError({statusCode:400,statusMessage:"Search Console Site URL is not configured."});const t=n.getQuery(e),a=c(t.startDate||"30daysAgo"),r=c(t.endDate||"today"),i=await u(o,s,{startDate:a,endDate:r,dimensions:["query","page"],rowLimit:100});return{rows:(i.rows||[]).map(d=>({query:d.keys[0],page:d.keys[1],clicks:d.clicks,impressions:d.impressions,ctr:d.ctr,position:d.position})),rowCount:i.rows?.length||0}})),p.handler}function U(w,A=!0){const D=(w.metricHeaders||[]).map(a=>a.name),m=(w.dimensionHeaders||[]).map(a=>a.name).indexOf("date"),l=[];(w.rows||[]).forEach(a=>{const r=m>=0?a.dimensionValues[m]?.value:a.dimensionValues[0]?.value;if(!r||r.length<8)return;const d={date:`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`};D.forEach((g,y)=>{d[g]=parseFloat(a.metricValues[y]?.value||"0")}),l.push(d)});const c={},u={};w.totals&&w.totals.length>=2?D.forEach((a,r)=>{c[a]=parseFloat(w.totals[0]?.metricValues?.[r]?.value||"0"),u[a]=parseFloat(w.totals[1]?.metricValues?.[r]?.value||"0")}):w.totals&&w.totals.length===1&&D.forEach((a,r)=>{c[a]=parseFloat(w.totals[0]?.metricValues?.[r]?.value||"0")});const e={};D.forEach(a=>{const r=c[a]||0,i=u[a];i!==void 0&&i!==0?e[a]=(r-i)/i*100:e[a]=null});const o=new Map;for(const a of l)o.has(a.date)||o.set(a.date,a);const s=Array.from(o.values()).sort((a,r)=>a.date.localeCompare(r.date)),t=A&&w.totals&&w.totals.length>=2?s.slice(-Math.ceil(s.length/2)):s;return{rows:t,totals:c,previousTotals:u,changes:e,rowCount:t.length}}function v(w,A){const D=(w.metricHeaders||[]).map(m=>m.name),p=(w.rows||[]).map(m=>{const l={[A]:m.dimensionValues[0].value};return D.forEach((c,u)=>{l[c]=parseFloat(m.metricValues[u].value)}),l});return{rows:p,rowCount:w.rowCount||p.length}}function M(w,A){const D=(w.metricHeaders||[]).map(m=>m.name),p=(w.rows||[]).map(m=>{const l={};return A.forEach((c,u)=>{l[c]=m.dimensionValues[u]?.value||""}),D.forEach((c,u)=>{l[c]=parseFloat(m.metricValues[u].value)}),l});return{rows:p,rowCount:w.rowCount||p.length}}function F(w){const{decrypt:A}=w,D=n.createRouter();async function p(m){const{supabase:l,instanceId:c}=m.context.module,{data:u,error:e}=await l.from("project_modules").select("config").eq("id",c).single();if(e||!u?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load module config."});const o=u.config,s=o.githubIntegration,t=o.githubRepo,a=o.githubOwner;if(!s||!t||!a)throw n.createError({statusCode:400,statusMessage:"No GitHub integration configured for this module."});const{data:r,error:i}=await l.from("integrations").select("config").eq("id",s).single();let d=r?.config;if(i||!d){const{data:y,error:h}=await l.from("agency_integrations").select("config").eq("id",s).single();if(h||!y?.config)throw n.createError({statusCode:500,statusMessage:"Failed to load Github credentials."});d=y.config}return{token:A(d.token),repo:t,owner:a}}return D.post("/github/deploy",n.defineEventHandler(async m=>{try{const{token:l,repo:c,owner:u}=await p(m);await fetch(`https://api.github.com/repos/${u}/${c}/dispatches`,{method:"POST",headers:{Authorization:`Bearer ${l}`,Accept:"application/vnd.github+json"},body:JSON.stringify({event_type:"deploy-site"})})}catch(l){throw console.error("Error triggering GitHub deployment:",l),n.createError({statusCode:500,statusMessage:"Failed to trigger deployment."})}})),D.handler}exports.appointments=T;exports.contentManager=F;exports.googleAnalytics=H;exports.products=b;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-DQi1bQcV.js`);let e=require(`h3`);require(`vue`);function t(t){let{initFirebase:n,normalizeTimestamps:r}=t,i=(0,e.createRouter)();async function a(t){let{supabase:r,instanceId:i}=t.context.module,{data:a,error:o}=await r.from(`project_modules`).select(`config`).eq(`id`,i).single();if(o||!a?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load module config.`});let s=a.config,c=s.project,l=s.productCollection||`products`;if(!c)throw(0,e.createError)({statusCode:400,statusMessage:`Products module has no Firebase integration configured.`});return{firebase:await n(t,c),collection:l}}return i.get(`/products`,(0,e.defineEventHandler)(async t=>{try{let{firebase:e,collection:n}=await a(t);return(await e.firestore().collection(n).get()).docs.map(e=>r({id:e.id,...e.data()}))}catch(t){throw console.error(`Products handler — list error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to list products`})}})),i.get(`/products/:productId`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getRouterParam)(t,`productId`);if(!n)throw(0,e.createError)({statusCode:400,statusMessage:`Product ID is required.`});try{let{firebase:i,collection:o}=await a(t),s=await i.firestore().collection(o).doc(n).get();if(!s.exists)throw(0,e.createError)({statusCode:404,statusMessage:`Product not found.`});return r({id:s.id,...s.data()})}catch(t){throw console.error(`Products handler — get error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to get product`})}})),i.get(`/empty-stock`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getQuery)(t).category;try{let{firebase:e,collection:i}=await a(t),o=e.firestore().collection(i).where(`stock`,`==`,0);n&&(o=o.where(`collections`,`array-contains`,n));let s=(await o.get()).docs.map(e=>r({id:e.id,...e.data()}));return{count:s.length,products:s.map(e=>({id:e.id,title:e.title,slug:e.slug,stock:e.stock,price:e.price,currency:e.currency,status:e.status}))}}catch(t){throw console.error(`Products handler — empty-stock error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to query empty stock`})}})),i.handler}function n(t){let{initFirebase:n,normalizeTimestamps:r}=t,i=(0,e.createRouter)();async function a(t){let{supabase:r,instanceId:i}=t.context.module,{data:a,error:o}=await r.from(`project_modules`).select(`config`).eq(`id`,i).single();if(o||!a?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load module config.`});let s=a.config,c=s.project,l=s.reservationsCollection||`bookings_orders`,u=s.agendaCollection||`agendas`;if(!c)throw(0,e.createError)({statusCode:400,statusMessage:`Appointments module has no Firebase integration configured.`});return{firebase:await n(t,c),reservationsCollection:l,agendaCollection:u}}function o(e){return(e.reservations||[]).map(t=>({orderId:e.id,reservationId:t.id,customerInfo:e.customerInfo,date:t.date,startTime:t.timeslot?.startTime,endTime:t.timeslot?.endTime,spots:t.spots,status:e.status,reservationStatus:t.status,resourceId:t.resourceId,reservationPrice:t.totalPrice,reservationBasePrice:t.basePrice,reservationAddOnsPrice:t.addOnsPrice,pricingOption:t.pricingOption,amountDue:e.amountDue,amountPaid:e.amountPaid,createdAt:e.createdAt,metadata:e.metadata||{},reservationMetadata:t.metadata||{}}))}return i.get(`/agendas`,(0,e.defineEventHandler)(async t=>{try{let{firebase:e,agendaCollection:n}=await a(t),r=(await e.firestore().collection(n).get()).docs.map(e=>{let t=e.data();return{id:e.id,serviceName:t.serviceName||``,type:t.type||`regular`}});return{count:r.length,agendas:r}}catch(t){throw console.error(`Appointments handler — list agendas error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to list agendas`})}})),i.get(`/agendas/:agendaId/opening-hours`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getRouterParam)(t,`agendaId`),r=(0,e.getQuery)(t).date;if(!n)throw(0,e.createError)({statusCode:400,statusMessage:`Agenda ID is required.`});if(!r)throw(0,e.createError)({statusCode:400,statusMessage:`Date is required (YYYY-MM-DD).`});try{let{firebase:i,agendaCollection:o}=await a(t),s=await i.firestore().collection(o).doc(n).get();if(!s.exists)throw(0,e.createError)({statusCode:404,statusMessage:`Agenda not found.`});let c=s.data(),l=(c.resources||[]).filter(e=>e.isActive),u=c.exceptions||[],d=new Date(r+`T00:00:00`).getDay(),f=l.map(e=>{let t=e.openingHours?.[d]||[],n=u.find(t=>{let n=r>=t.startDate&&r<=t.endDate,i=!t.resourceIds||t.resourceIds.length===0||t.resourceIds.includes(e.id);return n&&i});return n?{resourceId:e.id,resourceName:e.name,date:r,dayOfWeek:d,isClosed:n.isClosed,hours:n.isClosed?[]:(n.timeslots||[]).map(e=>({start:e.startTime,end:e.endTime})),isException:!0}:{resourceId:e.id,resourceName:e.name,date:r,dayOfWeek:d,isClosed:t.length===0,hours:t,isException:!1}});return{agendaId:n,serviceName:c.serviceName||``,date:r,resources:f}}catch(t){throw console.error(`Appointments handler — opening hours error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to get opening hours`})}})),i.get(`/appointments`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getQuery)(t),i=Math.min(Number(n.quantity)||20,100),s=n.status||`confirmed`;try{let{firebase:e,reservationsCollection:n}=await a(t),c=(await e.firestore().collection(n).orderBy(`createdAt`,`desc`).where(`status`,`==`,s).limit(i).get()).docs.flatMap(e=>o(r({id:e.id,...e.data()})));return{count:c.length,appointments:c}}catch(t){throw console.error(`Appointments handler — list error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to list appointments`})}})),i.get(`/appointments/find`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getQuery)(t),i=(n.name||``).toLowerCase().trim(),s=(n.email||``).toLowerCase().trim(),c=n.date;try{let{firebase:e,reservationsCollection:n}=await a(t),l=e.firestore().collection(n);s&&(l=l.where(`customerInfo.email`,`==`,s));let u=(await l.orderBy(`createdAt`,`desc`).limit(200).get()).docs.flatMap(e=>o(r({id:e.id,...e.data()})));return c&&(u=u.filter(e=>e.date===c)),i&&(u=u.filter(e=>{let t=(e.customerInfo?.firstName||``).toLowerCase(),n=(e.customerInfo?.lastName||``).toLowerCase();return t.includes(i)||n.includes(i)||`${t} ${n}`.includes(i)})),{count:u.length,appointments:u}}catch(t){throw console.error(`Appointments handler — find error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to find appointments`})}})),i.get(`/appointments/:appointmentId`,(0,e.defineEventHandler)(async t=>{let n=(0,e.getRouterParam)(t,`appointmentId`);if(!n)throw(0,e.createError)({statusCode:400,statusMessage:`Appointment ID is required.`});try{let{firebase:i,reservationsCollection:s}=await a(t),c=await i.firestore().collection(s).doc(n).get();if(!c.exists)throw(0,e.createError)({statusCode:404,statusMessage:`Appointment not found.`});let l=r({id:c.id,...c.data()});return{...l,reservations:o(l)}}catch(t){throw console.error(`Appointments handler — get error:`,t),(0,e.createError)({statusCode:t.statusCode||500,statusMessage:t.statusMessage||`Failed to get appointment`})}})),i.handler}var r=`https://analyticsdata.googleapis.com/v1beta`,i=[`https://www.googleapis.com/auth/analytics.readonly`,`https://www.googleapis.com/auth/webmasters.readonly`],a=`https://searchconsole.googleapis.com/webmasters/v3`;function o(t){let{decrypt:n,getGoogleAccessToken:o}=t,u=(0,e.createRouter)();async function d(t){let{supabase:r,instanceId:a}=t.context.module,{data:s,error:c}=await r.from(`project_modules`).select(`config`).eq(`id`,a).single();if(c||!s?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load module config.`});let l=s.config,u=l.propertyId,d=l.serviceAccount,f=l.siteUrl||``;if(!d)throw(0,e.createError)({statusCode:400,statusMessage:`No Google Service Account configured for this module.`});if(!u)throw(0,e.createError)({statusCode:400,statusMessage:`No GA4 Property ID configured for this module.`});let{data:p,error:m}=await r.from(`integrations`).select(`config`).eq(`id`,d).single(),h=p?.config;if(m||!h){let{data:t,error:n}=await r.from(`agency_integrations`).select(`config`).eq(`id`,d).single();if(n||!t?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load Google Service Account credentials.`});h=t.config}return{accessToken:await o({clientEmail:n(h.clientEmail),privateKey:n(h.privateKey),projectId:n(h.projectId)},i),propertyId:u,siteUrl:f}}async function f(t,n,i){let a=await fetch(`${r}/properties/${n}:runReport`,{method:`POST`,headers:{Authorization:`Bearer ${t}`,"Content-Type":`application/json`},body:JSON.stringify(i)});if(!a.ok){let t=await a.json().catch(()=>({}));throw console.error(`GA4 runReport failed:`,t),(0,e.createError)({statusCode:a.status,statusMessage:t?.error?.message||`GA4 API request failed`})}return a.json()}u.get(`/report`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t),a=i.startDate||`30daysAgo`,o=i.endDate||`today`,c=a.match(/^(\d+)daysAgo$/),l=c?parseInt(c[1],10):30,u=`${l*2}daysAgo`,p=`${l+1}daysAgo`,m=[{name:`sessions`},{name:`totalUsers`},{name:`screenPageViews`},{name:`bounceRate`},{name:`averageSessionDuration`},{name:`newUsers`},{name:`engagementRate`},{name:`sessionsPerUser`},{name:`screenPageViewsPerSession`}],h,g=!0;try{h=await f(n,r,{dateRanges:[{startDate:a,endDate:o,name:`current`},{startDate:u,endDate:p,name:`previous`}],dimensions:[{name:`date`}],metrics:m,metricAggregations:[`TOTAL`],orderBys:[{dimension:{dimensionName:`date`}}]})}catch{g=!1,h=await f(n,r,{dateRanges:[{startDate:a,endDate:o}],dimensions:[{name:`date`}],metrics:m,metricAggregations:[`TOTAL`],orderBys:[{dimension:{dimensionName:`date`}}]})}return s(h,g)})),u.get(`/realtime`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:i}=await d(t),a=await fetch(`${r}/properties/${i}:runRealtimeReport`,{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify({dimensions:[{name:`unifiedScreenName`}],metrics:[{name:`activeUsers`}],orderBys:[{metric:{metricName:`activeUsers`},desc:!0}],limit:5})});if(!a.ok){let t=await a.json().catch(()=>({}));throw(0,e.createError)({statusCode:a.status,statusMessage:t?.error?.message||`Realtime API failed`})}let o=await a.json();return{activeUsers:(o?.rows||[]).reduce((e,t)=>e+parseInt(t.metricValues?.[0]?.value||`0`,10),0),activePages:(o?.rows||[]).map(e=>({page:e.dimensionValues?.[0]?.value||`(not set)`,activeUsers:parseInt(e.metricValues?.[0]?.value||`0`,10)}))}})),u.get(`/top-pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t),a=i.startDate||`30daysAgo`,o=i.endDate||`today`,s=parseInt(i.limit||`10`,10),l=c(await f(n,r,{dateRanges:[{startDate:a,endDate:o}],dimensions:[{name:`pagePath`}],metrics:[{name:`screenPageViews`},{name:`totalUsers`},{name:`averageSessionDuration`}],orderBys:[{metric:{metricName:`screenPageViews`},desc:!0}],limit:s*2}),`pagePath`),u=new Map;for(let e of l.rows){let t=e.pagePath.toLowerCase().replace(/\/+$/,``),n=u.get(t);if(n){n.screenPageViews+=e.screenPageViews||0,n.totalUsers+=e.totalUsers||0;let t=n.screenPageViews;t>0&&(n.averageSessionDuration=(n.averageSessionDuration*(t-(e.screenPageViews||0))+(e.averageSessionDuration||0)*(e.screenPageViews||0))/t)}else u.set(t,{...e})}return{rows:[...u.values()].sort((e,t)=>(t.screenPageViews||0)-(e.screenPageViews||0)).slice(0,s),rowCount:l.rowCount}})),u.get(`/top-sources`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`sessionSource`}],metrics:[{name:`sessions`},{name:`totalUsers`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:10}),`sessionSource`)})),u.get(`/devices`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`deviceCategory`}],metrics:[{name:`sessions`},{name:`totalUsers`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}]}),`deviceCategory`)})),u.get(`/countries`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`country`}],metrics:[{name:`sessions`},{name:`totalUsers`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:10}),`country`)})),u.get(`/acquisition/channels`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`sessionDefaultChannelGroup`}],metrics:[{name:`sessions`},{name:`totalUsers`},{name:`newUsers`},{name:`engagementRate`},{name:`averageSessionDuration`},{name:`screenPageViewsPerSession`},{name:`conversions`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:15}),`sessionDefaultChannelGroup`)})),u.get(`/acquisition/source-medium`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`sessionSourceMedium`}],metrics:[{name:`sessions`},{name:`totalUsers`},{name:`newUsers`},{name:`bounceRate`},{name:`averageSessionDuration`},{name:`conversions`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:20}),`sessionSourceMedium`)})),u.get(`/acquisition/referrals`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`sessionSource`}],dimensionFilter:{filter:{fieldName:`sessionMedium`,stringFilter:{value:`referral`}}},metrics:[{name:`sessions`},{name:`totalUsers`},{name:`engagementRate`},{name:`averageSessionDuration`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:20}),`sessionSource`)})),u.get(`/acquisition/campaigns`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`sessionCampaignName`}],dimensionFilter:{notExpression:{filter:{fieldName:`sessionCampaignName`,stringFilter:{value:`(not set)`}}}},metrics:[{name:`sessions`},{name:`totalUsers`},{name:`conversions`},{name:`engagementRate`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:20}),`sessionCampaignName`)})),u.get(`/content/all-pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t),a=i.startDate||`30daysAgo`,o=i.endDate||`today`,s=parseInt(i.limit||`50`,10);return c(await f(n,r,{dateRanges:[{startDate:a,endDate:o}],dimensions:[{name:`pagePath`}],metrics:[{name:`screenPageViews`},{name:`totalUsers`},{name:`averageSessionDuration`},{name:`bounceRate`},{name:`engagementRate`},{name:`sessions`},{name:`userEngagementDuration`}],orderBys:[{metric:{metricName:`screenPageViews`},desc:!0}],limit:s}),`pagePath`)})),u.get(`/content/landing-pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`landingPagePlusQueryString`}],metrics:[{name:`sessions`},{name:`totalUsers`},{name:`bounceRate`},{name:`averageSessionDuration`},{name:`screenPageViews`},{name:`engagementRate`}],orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:30}),`landingPagePlusQueryString`)})),u.get(`/content/exit-pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t),a=c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`pagePath`}],metrics:[{name:`sessions`},{name:`screenPageViews`},{name:`totalUsers`},{name:`bounceRate`}],orderBys:[{metric:{metricName:`screenPageViews`},desc:!0}],limit:20}),`pagePath`);return a.rows=a.rows.map(e=>({...e,exitRate:e.bounceRate||0})),a})),u.get(`/content/search-terms`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r,siteUrl:i}=await d(t),o=(0,e.getQuery)(t),s=o.startDate||`30daysAgo`,l=o.endDate||`today`;if(i)try{let e=`${a}/sites/${encodeURIComponent(i)}/searchAnalytics/query`,t=await fetch(e,{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify({startDate:p(s),endDate:p(l),dimensions:[`query`],rowLimit:30})});if(t.ok){let e=((await t.json()).rows||[]).map(e=>({query:e.keys[0],clicks:e.clicks,impressions:e.impressions,ctr:e.ctr,position:e.position}));if(e.length>0)return{rows:e,rowCount:e.length,source:`search_console`}}else{let e=await t.text().catch(()=>``);console.error(`[GA Module] Search Console API error (${t.status}):`,e)}}catch(e){console.error(`[GA Module] Search Console request failed:`,e?.message||e)}else console.log(`[GA Module] No siteUrl configured, skipping Search Console`);try{let e=c(await f(n,r,{dateRanges:[{startDate:s,endDate:l}],dimensions:[{name:`sessionGoogleAdsQuery`}],metrics:[{name:`sessions`},{name:`totalUsers`},{name:`engagementRate`}],dimensionFilter:{andGroup:{expressions:[{notExpression:{filter:{fieldName:`sessionGoogleAdsQuery`,stringFilter:{value:`(not set)`}}}},{notExpression:{filter:{fieldName:`sessionGoogleAdsQuery`,stringFilter:{value:`(not provided)`}}}}]}},orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:30}),`sessionGoogleAdsQuery`);if(e.rows.length>0)return{...e,source:`google_ads`}}catch{}return{...c(await f(n,r,{dateRanges:[{startDate:s,endDate:l}],dimensions:[{name:`landingPagePlusQueryString`}],metrics:[{name:`sessions`},{name:`totalUsers`},{name:`engagementRate`}],dimensionFilter:{andGroup:{expressions:[{filter:{fieldName:`sessionMedium`,stringFilter:{matchType:`EXACT`,value:`organic`}}},{notExpression:{filter:{fieldName:`landingPagePlusQueryString`,stringFilter:{value:`(not set)`}}}}]}},orderBys:[{metric:{metricName:`sessions`},desc:!0}],limit:30}),`landingPagePlusQueryString`),source:`organic_landing_pages`}})),u.get(`/audience/overview`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`newVsReturning`}],metrics:[{name:`totalUsers`},{name:`sessions`},{name:`engagementRate`},{name:`averageSessionDuration`},{name:`screenPageViewsPerSession`}],metricAggregations:[`TOTAL`]}),`newVsReturning`)})),u.get(`/audience/technology`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t),a=i.startDate||`30daysAgo`,o=i.endDate||`today`,s=i.dimension||`browser`,l=[`browser`,`operatingSystem`,`screenResolution`].includes(s)?s:`browser`;return c(await f(n,r,{dateRanges:[{startDate:a,endDate:o}],dimensions:[{name:l}],metrics:[{name:`totalUsers`},{name:`sessions`},{name:`engagementRate`}],orderBys:[{metric:{metricName:`totalUsers`},desc:!0}],limit:10}),l)})),u.get(`/audience/languages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return c(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`language`}],metrics:[{name:`totalUsers`},{name:`sessions`}],orderBys:[{metric:{metricName:`totalUsers`},desc:!0}],limit:15}),`language`)})),u.get(`/audience/hours`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return l(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`dayOfWeekName`},{name:`hour`}],metrics:[{name:`sessions`}],orderBys:[{dimension:{dimensionName:`dayOfWeekName`}},{dimension:{dimensionName:`hour`}}],limit:168}),[`dayOfWeekName`,`hour`])})),u.get(`/audience/cities`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,propertyId:r}=await d(t),i=(0,e.getQuery)(t);return l(await f(n,r,{dateRanges:[{startDate:i.startDate||`30daysAgo`,endDate:i.endDate||`today`}],dimensions:[{name:`city`},{name:`country`}],metrics:[{name:`totalUsers`},{name:`sessions`}],dimensionFilter:{notExpression:{filter:{fieldName:`city`,stringFilter:{value:`(not set)`}}}},orderBys:[{metric:{metricName:`totalUsers`},desc:!0}],limit:20}),[`city`,`country`])}));function p(e){let t=e.match(/^(\d+)daysAgo$/);if(t){let e=new Date;return e.setDate(e.getDate()-parseInt(t[1],10)),e.toISOString().slice(0,10)}if(e===`today`)return new Date().toISOString().slice(0,10);if(e===`yesterday`){let e=new Date;return e.setDate(e.getDate()-1),e.toISOString().slice(0,10)}return e}async function m(t,n,r){let i=`${a}/sites/${encodeURIComponent(n)}/searchAnalytics/query`,o=await fetch(i,{method:`POST`,headers:{Authorization:`Bearer ${t}`,"Content-Type":`application/json`},body:JSON.stringify(r)});if(!o.ok){let t=await o.json().catch(()=>({}));throw(0,e.createError)({statusCode:o.status,statusMessage:t?.error?.message||`Search Console API request failed`})}return o.json()}return u.get(`/seo/keywords`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,siteUrl:r}=await d(t);if(!r)throw(0,e.createError)({statusCode:400,statusMessage:`Search Console Site URL is not configured. Add it in module settings.`});let i=(0,e.getQuery)(t),a=await m(n,r,{startDate:p(i.startDate||`30daysAgo`),endDate:p(i.endDate||`today`),dimensions:[`query`],rowLimit:Math.min(parseInt(i.limit)||50,100)});return{rows:(a.rows||[]).map(e=>({query:e.keys[0],clicks:e.clicks,impressions:e.impressions,ctr:e.ctr,position:e.position})),rowCount:a.rows?.length||0}})),u.get(`/seo/pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,siteUrl:r}=await d(t);if(!r)throw(0,e.createError)({statusCode:400,statusMessage:`Search Console Site URL is not configured.`});let i=(0,e.getQuery)(t),a=await m(n,r,{startDate:p(i.startDate||`30daysAgo`),endDate:p(i.endDate||`today`),dimensions:[`page`],rowLimit:Math.min(parseInt(i.limit)||50,100)});return{rows:(a.rows||[]).map(e=>({page:e.keys[0],clicks:e.clicks,impressions:e.impressions,ctr:e.ctr,position:e.position})),rowCount:a.rows?.length||0}})),u.get(`/seo/trends`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,siteUrl:r}=await d(t);if(!r)throw(0,e.createError)({statusCode:400,statusMessage:`Search Console Site URL is not configured.`});let i=(0,e.getQuery)(t),a=((await m(n,r,{startDate:p(i.startDate||`30daysAgo`),endDate:p(i.endDate||`today`),dimensions:[`date`],rowLimit:500})).rows||[]).map(e=>({date:e.keys[0],clicks:e.clicks,impressions:e.impressions,ctr:e.ctr,position:e.position})).sort((e,t)=>e.date.localeCompare(t.date)),o=a.reduce((e,t)=>({clicks:e.clicks+t.clicks,impressions:e.impressions+t.impressions}),{clicks:0,impressions:0});return o.ctr=o.impressions>0?o.clicks/o.impressions:0,o.avgPosition=a.length>0?a.reduce((e,t)=>e+t.position,0)/a.length:0,{rows:a,totals:o,rowCount:a.length}})),u.get(`/seo/query-pages`,(0,e.defineEventHandler)(async t=>{let{accessToken:n,siteUrl:r}=await d(t);if(!r)throw(0,e.createError)({statusCode:400,statusMessage:`Search Console Site URL is not configured.`});let i=(0,e.getQuery)(t),a=await m(n,r,{startDate:p(i.startDate||`30daysAgo`),endDate:p(i.endDate||`today`),dimensions:[`query`,`page`],rowLimit:100});return{rows:(a.rows||[]).map(e=>({query:e.keys[0],page:e.keys[1],clicks:e.clicks,impressions:e.impressions,ctr:e.ctr,position:e.position})),rowCount:a.rows?.length||0}})),u.handler}function s(e,t=!0){let n=(e.metricHeaders||[]).map(e=>e.name),r=(e.dimensionHeaders||[]).map(e=>e.name).indexOf(`date`),i=[];(e.rows||[]).forEach(e=>{let t=r>=0?e.dimensionValues[r]?.value:e.dimensionValues[0]?.value;if(!t||t.length<8)return;let a={date:`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}`};n.forEach((t,n)=>{a[t]=parseFloat(e.metricValues[n]?.value||`0`)}),i.push(a)});let a={},o={};e.totals&&e.totals.length>=2?n.forEach((t,n)=>{a[t]=parseFloat(e.totals[0]?.metricValues?.[n]?.value||`0`),o[t]=parseFloat(e.totals[1]?.metricValues?.[n]?.value||`0`)}):e.totals&&e.totals.length===1&&n.forEach((t,n)=>{a[t]=parseFloat(e.totals[0]?.metricValues?.[n]?.value||`0`)});let s={};n.forEach(e=>{let t=a[e]||0,n=o[e];n!==void 0&&n!==0?s[e]=(t-n)/n*100:s[e]=null});let c=new Map;for(let e of i)c.has(e.date)||c.set(e.date,e);let l=Array.from(c.values()).sort((e,t)=>e.date.localeCompare(t.date)),u=t&&e.totals&&e.totals.length>=2?l.slice(-Math.ceil(l.length/2)):l;return{rows:u,totals:a,previousTotals:o,changes:s,rowCount:u.length}}function c(e,t){let n=(e.metricHeaders||[]).map(e=>e.name),r=(e.rows||[]).map(e=>{let r={[t]:e.dimensionValues[0].value};return n.forEach((t,n)=>{r[t]=parseFloat(e.metricValues[n].value)}),r});return{rows:r,rowCount:e.rowCount||r.length}}function l(e,t){let n=(e.metricHeaders||[]).map(e=>e.name),r=(e.rows||[]).map(e=>{let r={};return t.forEach((t,n)=>{r[t]=e.dimensionValues[n]?.value||``}),n.forEach((t,n)=>{r[t]=parseFloat(e.metricValues[n].value)}),r});return{rows:r,rowCount:e.rowCount||r.length}}function u(t){let{decrypt:n}=t,r=(0,e.createRouter)();async function i(t){let{supabase:r,instanceId:i}=t.context.module,{data:a,error:o}=await r.from(`project_modules`).select(`config`).eq(`id`,i).single();if(o||!a?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load module config.`});let s=a.config,c=s.githubIntegration,l=s.githubRepo,u=s.githubOwner;if(!c||!l||!u)throw(0,e.createError)({statusCode:400,statusMessage:`No GitHub integration configured for this module.`});let{data:d,error:f}=await r.from(`integrations`).select(`config`).eq(`id`,c).single(),p=d?.config;if(f||!p){let{data:t,error:n}=await r.from(`agency_integrations`).select(`config`).eq(`id`,c).single();if(n||!t?.config)throw(0,e.createError)({statusCode:500,statusMessage:`Failed to load Github credentials.`});p=t.config}return{token:n(p.token),repo:l,owner:u}}return r.post(`/github/deploy`,(0,e.defineEventHandler)(async t=>{try{let{token:e,repo:n,owner:r}=await i(t);await fetch(`https://api.github.com/repos/${r}/${n}/dispatches`,{method:`POST`,headers:{Authorization:`Bearer ${e}`,Accept:`application/vnd.github+json`},body:JSON.stringify({event_type:`deploy-site`})})}catch(t){throw console.error(`Error triggering GitHub deployment:`,t),(0,e.createError)({statusCode:500,statusMessage:`Failed to trigger deployment.`})}})),r.handler}exports.appointments=n,exports.contentManager=u,exports.googleAnalytics=o,exports.products=t;