@oneclick.dev/cms-core-modules 0.0.109 → 0.0.110

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 (576) hide show
  1. package/dist/Acquisition-DNCy8nQz.mjs +400 -0
  2. package/dist/Acquisition-Dt2rREU8.js +1 -0
  3. package/dist/AgendaOpeningHoursCard-B7ROIPWw.js +1 -0
  4. package/dist/AgendaOpeningHoursCard-Cp4wxUeK.mjs +172 -0
  5. package/dist/AppointmentDetailsCard-33WpATpV.mjs +161 -0
  6. package/dist/AppointmentDetailsCard-DpLM5IrB.js +1 -0
  7. package/dist/AppointmentEditor-BeOtYV6u.mjs +196 -0
  8. package/dist/AppointmentEditor-CaTfbkIf.js +1 -0
  9. package/dist/AppointmentListTable-DZJNmTMb.mjs +177 -0
  10. package/dist/AppointmentListTable-Dieu9US_.js +1 -0
  11. package/dist/Audience-Bs7b0TNm.js +1 -0
  12. package/dist/Audience-CUeMVYRy.mjs +489 -0
  13. package/dist/Components-C83O-xlF.mjs +623 -0
  14. package/dist/Components-DXbx0RLV.js +1 -0
  15. package/dist/Content-BHr_rPVY.js +1 -0
  16. package/dist/Content-CYOZKvWK.mjs +358 -0
  17. package/dist/ContentEditor-BprPiHMJ.js +462 -0
  18. package/dist/ContentEditor-D9-1SJ5F.mjs +30700 -0
  19. package/dist/CountryBreakdownCard-D7BK3nRD.js +1 -0
  20. package/dist/CountryBreakdownCard-DVxNz2DJ.mjs +196 -0
  21. package/dist/Create-89z41K73.js +1 -0
  22. package/dist/Create-BCklc_T1.mjs +1251 -0
  23. package/dist/DateFormatter-CYAD4GBN.js +1 -0
  24. package/dist/DateFormatter-DUxlo8X8.mjs +734 -0
  25. package/dist/Detail-BCOcP2ql.mjs +585 -0
  26. package/dist/Detail-Btzwo0Y3.mjs +3477 -0
  27. package/dist/Detail-Byk781b4.mjs +26 -0
  28. package/dist/Detail-C857g62L.js +1 -0
  29. package/dist/Detail-C8wQiDcv.js +1 -0
  30. package/dist/Detail-CNlljBfH.mjs +379 -0
  31. package/dist/Detail-CPqug27l.js +1 -0
  32. package/dist/Detail-CjuhjPby.js +1 -0
  33. package/dist/Detail-DnX7tsqN.mjs +649 -0
  34. package/dist/Detail-mvSGbnFU.js +1 -0
  35. package/dist/DeviceBreakdownCard-DRhQ9ufG.js +1 -0
  36. package/dist/DeviceBreakdownCard-W1frLe0L.mjs +159 -0
  37. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs +76 -0
  38. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js +1 -0
  39. package/dist/Entries-BdhUyJR5.mjs +728 -0
  40. package/dist/Entries-CEXM_SkO.js +1 -0
  41. package/dist/Find-D4Qa45qC.js +1 -0
  42. package/dist/Find-DIISO5GO.mjs +229 -0
  43. package/dist/GlobalStyling-C9VthHWK.mjs +1588 -0
  44. package/dist/GlobalStyling-CnSlXkZc.js +25 -0
  45. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Ceoje52V.js +1 -0
  46. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Dh9jzvE0.mjs +1255 -0
  47. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-COrK1j0S.js +1 -0
  48. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-Vb3q8EVv.mjs +330 -0
  49. package/dist/Overview-BCpJNiEB.mjs +190 -0
  50. package/dist/Overview-BDlBCUI_.js +1 -0
  51. package/dist/Overview-BKAti8nc.mjs +567 -0
  52. package/dist/Overview-BbvfH1u-.js +1 -0
  53. package/dist/Overview-Bn1Xx3_j.js +1 -0
  54. package/dist/Overview-C-Jb_BxY.mjs +860 -0
  55. package/dist/Overview-CIa1E-HH.mjs +178 -0
  56. package/dist/Overview-DAxCu9XC.js +1 -0
  57. package/dist/Overview-DC9io1bk.js +1 -0
  58. package/dist/Overview-Di84CsR5.mjs +476 -0
  59. package/dist/Overview-Su8ZUbMs.mjs +26 -0
  60. package/dist/Overview-T-lsy3UZ.js +1 -0
  61. package/dist/Overview-UoZHUMUz.js +1 -0
  62. package/dist/Overview-lWAyyenp.mjs +632 -0
  63. package/dist/PeakHoursCard-9-EZFZLR.mjs +182 -0
  64. package/dist/PeakHoursCard-BR5zmta4.js +1 -0
  65. package/dist/ProductDetailsCard-6nHikw4V.mjs +121 -0
  66. package/dist/ProductDetailsCard-Bn7qrgmc.js +1 -0
  67. package/dist/RealtimeCard--APfRNc8.js +1 -0
  68. package/dist/RealtimeCard-fvQlJcM7.mjs +126 -0
  69. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CuwREvXD.js +349 -0
  70. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-GYNZ_yhD.mjs +3077 -0
  71. package/dist/SearchTermsCard-BsB-63aH.js +1 -0
  72. package/dist/SearchTermsCard-BzVrHKqQ.mjs +201 -0
  73. package/dist/SendPush-COns44j7.js +1 -0
  74. package/dist/SendPush-CPIOjVX4.mjs +184 -0
  75. package/dist/SeoHealth-MC3lSCOY.mjs +615 -0
  76. package/dist/SeoHealth-az1YuNF2.js +1 -0
  77. package/dist/TableView-DQW0A1oG.js +4 -0
  78. package/dist/TableView-DXHhJ-jm.mjs +6143 -0
  79. package/dist/TemplateList.vue_vue_type_script_setup_true_lang-B_AtWnHa.js +1 -0
  80. package/dist/TemplateList.vue_vue_type_script_setup_true_lang-Cmovy7kk.mjs +40 -0
  81. package/dist/TopPagesCard-BDeA997A.js +1 -0
  82. package/dist/TopPagesCard-CTozhOr_.mjs +159 -0
  83. package/dist/TrafficSourcesCard-BxtCKsqx.mjs +197 -0
  84. package/dist/TrafficSourcesCard-C3ziDTUL.js +1 -0
  85. package/dist/View-CsudjxCE.mjs +30 -0
  86. package/dist/View-Dw_wA6kK.js +1 -0
  87. package/dist/VisitorStatsCard-BmByE_Hi.js +1 -0
  88. package/dist/VisitorStatsCard-CXizEbVK.mjs +174 -0
  89. package/dist/_plugin-vue_export-helper-BHFhmbuH.js +1 -0
  90. package/dist/_plugin-vue_export-helper-CHgC5LLL.mjs +9 -0
  91. package/dist/agenda-DcatSSYQ.mjs +1165 -0
  92. package/dist/agenda-IOqtALWf.js +1 -0
  93. package/dist/array-CbATeQbk.js +1 -0
  94. package/dist/array-DT5pE8Gm.mjs +108 -0
  95. package/dist/availability-CMrRa5y2.mjs +269 -0
  96. package/dist/availability-Cf2YfMwM.js +1 -0
  97. package/dist/booking-data-DgJd0BcM.mjs +889 -0
  98. package/dist/booking-data-Di5GmH_8.js +1 -0
  99. package/dist/cms-core-modules.css +1 -2
  100. package/dist/countries-BTPvmrsb.mjs +4 -0
  101. package/dist/countries-CgZ081No.js +1 -0
  102. package/dist/exceptions-CI0B4xVj.js +1 -0
  103. package/dist/exceptions-YCQkHa6a.mjs +646 -0
  104. package/dist/google-CvtuJwgk.mjs +4 -0
  105. package/dist/google-D4N3gb01.js +1 -0
  106. package/dist/index-4tjmIans.js +1 -0
  107. package/dist/index-9HVlmvK3.js +1 -0
  108. package/dist/index-A2kp8Isi.js +75 -0
  109. package/dist/index-B5aBwdxY.js +54 -0
  110. package/dist/index-BFLV54kw.mjs +3843 -0
  111. package/dist/index-BWDwEd8D.mjs +24 -0
  112. package/dist/index-BfBBm9uY.mjs +24 -0
  113. package/dist/index-BhWvXMOp.mjs +176 -0
  114. package/dist/index-BiT55eU0.js +58 -0
  115. package/dist/index-Bkq58CeQ.mjs +22 -0
  116. package/dist/index-BzWmWCo5.mjs +1187 -0
  117. package/dist/index-CJQQBRLY.js +1 -0
  118. package/dist/index-CQkOH2_3.mjs +24 -0
  119. package/dist/index-CSxYBeVA.js +1 -0
  120. package/dist/index-CU-tbS5W.mjs +24 -0
  121. package/dist/index-CZn2nDLv.mjs +34 -0
  122. package/dist/index-CkiNvRzs.js +1 -0
  123. package/dist/index-Co4ON2Di.js +1 -0
  124. package/dist/index-Cpnn_Pxd.mjs +24 -0
  125. package/dist/index-CpzDEMeC.mjs +1443 -0
  126. package/dist/index-CsVeM3PA.mjs +24 -0
  127. package/dist/index-CwqrAU-H.js +1 -0
  128. package/dist/index-CxETuRsG.js +1 -0
  129. package/dist/index-Cz-baGax.js +1 -0
  130. package/dist/index-D30apIn-.mjs +110 -0
  131. package/dist/index-DFQGVHTs.js +1 -0
  132. package/dist/index-DPd3waTN.js +1 -0
  133. package/dist/index-DRqJOqUR.mjs +3484 -0
  134. package/dist/index-DjWuIBxh.js +1 -0
  135. package/dist/index-Dnn2SCSl.js +1 -0
  136. package/dist/index-Dpl9sU6a.mjs +12 -0
  137. package/dist/index-DrXxXB2F.mjs +138 -0
  138. package/dist/index-G7cIlnGN.js +158 -0
  139. package/dist/index-R2oUDsjx.js +1 -0
  140. package/dist/index-RLz1QPrf.mjs +203 -0
  141. package/dist/index-UtjLbLw-.js +1 -0
  142. package/dist/index-V78huaSJ.mjs +442 -0
  143. package/dist/index-cOnxXTbF.mjs +24 -0
  144. package/dist/index-hlylYYgy.mjs +24 -0
  145. package/dist/index-ijdf0d9-.js +1 -0
  146. package/dist/index-vHmvbEwa.js +35 -0
  147. package/dist/index-wjkEPsNx.mjs +2940 -0
  148. package/dist/index.cjs.js +1 -1
  149. package/dist/index.mjs +806 -1095
  150. package/dist/interpolation-CHn59tIC.js +1 -0
  151. package/dist/interpolation-w7IRDJwK.mjs +180 -0
  152. package/dist/orders-C65SlpJy.mjs +618 -0
  153. package/dist/orders-XVzWAgG1.js +1 -0
  154. package/dist/payment-C3ohkehF.mjs +1080 -0
  155. package/dist/payment-Dfr-Ro-a.js +1 -0
  156. package/dist/regular-1LXNPviB.js +1 -0
  157. package/dist/regular-_05oq5Tx.mjs +1101 -0
  158. package/dist/resources-CYOb5Bl6.mjs +811 -0
  159. package/dist/resources-CxeFd57z.js +1 -0
  160. package/dist/server-handlers.cjs.js +1 -1
  161. package/dist/server-handlers.mjs +996 -1049
  162. package/dist/src/appointments/chat-components/AgendaOpeningHoursCard.vue.d.ts +15 -0
  163. package/dist/src/appointments/chat-components/AppointmentDetailsCard.vue.d.ts +14 -0
  164. package/dist/src/appointments/chat-components/AppointmentEditor.vue.d.ts +14 -0
  165. package/dist/src/appointments/chat-components/AppointmentListTable.vue.d.ts +14 -0
  166. package/dist/src/appointments/components/create/StepNavigation.vue.d.ts +32 -0
  167. package/dist/src/appointments/components/create/regular/Step1.vue.d.ts +2 -0
  168. package/dist/src/appointments/components/create/regular/Step2.vue.d.ts +2 -0
  169. package/dist/src/appointments/components/create/regular/Step3.vue.d.ts +2 -0
  170. package/dist/src/appointments/components/create/regular/Step4.vue.d.ts +2 -0
  171. package/dist/src/appointments/components/edit/CustomerInformationFieldEditorDialog.vue.d.ts +24 -0
  172. package/dist/src/appointments/components/edit/EditLayout.vue.d.ts +17 -0
  173. package/dist/src/appointments/components/edit/Event24hSidebar.vue.d.ts +2 -0
  174. package/dist/src/appointments/components/edit/EventDialog/ApproveReservationDialog.vue.d.ts +8 -0
  175. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +136 -0
  176. package/dist/src/appointments/components/edit/EventDialog/CancelReservationDialog.vue.d.ts +8 -0
  177. package/dist/src/appointments/components/edit/EventDialog/EventDialog.vue.d.ts +11 -0
  178. package/dist/src/appointments/components/edit/EventDialog/OrderDetailDialog.vue.d.ts +55 -0
  179. package/dist/src/appointments/components/edit/EventDialog/RejectReservationDialog.vue.d.ts +8 -0
  180. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +87 -0
  181. package/dist/src/appointments/components/edit/EventDialog/TimelineChart.vue.d.ts +24 -0
  182. package/dist/src/appointments/components/edit/EventDialog/TransferReservationDialog.vue.d.ts +4 -0
  183. package/dist/src/appointments/components/edit/EventTimeIndicator.vue.d.ts +12 -0
  184. package/dist/src/appointments/components/edit/EventTimeline.vue.d.ts +48 -0
  185. package/dist/src/appointments/components/edit/EventView.vue.d.ts +9 -0
  186. package/dist/src/appointments/components/edit/ExceptionDialog.vue.d.ts +29 -0
  187. package/dist/src/appointments/components/edit/MetadataSchemaEditorDialog.vue.d.ts +12 -0
  188. package/dist/src/appointments/components/edit/NewReservationDialog/CustomerInformation.vue.d.ts +10 -0
  189. package/dist/src/appointments/components/edit/NewReservationDialog/NewReservationDialog.vue.d.ts +26 -0
  190. package/dist/src/appointments/components/edit/NewReservationDialog/QuickReservationAdder.vue.d.ts +26 -0
  191. package/dist/src/appointments/components/edit/NewReservationDialog/ReservationLines.vue.d.ts +31 -0
  192. package/dist/src/appointments/components/edit/OrderMetadataDisplay.vue.d.ts +21 -0
  193. package/dist/src/appointments/components/edit/PaymentAddons/Addon.vue.d.ts +22 -0
  194. package/dist/src/appointments/components/edit/PaymentAddons/AddonList.vue.d.ts +5 -0
  195. package/dist/src/appointments/components/edit/PaymentAddons/index.vue.d.ts +15 -0
  196. package/dist/src/appointments/components/edit/ResourceEditorDialog.vue.d.ts +13 -0
  197. package/dist/src/appointments/components/edit/dashboard/Timeline.vue.d.ts +36 -0
  198. package/dist/src/appointments/components/edit/dashboard/timeline/ResourceSelector.vue.d.ts +50 -0
  199. package/dist/src/appointments/index.d.ts +12 -9
  200. package/dist/src/appointments/index.vue.d.ts +22 -0
  201. package/dist/src/appointments/metadata.d.ts +1 -1
  202. package/dist/src/appointments/pages/Overview.vue.d.ts +4 -0
  203. package/dist/src/appointments/pages/create/index.vue.d.ts +2 -0
  204. package/dist/src/appointments/pages/create/regular.vue.d.ts +6 -0
  205. package/dist/src/appointments/pages/edit/agenda.vue.d.ts +4 -0
  206. package/dist/src/appointments/pages/edit/availability.vue.d.ts +2 -0
  207. package/dist/src/appointments/pages/edit/booking-data.vue.d.ts +65 -0
  208. package/dist/src/appointments/pages/edit/index.vue.d.ts +2 -0
  209. package/dist/src/appointments/pages/edit/payment.vue.d.ts +2 -0
  210. package/dist/src/appointments/pages/edit/resources.vue.d.ts +28 -0
  211. package/dist/src/appointments/routes.d.ts +6 -3
  212. package/dist/src/contentManager/components/components/ComponentDialog.vue.d.ts +12 -0
  213. package/dist/src/contentManager/components/components/ComponentGridItem.vue.d.ts +16 -0
  214. package/dist/src/contentManager/components/content-editor/ApiDocs.vue.d.ts +2 -0
  215. package/dist/src/contentManager/components/content-editor/ContentLayout.vue.d.ts +49 -0
  216. package/dist/src/contentManager/components/content-editor/ContentSettings.vue.d.ts +24 -0
  217. package/dist/src/contentManager/components/content-editor/ContentStructuredContentSections.vue.d.ts +4 -0
  218. package/dist/src/contentManager/components/content-editor/Header.vue.d.ts +64 -0
  219. package/dist/src/contentManager/components/content-editor/LivePreviewWrapper.vue.d.ts +53 -0
  220. package/dist/src/contentManager/components/content-editor/Locales.vue.d.ts +44 -0
  221. package/dist/src/contentManager/components/content-editor/NewSectionDialog.vue.d.ts +21 -0
  222. package/dist/src/contentManager/components/content-editor/PageSettings.vue.d.ts +2 -0
  223. package/dist/src/contentManager/components/content-editor/SEO.vue.d.ts +14 -0
  224. package/dist/src/contentManager/components/content-editor/SidebarSectionWrapper.vue.d.ts +39 -0
  225. package/dist/src/contentManager/components/content-editor/Status.vue.d.ts +2 -0
  226. package/dist/src/contentManager/components/content-editor/Versions.vue.d.ts +63 -0
  227. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Button.vue.d.ts +94 -0
  228. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Card.vue.d.ts +92 -0
  229. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Column.vue.d.ts +92 -0
  230. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Container.vue.d.ts +92 -0
  231. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Divider.vue.d.ts +92 -0
  232. package/dist/src/contentManager/components/content-editor/tiptap-extensions/EmptySpace.vue.d.ts +94 -0
  233. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Heading.vue.d.ts +92 -0
  234. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Image.vue.d.ts +92 -0
  235. package/dist/src/contentManager/components/content-editor/tiptap-extensions/LockBlocks.d.ts +0 -15
  236. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Map.vue.d.ts +92 -0
  237. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Paragraph.vue.d.ts +92 -0
  238. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Row.vue.d.ts +115 -0
  239. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Stack.vue.d.ts +115 -0
  240. package/dist/src/contentManager/components/content-editor/tiptap-extensions/TrailingNodeInContainers.d.ts +1 -4
  241. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Video.vue.d.ts +92 -0
  242. package/dist/src/contentManager/components/content-editor/tiptap-extensions/extension-details/DetailsNodeView.vue.d.ts +92 -0
  243. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/NodeLabel.vue.d.ts +108 -0
  244. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/ResizeHandlers.vue.d.ts +20 -0
  245. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/TopMarginDragger.vue.d.ts +104 -0
  246. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuClassBuilder.vue.d.ts +19 -0
  247. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuLinkBuilder.vue.d.ts +19 -0
  248. package/dist/src/contentManager/components/content-editor/tiptap-menus/BubbleMenuToggleButton.vue.d.ts +29 -0
  249. package/dist/src/contentManager/components/content-editor/tiptap-menus/DefaultBubbleMenu.vue.d.ts +13 -0
  250. package/dist/src/contentManager/components/content-editor/tiptap-menus/ElementEditorMenu.vue.d.ts +19 -0
  251. package/dist/src/contentManager/components/content-editor/tiptap-menus/EmojiMenu.vue.d.ts +8 -0
  252. package/dist/src/contentManager/components/content-editor/tiptap-menus/NewNodeView.vue.d.ts +47 -0
  253. package/dist/src/contentManager/components/content-editor/tiptap-menus/SlashMenu.vue.d.ts +6 -0
  254. package/dist/src/contentManager/components/content-editor/tiptap-menus/SlashMenuButton.vue.d.ts +17 -0
  255. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ButtonMenu.vue.d.ts +13 -0
  256. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/CardMenu.vue.d.ts +13 -0
  257. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ColumnMenu.vue.d.ts +13 -0
  258. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/DividerMenu.vue.d.ts +13 -0
  259. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/EmptySpaceMenu.vue.d.ts +13 -0
  260. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/HeadingMenu.vue.d.ts +13 -0
  261. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/ImageMenu.vue.d.ts +13 -0
  262. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/MapMenu.vue.d.ts +13 -0
  263. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/RowMenu.vue.d.ts +13 -0
  264. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/StackMenu.vue.d.ts +13 -0
  265. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/TextMenu.vue.d.ts +13 -0
  266. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/VideoMenu.vue.d.ts +13 -0
  267. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/index.d.ts +132 -12
  268. package/dist/src/contentManager/components/overview/CollectionDialog.vue.d.ts +30 -0
  269. package/dist/src/contentManager/components/overview/CollectionsGridView.vue.d.ts +18 -0
  270. package/dist/src/contentManager/components/overview/ContentEntryContextMenu.vue.d.ts +27 -0
  271. package/dist/src/contentManager/components/overview/FilterPopover.vue.d.ts +2 -0
  272. package/dist/src/contentManager/components/overview/ListView.vue.d.ts +12 -0
  273. package/dist/src/contentManager/components/styling/ButtonStyleDialog.vue.d.ts +24 -0
  274. package/dist/src/contentManager/components/styling/CardStyleDialog.vue.d.ts +24 -0
  275. package/dist/src/contentManager/components/styling/SectionStyleDialog.vue.d.ts +24 -0
  276. package/dist/src/contentManager/index.d.ts +14 -5
  277. package/dist/src/contentManager/index.vue.d.ts +22 -0
  278. package/dist/src/contentManager/metadata.d.ts +1 -1
  279. package/dist/src/contentManager/pages/Components.vue.d.ts +27 -0
  280. package/dist/src/contentManager/pages/ContentEditor.vue.d.ts +14 -0
  281. package/dist/src/contentManager/pages/Entries.vue.d.ts +16 -0
  282. package/dist/src/contentManager/pages/GlobalStyling.vue.d.ts +117 -0
  283. package/dist/src/contentManager/pages/Overview.vue.d.ts +57 -0
  284. package/dist/src/contentManager/routes.d.ts +12 -3
  285. package/dist/src/custom/index.d.ts +2 -2
  286. package/dist/src/custom/index.vue.d.ts +2 -0
  287. package/dist/src/custom/pages/View.vue.d.ts +2 -0
  288. package/dist/src/custom/routes.d.ts +1 -1
  289. package/dist/src/googleAnalytics/chat-components/CountryBreakdownCard.vue.d.ts +14 -0
  290. package/dist/src/googleAnalytics/chat-components/DeviceBreakdownCard.vue.d.ts +14 -0
  291. package/dist/src/googleAnalytics/chat-components/PeakHoursCard.vue.d.ts +14 -0
  292. package/dist/src/googleAnalytics/chat-components/RealtimeCard.vue.d.ts +14 -0
  293. package/dist/src/googleAnalytics/chat-components/SearchTermsCard.vue.d.ts +14 -0
  294. package/dist/src/googleAnalytics/chat-components/TopPagesCard.vue.d.ts +14 -0
  295. package/dist/src/googleAnalytics/chat-components/TrafficSourcesCard.vue.d.ts +14 -0
  296. package/dist/src/googleAnalytics/chat-components/VisitorStatsCard.vue.d.ts +14 -0
  297. package/dist/src/googleAnalytics/components/seo-health/SeoClicksChart.vue.d.ts +5 -0
  298. package/dist/src/googleAnalytics/components/seo-health/SeoImpressionsChart.vue.d.ts +5 -0
  299. package/dist/src/googleAnalytics/components/seo-health/SeoKeywordsTab.vue.d.ts +5 -0
  300. package/dist/src/googleAnalytics/components/seo-health/SeoKpiCards.vue.d.ts +10 -0
  301. package/dist/src/googleAnalytics/components/seo-health/SeoMappingTab.vue.d.ts +5 -0
  302. package/dist/src/googleAnalytics/components/seo-health/SeoPagesTab.vue.d.ts +5 -0
  303. package/dist/src/googleAnalytics/components/seo-health/SeoRankingDistribution.vue.d.ts +5 -0
  304. package/dist/src/googleAnalytics/index.d.ts +10 -10
  305. package/dist/src/googleAnalytics/index.vue.d.ts +2 -0
  306. package/dist/src/googleAnalytics/pages/Acquisition.vue.d.ts +2 -0
  307. package/dist/src/googleAnalytics/pages/Audience.vue.d.ts +2 -0
  308. package/dist/src/googleAnalytics/pages/Content.vue.d.ts +2 -0
  309. package/dist/src/googleAnalytics/pages/Overview.vue.d.ts +2 -0
  310. package/dist/src/googleAnalytics/pages/SeoHealth.vue.d.ts +2 -0
  311. package/dist/src/googleAnalytics/routes.d.ts +1 -1
  312. package/dist/src/mailTemplates/components/TemplateList.vue.d.ts +2 -0
  313. package/dist/src/mailTemplates/index.d.ts +3 -3
  314. package/dist/src/mailTemplates/index.vue.d.ts +22 -0
  315. package/dist/src/mailTemplates/metadata.d.ts +1 -1
  316. package/dist/src/mailTemplates/pages/Detail.vue.d.ts +14 -0
  317. package/dist/src/mailTemplates/pages/Overview.vue.d.ts +14 -0
  318. package/dist/src/mailTemplates/routes.d.ts +1 -1
  319. package/dist/src/productCollections/components/detail/Main.vue.d.ts +2 -0
  320. package/dist/src/productCollections/components/detail/SEO.vue.d.ts +2 -0
  321. package/dist/src/productCollections/components/detail/Status.vue.d.ts +2 -0
  322. package/dist/src/productCollections/components/overview/ListView.vue.d.ts +12 -0
  323. package/dist/src/productCollections/index.d.ts +3 -3
  324. package/dist/src/productCollections/index.vue.d.ts +22 -0
  325. package/dist/src/productCollections/metadata.d.ts +1 -1
  326. package/dist/src/productCollections/pages/Detail.vue.d.ts +14 -0
  327. package/dist/src/productCollections/pages/Overview.vue.d.ts +16 -0
  328. package/dist/src/productCollections/routes.d.ts +1 -1
  329. package/dist/src/products/chat-components/ProductDetailsCard.vue.d.ts +14 -0
  330. package/dist/src/products/components/detail/Collections.vue.d.ts +14 -0
  331. package/dist/src/products/components/detail/Inventory.vue.d.ts +2 -0
  332. package/dist/src/products/components/detail/Main.vue.d.ts +2 -0
  333. package/dist/src/products/components/detail/NewSection.vue.d.ts +2 -0
  334. package/dist/src/products/components/detail/Price.vue.d.ts +2 -0
  335. package/dist/src/products/components/detail/SEO.vue.d.ts +2 -0
  336. package/dist/src/products/components/detail/Shipping.vue.d.ts +2 -0
  337. package/dist/src/products/components/detail/Status.vue.d.ts +2 -0
  338. package/dist/src/products/components/detail/price/UnitPriceDialog.vue.d.ts +17 -0
  339. package/dist/src/products/components/detail/variants/Option.vue.d.ts +33 -0
  340. package/dist/src/products/components/detail/variants/VariantList.vue.d.ts +38 -0
  341. package/dist/src/products/components/overview/FilterPopover.vue.d.ts +2 -0
  342. package/dist/src/products/components/overview/GridView.vue.d.ts +12 -0
  343. package/dist/src/products/components/overview/ListView.vue.d.ts +12 -0
  344. package/dist/src/products/components/overview/ProductContextMenu.vue.d.ts +27 -0
  345. package/dist/src/products/index.d.ts +4 -4
  346. package/dist/src/products/index.vue.d.ts +22 -0
  347. package/dist/src/products/metadata.d.ts +1 -1
  348. package/dist/src/products/pages/Detail.vue.d.ts +14 -0
  349. package/dist/src/products/pages/Overview.vue.d.ts +16 -0
  350. package/dist/src/products/routes.d.ts +1 -1
  351. package/dist/src/promoCodes/components/create/DateRange.vue.d.ts +2 -0
  352. package/dist/src/promoCodes/components/create/MultiCodes.vue.d.ts +2 -0
  353. package/dist/src/promoCodes/components/create/Note.vue.d.ts +2 -0
  354. package/dist/src/promoCodes/components/create/SingleCode.vue.d.ts +2 -0
  355. package/dist/src/promoCodes/components/create/TypeAndValue/TypeDetailDialog.vue.d.ts +6 -0
  356. package/dist/src/promoCodes/components/create/TypeAndValue/TypeManageDialog.vue.d.ts +18 -0
  357. package/dist/src/promoCodes/components/create/TypeAndValue/index.vue.d.ts +2 -0
  358. package/dist/src/promoCodes/index.d.ts +3 -3
  359. package/dist/src/promoCodes/index.vue.d.ts +22 -0
  360. package/dist/src/promoCodes/metadata.d.ts +1 -1
  361. package/dist/src/promoCodes/pages/Create.vue.d.ts +16 -0
  362. package/dist/src/promoCodes/pages/Detail.vue.d.ts +14 -0
  363. package/dist/src/promoCodes/pages/Find.vue.d.ts +16 -0
  364. package/dist/src/promoCodes/routes.d.ts +1 -1
  365. package/dist/src/push-notifications/components/PreviewAndroid.vue.d.ts +28 -0
  366. package/dist/src/push-notifications/components/PreviewIPhone.vue.d.ts +28 -0
  367. package/dist/src/push-notifications/components/PushPreview.vue.d.ts +28 -0
  368. package/dist/src/push-notifications/index.d.ts +3 -3
  369. package/dist/src/push-notifications/index.vue.d.ts +22 -0
  370. package/dist/src/push-notifications/metadata.d.ts +1 -1
  371. package/dist/src/push-notifications/pages/SendPush.vue.d.ts +14 -0
  372. package/dist/src/push-notifications/routes.d.ts +1 -1
  373. package/dist/src/shared/BrandLogo.vue.d.ts +12 -0
  374. package/dist/src/shared/DrawerToggle.vue.d.ts +60 -0
  375. package/dist/src/shared/VerticalToggle.vue.d.ts +60 -0
  376. package/dist/src/shippingOptions/components/detail/Condition.vue.d.ts +2 -0
  377. package/dist/src/shippingOptions/components/detail/Countries.vue.d.ts +2 -0
  378. package/dist/src/shippingOptions/components/detail/Example.vue.d.ts +2 -0
  379. package/dist/src/shippingOptions/components/detail/Main.vue.d.ts +2 -0
  380. package/dist/src/shippingOptions/components/overview/ListView.vue.d.ts +12 -0
  381. package/dist/src/shippingOptions/index.d.ts +3 -3
  382. package/dist/src/shippingOptions/index.vue.d.ts +22 -0
  383. package/dist/src/shippingOptions/metadata.d.ts +1 -1
  384. package/dist/src/shippingOptions/pages/Detail.vue.d.ts +14 -0
  385. package/dist/src/shippingOptions/pages/Overview.vue.d.ts +16 -0
  386. package/dist/src/shippingOptions/routes.d.ts +1 -1
  387. package/dist/src/table/components/DataTable.vue.d.ts +18 -0
  388. package/dist/src/table/components/DataTableAction.vue.d.ts +14 -0
  389. package/dist/src/table/components/DataTableMobileRowActionDrawer.vue.d.ts +4 -0
  390. package/dist/src/table/components/DataTablePagination.vue.d.ts +6 -0
  391. package/dist/src/table/components/actions/ActionDialog.vue.d.ts +19 -0
  392. package/dist/src/table/components/actions/CtaActionDialog.vue.d.ts +4 -0
  393. package/dist/src/table/components/columns/ColumnDropdown.vue.d.ts +2 -0
  394. package/dist/src/table/components/columns/ColumnEditorDialog.vue.d.ts +34 -0
  395. package/dist/src/table/components/columns/DialogTableColumnItem.vue.d.ts +12 -0
  396. package/dist/src/table/components/date-range-filter/DateRangeFilter.vue.d.ts +2 -0
  397. package/dist/src/table/components/date-range-filter/DateRangeSettingsDialog.vue.d.ts +27 -0
  398. package/dist/src/table/components/filters/FilterDialog.vue.d.ts +12 -0
  399. package/dist/src/table/components/filters/Filters.vue.d.ts +27 -0
  400. package/dist/src/table/components/search/Search.vue.d.ts +2 -0
  401. package/dist/src/table/components/sort/SortMode.vue.d.ts +2 -0
  402. package/dist/src/table/components/sort/SortModeSettingsDialog.vue.d.ts +18 -0
  403. package/dist/src/table/components/stats/StatDialog.vue.d.ts +12 -0
  404. package/dist/src/table/components/stats/Stats.vue.d.ts +27 -0
  405. package/dist/src/table/flow-builder-extensions/TableRowEditor.vue.d.ts +16 -0
  406. package/dist/src/table/flow-builder-extensions/row-item.d.ts +17 -3
  407. package/dist/src/table/index.d.ts +2 -2
  408. package/dist/src/table/index.vue.d.ts +22 -0
  409. package/dist/src/table/pages/TableView.vue.d.ts +54 -0
  410. package/dist/src/table/routes.d.ts +1 -1
  411. package/dist/src/types/index.d.ts +0 -6
  412. package/dist/utils-CanmrIWO.mjs +47 -0
  413. package/dist/utils-Yd6F5mea.js +3 -0
  414. package/dist/vee-validate-zod-ByykgYKJ.js +1 -0
  415. package/dist/vee-validate-zod-DNjTLCgh.mjs +4402 -0
  416. package/package.json +56 -55
  417. package/dist/Acquisition-DypEyPSO.js +0 -1
  418. package/dist/Acquisition-TCNX-th6.mjs +0 -308
  419. package/dist/AgendaOpeningHoursCard-BIhm0vpV.js +0 -1
  420. package/dist/AgendaOpeningHoursCard-BKUdJxRI.mjs +0 -133
  421. package/dist/AppointmentDetailsCard-C5rQ5jsW.js +0 -1
  422. package/dist/AppointmentDetailsCard-NRHeNP2L.mjs +0 -111
  423. package/dist/AppointmentEditor-BcF8CiD-.mjs +0 -150
  424. package/dist/AppointmentEditor-BlhFtoCm.js +0 -1
  425. package/dist/AppointmentListTable-B-ReBVtV.js +0 -1
  426. package/dist/AppointmentListTable-DHmy-iid.mjs +0 -129
  427. package/dist/Audience-CfWHjjg8.mjs +0 -394
  428. package/dist/Audience-Cj4TyauW.js +0 -1
  429. package/dist/Components-BehelN4r.js +0 -1
  430. package/dist/Components-CR6zukUU.mjs +0 -468
  431. package/dist/Content-C5Iye3t0.mjs +0 -257
  432. package/dist/Content-eOfBx52Y.js +0 -1
  433. package/dist/ContentEditor-BgL4qEeg.mjs +0 -26835
  434. package/dist/ContentEditor-Tlu3w0Hu.js +0 -462
  435. package/dist/CountryBreakdownCard-CWVyB8be.mjs +0 -151
  436. package/dist/CountryBreakdownCard-Db-pMiNe.js +0 -1
  437. package/dist/Create-B1it8S4m.js +0 -1
  438. package/dist/Create-DbYi0FAI.mjs +0 -907
  439. package/dist/DateFormatter-DLrDYkby.mjs +0 -630
  440. package/dist/DateFormatter-Dni0Oq8r.js +0 -1
  441. package/dist/Detail-D-eahJGO.mjs +0 -21
  442. package/dist/Detail-D0kdPPIm.mjs +0 -2757
  443. package/dist/Detail-DAafePYi.mjs +0 -485
  444. package/dist/Detail-DYpv4fYg.js +0 -1
  445. package/dist/Detail-Dc_ui4LM.js +0 -1
  446. package/dist/Detail-DccUekl_.js +0 -1
  447. package/dist/Detail-Dhz0V0Vf.js +0 -1
  448. package/dist/Detail-DjnGY0F8.mjs +0 -282
  449. package/dist/Detail-DplAitHg.mjs +0 -447
  450. package/dist/Detail-SugyeSxb.js +0 -1
  451. package/dist/DeviceBreakdownCard-CzxZT6To.js +0 -1
  452. package/dist/DeviceBreakdownCard-eEwPjzKl.mjs +0 -115
  453. package/dist/EditLayout-Bnz9q_jd.js +0 -1
  454. package/dist/EditLayout-J_DGXb8v.mjs +0 -99
  455. package/dist/Entries-CgpWg6fE.js +0 -1
  456. package/dist/Entries-CkGTXcAq.mjs +0 -575
  457. package/dist/Find-Bz0TNJzk.mjs +0 -164
  458. package/dist/Find-D-ItTXaZ.js +0 -1
  459. package/dist/GlobalStyling-CSQPF7o_.mjs +0 -1162
  460. package/dist/GlobalStyling-DabldMZh.js +0 -15
  461. package/dist/NewReservationDialog-BhIiY2B9.js +0 -1
  462. package/dist/NewReservationDialog-CN49aGcM.mjs +0 -1002
  463. package/dist/OrderDetailDialog-BJ01DZFe.js +0 -1
  464. package/dist/OrderDetailDialog-CoVQ_rzs.mjs +0 -215
  465. package/dist/Overview-9FMgn5hT.mjs +0 -492
  466. package/dist/Overview-BOOwMQ-c.mjs +0 -636
  467. package/dist/Overview-Biz3h60w.js +0 -1
  468. package/dist/Overview-C2K2ofdS.js +0 -1
  469. package/dist/Overview-CFHOXP9N.mjs +0 -123
  470. package/dist/Overview-CTJe7J5_.js +0 -1
  471. package/dist/Overview-Cvj2i9eW.js +0 -1
  472. package/dist/Overview-D2I1F8Dm.mjs +0 -21
  473. package/dist/Overview-DFOc9emt.mjs +0 -345
  474. package/dist/Overview-Dmhfb94Y.js +0 -1
  475. package/dist/Overview-PPzv7weG.mjs +0 -450
  476. package/dist/Overview-qFKcXHVF.js +0 -1
  477. package/dist/Overview-xkmYYTae.mjs +0 -133
  478. package/dist/Overview-yPsLvR2c.js +0 -1
  479. package/dist/PeakHoursCard-CtgEP-ez.mjs +0 -157
  480. package/dist/PeakHoursCard-DPeoMyhu.js +0 -1
  481. package/dist/ProductDetailsCard-B0WhmzO-.mjs +0 -98
  482. package/dist/ProductDetailsCard-C1ROuH6l.js +0 -1
  483. package/dist/RealtimeCard-DQno-Okz.js +0 -1
  484. package/dist/RealtimeCard-dR-g1iDo.mjs +0 -92
  485. package/dist/ReservationDetailDialog-Cdo6h0RD.mjs +0 -2163
  486. package/dist/ReservationDetailDialog-DZTFD2xI.js +0 -349
  487. package/dist/SearchTermsCard-BXJSXz_k.js +0 -1
  488. package/dist/SearchTermsCard-DsaxLKwP.mjs +0 -146
  489. package/dist/SendPush-Bssi-OZD.mjs +0 -150
  490. package/dist/SendPush-BuaYboRH.js +0 -1
  491. package/dist/SeoHealth-CP-kL0us.js +0 -1
  492. package/dist/SeoHealth-Cxp_Gb3Y.mjs +0 -459
  493. package/dist/TableView-7iwBkQ_k.mjs +0 -4757
  494. package/dist/TableView-BB_oIYYZ.js +0 -4
  495. package/dist/TemplateList-CNcM_Kgq.mjs +0 -56
  496. package/dist/TemplateList-VuPcBUJO.js +0 -1
  497. package/dist/TopPagesCard-CvDECn3_.mjs +0 -117
  498. package/dist/TopPagesCard-DNdATXJE.js +0 -1
  499. package/dist/TrafficSourcesCard-BLpBr7u0.mjs +0 -151
  500. package/dist/TrafficSourcesCard-_3gRUCw3.js +0 -1
  501. package/dist/View-DSnUHI7h.mjs +0 -30
  502. package/dist/View-Dbcfpdqh.js +0 -1
  503. package/dist/VisitorStatsCard-CFEnXSjF.mjs +0 -185
  504. package/dist/VisitorStatsCard-C_jhQxDW.js +0 -1
  505. package/dist/_plugin-vue_export-helper-5u7tqpWC.js +0 -1
  506. package/dist/_plugin-vue_export-helper-BJQSo0im.mjs +0 -8
  507. package/dist/agenda-CzMRcQTA.mjs +0 -989
  508. package/dist/agenda-D4zWRYSQ.js +0 -1
  509. package/dist/appointments-9syR5TZE.js +0 -1
  510. package/dist/appointments-BBmOJMhM.mjs +0 -23
  511. package/dist/array-BH1uH7XT.js +0 -1
  512. package/dist/array-DnDL9cFz.mjs +0 -98
  513. package/dist/availability-CAXB7Yd6.js +0 -1
  514. package/dist/availability-Dp7eF-ZK.mjs +0 -215
  515. package/dist/booking-data-Bysf6e5x.mjs +0 -724
  516. package/dist/booking-data-C6SGjC2X.js +0 -1
  517. package/dist/chunk-DQi1bQcV.js +0 -1
  518. package/dist/contentManager-D7JxXCwE.js +0 -1
  519. package/dist/contentManager-tfy0x1LD.mjs +0 -22
  520. package/dist/context-AQKfnJ4t.mjs +0 -3809
  521. package/dist/context-ubyMq9Xe.js +0 -54
  522. package/dist/core-Dhgr4ctC.mjs +0 -202
  523. package/dist/core-_HKfBlaZ.js +0 -1
  524. package/dist/countries-MXLT3mVe.mjs +0 -4
  525. package/dist/countries-OCd5qPxG.js +0 -1
  526. package/dist/create-BfNc2C7N.js +0 -1
  527. package/dist/create-C7JlIlIh.mjs +0 -95
  528. package/dist/custom-BwN9-6Mb.js +0 -1
  529. package/dist/custom-INNwaWla.mjs +0 -13
  530. package/dist/dist-BCVg7FKM.js +0 -1
  531. package/dist/dist-DIhK9VWh.mjs +0 -3045
  532. package/dist/edit-BiI2VG60.js +0 -35
  533. package/dist/edit-DD3iFBEh.mjs +0 -1097
  534. package/dist/exceptions-DICMaDcH.mjs +0 -462
  535. package/dist/exceptions-DpWqMNuG.js +0 -1
  536. package/dist/google-Bcc4XZnV.mjs +0 -4
  537. package/dist/google-DTSRmJ51.js +0 -1
  538. package/dist/googleAnalytics-BSaqRR_L.js +0 -1
  539. package/dist/googleAnalytics-Cg-iWblZ.mjs +0 -47
  540. package/dist/interpolation-B8OzkMyi.mjs +0 -131
  541. package/dist/interpolation-DpAqtGOW.js +0 -1
  542. package/dist/lib-4wSi00Vr.js +0 -1
  543. package/dist/lib-BZgXUui5.mjs +0 -198
  544. package/dist/line-DJdnFNI7.js +0 -75
  545. package/dist/line-tYLnEDGV.mjs +0 -1500
  546. package/dist/mailTemplates-BNk8fhVS.mjs +0 -23
  547. package/dist/mailTemplates-DswHzyQe.js +0 -1
  548. package/dist/orders-CIc0JlKX.mjs +0 -512
  549. package/dist/orders-DwPSi_pD.js +0 -1
  550. package/dist/payment-BsNWFaDm.js +0 -1
  551. package/dist/payment-Ced5_dpa.mjs +0 -718
  552. package/dist/productCollections-Cuvw_8zC.js +0 -1
  553. package/dist/productCollections-D0AxRlzr.mjs +0 -23
  554. package/dist/products-DUD-ZMkR.mjs +0 -22
  555. package/dist/products-DvX9B-Ul.js +0 -1
  556. package/dist/promoCodes-BCWqN6w4.mjs +0 -23
  557. package/dist/promoCodes-CEZ4LYot.js +0 -1
  558. package/dist/push-notifications-BGp4XWo9.js +0 -1
  559. package/dist/push-notifications-C7W7KuzR.mjs +0 -23
  560. package/dist/regular-BCFrS6lK.mjs +0 -908
  561. package/dist/regular-DBqPgT8C.js +0 -1
  562. package/dist/resources-DwsMmWgm.mjs +0 -669
  563. package/dist/resources-Dz81GkHe.js +0 -1
  564. package/dist/shippingOptions-C3NEJff1.mjs +0 -23
  565. package/dist/shippingOptions-Cy040ZW1.js +0 -1
  566. package/dist/single-container-BJmmqq65.mjs +0 -468
  567. package/dist/single-container-Xoo0Xzxv.js +0 -58
  568. package/dist/src/vue-shim.d.ts +0 -7
  569. package/dist/table-DWw0fs3S.js +0 -1
  570. package/dist/table-LXt5DQOL.mjs +0 -23
  571. package/dist/utils-CVIHqQsU.js +0 -3
  572. package/dist/utils-h3owcMtS.mjs +0 -37
  573. package/dist/vee-validate-zod-BmXMJo8W.js +0 -1
  574. package/dist/vee-validate-zod-D9dZzbWZ.mjs +0 -4985
  575. package/dist/xy-container-CuQSwrtB.mjs +0 -3180
  576. package/dist/xy-container-_6YpscZh.js +0 -158
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),Z=require("./EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js"),u=require("lucide-vue-next"),M=require("@oneclick.dev/cms-kit"),ee=require("./index-CxETuRsG.js"),te={class:"space-y-5 py-4"},oe={class:"flex flex-wrap gap-2 mt-2"},ne=["onClick"],le={class:"space-y-2"},ae={class:"flex items-center justify-between mb-2"},se={class:"text-sm font-medium"},re={class:"flex items-center gap-1"},de={class:"space-y-2"},ie={key:0,class:"text-sm text-muted-foreground italic py-1"},ce={class:"flex items-center justify-between rounded-lg border p-4"},ue={class:"space-y-0.5"},me={class:"text-xs text-muted-foreground"},pe={class:"w-full flex justify-between items-center gap-4 flex-col @sm/dialog-footer:flex-row"},ve={class:"flex items-center gap-2 ml-auto w-full @sm/dialog-footer:w-auto flex-col-reverse @sm/dialog-footer:flex-row"},fe=e.defineComponent({__name:"ResourceEditorDialog",emits:["add-resource","update-resource","remove-resource"],setup(Q,{expose:R,emit:y}){const C=y,i=e.ref(!1),p=e.ref("add"),d=["#ef4444","#f97316","#f59e0b","#eab308","#84cc16","#22c55e","#10b981","#14b8a6","#06b6d4","#0ea5e9","#3b82f6","#6366f1","#8b5cf6","#a855f7","#d946ef","#ec4899","#f43f5e"],g=[{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"}],n=e.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}),w=r=>{p.value=r?"edit":"add",n.id=r?.id||"",n.name=r?.name||"",n.publicLabel=r?.publicLabel||"",n.avatarLabel=r?.avatarLabel||"",n.description=r?.description||"",n.capacity=r?.capacity||1,n.interval=r?.interval||30,n.openingHours=r?.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:[]},n.color=r?.color||"blue",n.isActive=r?.isActive!==void 0?r.isActive:!0,i.value=!0},N=()=>{i.value=!1},k=()=>{C("add-resource",{...n}),i.value=!1},A=()=>{C("update-resource",{...n}),i.value=!1},f=()=>{C("remove-resource",n.id),i.value=!1},E=e.computed(()=>n.name.trim().length>0),z=r=>{n.openingHours[r]||(n.openingHours[r]=[]),n.openingHours[r].push({start:"09:00",end:"17:00"})},h=(r,t)=>{n.openingHours[r].splice(t,1)},L=r=>{const t=n.openingHours[r];g.forEach(x=>{n.openingHours[x.value]=JSON.parse(JSON.stringify(t))})},$=r=>{n.openingHours[r]=[]};return R({openDialog:w}),(r,t)=>{const x=e.resolveComponent("DialogTitle"),I=e.resolveComponent("DialogDescription"),D=e.resolveComponent("DialogHeader"),l=e.resolveComponent("Label"),o=e.resolveComponent("Input"),c=e.resolveComponent("NumberFieldDecrement"),U=e.resolveComponent("NumberFieldInput"),F=e.resolveComponent("NumberFieldIncrement"),b=e.resolveComponent("NumberFieldContent"),H=e.resolveComponent("NumberField"),j=e.resolveComponent("SelectValue"),q=e.resolveComponent("SelectTrigger"),V=e.resolveComponent("SelectItem"),O=e.resolveComponent("SelectContent"),B=e.resolveComponent("Select"),m=e.resolveComponent("Button"),P=e.resolveComponent("DropdownMenuTrigger"),S=e.resolveComponent("DropdownMenuItem"),Y=e.resolveComponent("DropdownMenuContent"),J=e.resolveComponent("DropdownMenu"),W=e.resolveComponent("Textarea"),s=e.resolveComponent("Switch"),_=e.resolveComponent("DialogFooter"),G=e.resolveComponent("DialogScrollContent"),X=e.resolveComponent("Dialog");return e.openBlock(),e.createBlock(X,{open:i.value,"onUpdate:open":t[7]||(t[7]=a=>i.value=a)},{default:e.withCtx(()=>[e.createVNode(G,{class:"sm:max-w-xl lg:max-w-2xl"},{default:e.withCtx(()=>[e.createVNode(D,null,{default:e.withCtx(()=>[e.createVNode(x,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.value==="add"?"Add New Resource":"Edit Resource"),1)]),_:1}),e.createVNode(I,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.value==="add"?"Define a new bookable resource such as staff member, room, or equipment.":"Update the details of this resource."),1)]),_:1})]),_:1}),e.createElementVNode("div",te,[e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-name"},{default:e.withCtx(()=>[...t[8]||(t[8]=[e.createTextVNode(" Resource Name ",-1),e.createElementVNode("span",{class:"text-destructive"},"*",-1)])]),_:1}),e.createVNode(o,{modelValue:n.name,"onUpdate:modelValue":t[0]||(t[0]=a=>n.name=a),id:"resource-name",placeholder:"e.g., James, Box 1, Meeting Room A"},null,8,["modelValue"]),t[9]||(t[9]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-1"}," Internal name visible to your team. ",-1))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-public-label"},{default:e.withCtx(()=>[...t[10]||(t[10]=[e.createTextVNode(" Public Label ",-1)])]),_:1}),e.createVNode(o,{modelValue:n.publicLabel,"onUpdate:modelValue":t[1]||(t[1]=a=>n.publicLabel=a),id:"resource-public-label",placeholder:"Name shown to customers"},null,8,["modelValue"]),t[11]||(t[11]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-1"}," If empty, the internal name will be displayed to customers. ",-1))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-avatar-label"},{default:e.withCtx(()=>[...t[12]||(t[12]=[e.createTextVNode(" Avatar Label ",-1)])]),_:1}),e.createVNode(o,{modelValue:n.avatarLabel,"onUpdate:modelValue":t[2]||(t[2]=a=>n.avatarLabel=a),id:"resource-avatar-label",placeholder:"e.g., B1, 1, JD",maxlength:"3"},null,8,["modelValue"]),t[13]||(t[13]=e.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))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5"},{default:e.withCtx(()=>[...t[14]||(t[14]=[e.createTextVNode("Color",-1)])]),_:1}),e.createElementVNode("div",oe,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(d,a=>e.createElementVNode("button",{key:a,type:"button",class:e.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",[n.color===a?"ring-2 ring-ring ring-offset-2":"hover:scale-110"]]),style:e.normalizeStyle({background:a}),onClick:v=>n.color=a},null,14,ne)),64))]),t[15]||(t[15]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-2"}," Used for visual identification in the calendar. ",-1))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-capacity"},{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode(" Capacity ",-1)])]),_:1}),e.createVNode(H,{id:"resource-capacity",modelValue:n.capacity,"onUpdate:modelValue":t[3]||(t[3]=a=>n.capacity=a),min:1,max:999},{default:e.withCtx(()=>[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(c),e.createVNode(U),e.createVNode(F)]),_:1})]),_:1},8,["modelValue"]),t[17]||(t[17]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-1"}," Maximum simultaneous bookings allowed for this resource. ",-1))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-interval"},{default:e.withCtx(()=>[...t[18]||(t[18]=[e.createTextVNode(" Booking Interval ",-1)])]),_:1}),e.createVNode(B,{modelValue:n.interval,"onUpdate:modelValue":t[4]||(t[4]=a=>n.interval=a),modelModifiers:{number:!0}},{default:e.withCtx(()=>[e.createVNode(q,{id:"resource-interval"},{default:e.withCtx(()=>[e.createVNode(j,{placeholder:"Select interval"})]),_:1}),e.createVNode(O,null,{default:e.withCtx(()=>[e.createVNode(V,{value:5},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode("5 minutes",-1)])]),_:1}),e.createVNode(V,{value:10},{default:e.withCtx(()=>[...t[20]||(t[20]=[e.createTextVNode("10 minutes",-1)])]),_:1}),e.createVNode(V,{value:15},{default:e.withCtx(()=>[...t[21]||(t[21]=[e.createTextVNode("15 minutes",-1)])]),_:1}),e.createVNode(V,{value:30},{default:e.withCtx(()=>[...t[22]||(t[22]=[e.createTextVNode("30 minutes",-1)])]),_:1}),e.createVNode(V,{value:60},{default:e.withCtx(()=>[...t[23]||(t[23]=[e.createTextVNode("1 hour",-1)])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t[24]||(t[24]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-1"}," Time slots will be generated at this interval within operating hours. ",-1))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-2 flex items-center gap-2"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Clock),{class:"w-4 h-4"}),t[25]||(t[25]=e.createTextVNode(" Operating Hours ",-1))]),_:1}),e.createElementVNode("div",le,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(g,a=>e.createElementVNode("div",{key:a.value,class:"rounded-md bg-muted/30 p-2 sm:p-3"},[e.createElementVNode("div",ae,[e.createElementVNode("span",se,e.toDisplayString(a.label),1),e.createElementVNode("div",re,[e.createVNode(m,{variant:"outline",size:"sm",class:"h-7 px-2 text-xs",onClick:v=>z(a.value)},{default:e.withCtx(()=>[...t[26]||(t[26]=[e.createTextVNode(" Add ",-1)])]),_:1},8,["onClick"]),e.createVNode(J,null,{default:e.withCtx(()=>[e.createVNode(P,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(m,{variant:"ghost",size:"icon",class:"size-7"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.MoreHorizontal),{class:"w-4 h-4"})]),_:1})]),_:1}),e.createVNode(Y,{align:"end"},{default:e.withCtx(()=>[e.createVNode(S,{onClick:v=>L(a.value)},{default:e.withCtx(()=>[...t[27]||(t[27]=[e.createTextVNode(" Copy to all days ",-1)])]),_:1},8,["onClick"]),e.createVNode(S,{onClick:v=>$(a.value),variant:"destructive"},{default:e.withCtx(()=>[...t[28]||(t[28]=[e.createTextVNode(" Set as closed ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)])]),e.createElementVNode("div",de,[n.openingHours[a.value]?.length===0?(e.openBlock(),e.createElementBlock("div",ie," Closed ")):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.openingHours[a.value],(v,K)=>(e.openBlock(),e.createElementBlock("div",{key:K,class:"flex items-center gap-1.5 sm:gap-2"},[e.createVNode(o,{modelValue:v.start,"onUpdate:modelValue":T=>v.start=T,type:"time",class:"flex-1 min-w-0 h-8 text-sm"},null,8,["modelValue","onUpdate:modelValue"]),t[29]||(t[29]=e.createElementVNode("span",{class:"text-muted-foreground text-xs sm:text-sm shrink-0"},"to",-1)),e.createVNode(o,{modelValue:v.end,"onUpdate:modelValue":T=>v.end=T,type:"time",class:"flex-1 min-w-0 h-8 text-sm"},null,8,["modelValue","onUpdate:modelValue"]),e.createVNode(m,{variant:"ghost",size:"icon",class:"size-7 shrink-0",onClick:T=>h(a.value,K)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Trash2),{class:"w-3.5 h-3.5 text-destructive"})]),_:1},8,["onClick"])]))),128))])])),64))]),t[30]||(t[30]=e.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))]),e.createElementVNode("div",null,[e.createVNode(l,{class:"text-sm font-normal mb-1.5",for:"resource-description"},{default:e.withCtx(()=>[...t[31]||(t[31]=[e.createTextVNode(" Description ",-1)])]),_:1}),e.createVNode(W,{modelValue:n.description,"onUpdate:modelValue":t[5]||(t[5]=a=>n.description=a),id:"resource-description",placeholder:"Internal notes about this resource...",rows:"3"},null,8,["modelValue"]),t[32]||(t[32]=e.createElementVNode("p",{class:"text-xs text-muted-foreground mt-1"}," Admin-only notes. Not shown to customers. ",-1))]),e.createElementVNode("div",ce,[e.createElementVNode("div",ue,[e.createVNode(l,{class:"text-sm font-medium"},{default:e.withCtx(()=>[...t[33]||(t[33]=[e.createTextVNode("Active",-1)])]),_:1}),e.createElementVNode("p",me,e.toDisplayString(n.isActive?"Resource can be used for new slots and bookings.":"Existing bookings stay, but no new ones can be created."),1)]),e.createVNode(s,{modelValue:n.isActive,"onUpdate:modelValue":t[6]||(t[6]=a=>n.isActive=a)},null,8,["modelValue"])])]),e.createVNode(_,{class:"@container/dialog-footer gap-2"},{default:e.withCtx(()=>[e.createElementVNode("div",pe,[p.value==="edit"?(e.openBlock(),e.createBlock(m,{key:0,variant:"destructive",onClick:f,class:"w-full @sm/dialog-footer:w-auto"},{default:e.withCtx(()=>[...t[34]||(t[34]=[e.createTextVNode(" Delete Resource ",-1)])]),_:1})):e.createCommentVNode("",!0),e.createElementVNode("div",ve,[e.createVNode(m,{variant:"outline",onClick:N,class:"w-full @sm/dialog-footer:w-auto"},{default:e.withCtx(()=>[...t[35]||(t[35]=[e.createTextVNode(" Cancel ",-1)])]),_:1}),p.value==="add"?(e.openBlock(),e.createBlock(m,{key:0,onClick:k,disabled:!E.value,class:"w-full @sm/dialog-footer:w-auto"},{default:e.withCtx(()=>[...t[36]||(t[36]=[e.createTextVNode(" Add Resource ",-1)])]),_:1},8,["disabled"])):(e.openBlock(),e.createBlock(m,{key:1,onClick:A,disabled:!E.value,class:"w-full @sm/dialog-footer:w-auto"},{default:e.withCtx(()=>[...t[37]||(t[37]=[e.createTextVNode(" Save Changes ",-1)])]),_:1},8,["disabled"]))])])]),_:1})]),_:1})]),_:1},8,["open"])}}}),xe={class:"@container/resources"},Ve={class:"flex flex-col @lg/resources:flex-row @lg/resources:items-center @lg/resources:justify-between gap-4 mb-6"},ge={class:"space-y-6"},Ne={key:0,class:"flex flex-col @md/resources:flex-row gap-4 items-start @md/resources:items-center justify-between"},Ce={class:"relative w-full @md/resources:w-64"},we={class:"text-sm text-muted-foreground"},be={key:1,class:"grid grid-cols-1 @2xl/resources:grid-cols-2 @4xl/resources:grid-cols-3 gap-4"},_e={class:"p-4 pl-5"},ye={class:"flex items-start gap-3"},ke={class:"flex-1 min-w-0"},Ee={class:"flex items-center gap-2"},he={class:"font-semibold truncate text-base"},De={key:0},Be={key:0,class:"text-sm text-muted-foreground truncate"},Se={key:0,class:"text-sm text-muted-foreground mt-3 line-clamp-2"},Te={class:"flex items-center flex-wrap gap-3 mt-4 pt-3 border-t"},Me={class:"flex items-center gap-1.5 text-xs text-muted-foreground"},Re={class:"flex items-center gap-1.5 text-xs text-muted-foreground"},Ae={class:"flex items-center gap-2"},ze={class:"text-xs text-muted-foreground"},Le={key:1,class:"flex items-center gap-1.5 text-xs text-orange-500"},$e={key:2,class:"text-center py-8 text-muted-foreground"},Ie={key:3,class:"flex justify-center py-12"},Ue={key:5,class:"fixed bottom-4 right-4 bg-background border rounded-lg px-4 py-2 shadow-lg flex items-center gap-2"},Fe=e.defineComponent({__name:"resources",setup(Q){const{width:R}=ee.useWindowSize(),{params:y}=M.useModuleRoute(),{confirm:C}=M.useConfirmation(),{config:i}=M.useModule(),p=M.useFirebaseIntegration(i.project),d=e.ref([]),g=e.ref(!1),n=e.ref(!0),w=e.ref(),N=e.ref(""),k=()=>Date.now().toString(36)+Math.random().toString(36).substr(2),A=async()=>{try{n.value=!0;const l=await p.get(i.agendaCollection,y.value.id);d.value=l.resources||[]}catch(l){console.error("Error loading resources:",l)}finally{n.value=!1}},f=async()=>{g.value=!0;try{await p.update(i.agendaCollection,y.value.id,{resources:d.value})}catch(l){console.error("Error saving resources:",l)}finally{g.value=!1}},E=l=>{const o={...l,id:k()};d.value.push(o),f()},z=l=>{const o=d.value.findIndex(c=>c.id===l.id);o!==-1&&(d.value[o]=l),f()},h=async l=>{await C("Are you sure you want to delete this resource? This action cannot be undone.","Delete Resource","Delete")&&(d.value=d.value.filter(c=>c.id!==l),f())},L=async l=>{const o=d.value.findIndex(c=>c.id===l.id);o!==-1&&(d.value[o].isActive=!d.value[o].isActive,await f())},$=l=>{const o={...l,id:k(),name:`${l.name} (Copy)`,publicLabel:l.publicLabel?`${l.publicLabel} (Copy)`:""};d.value.push(o),f()},r=()=>{w.value?.openDialog()},t=l=>{w.value?.openDialog(l)},x=e.computed(()=>{if(!N.value.trim())return d.value;const l=N.value.toLowerCase();return d.value.filter(o=>o.name.toLowerCase().includes(l)||o.publicLabel?.toLowerCase().includes(l))}),I=e.computed(()=>d.value.filter(l=>l.isActive).length),D=e.computed(()=>d.value.length);return A(),(l,o)=>{const c=e.resolveComponent("Button"),U=e.resolveComponent("Input"),F=e.resolveComponent("DropdownMenuTrigger"),b=e.resolveComponent("DropdownMenuItem"),H=e.resolveComponent("DropdownMenuSeparator"),j=e.resolveComponent("DropdownMenuContent"),q=e.resolveComponent("DropdownMenu"),V=e.resolveComponent("Switch"),O=e.resolveComponent("Card"),B=e.resolveComponent("Spinner"),m=e.resolveComponent("EmptyMedia"),P=e.resolveComponent("EmptyTitle"),S=e.resolveComponent("EmptyDescription"),Y=e.resolveComponent("EmptyHeader"),J=e.resolveComponent("EmptyContent"),W=e.resolveComponent("Empty");return e.openBlock(),e.createBlock(Z._sfc_main,null,{default:e.withCtx(()=>[e.createElementVNode("div",xe,[e.createElementVNode("div",Ve,[o[2]||(o[2]=e.createElementVNode("div",null,[e.createElementVNode("h1",{class:"text-lg font-medium"},"Resource Management"),e.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?(e.openBlock(),e.createBlock(c,{key:0,onClick:r},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Plus),{class:"size-4 mr-1.5"}),o[1]||(o[1]=e.createTextVNode(" Add Resource ",-1))]),_:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",ge,[d.value.length>0?(e.openBlock(),e.createElementBlock("div",Ne,[e.createElementVNode("div",Ce,[e.createVNode(U,{modelValue:N.value,"onUpdate:modelValue":o[0]||(o[0]=s=>N.value=s),placeholder:"Search resources...",class:"pl-9"},null,8,["modelValue"]),o[3]||(o[3]=e.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"},[e.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))]),e.createElementVNode("div",we,e.toDisplayString(I.value)+" active of "+e.toDisplayString(D.value)+" resource"+e.toDisplayString(D.value!==1?"s":""),1)])):e.createCommentVNode("",!0),x.value.length>0?(e.openBlock(),e.createElementBlock("div",be,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,s=>(e.openBlock(),e.createBlock(O,{key:s.id,class:e.normalizeClass(["group relative overflow-hidden transition-all duration-200 hover:shadow-md",s.isActive?"":"opacity-60 grayscale-[30%]"])},{default:e.withCtx(()=>[e.createElementVNode("div",{class:"absolute inset-y-0 left-0 w-1 transition-all duration-200 group-hover:w-1.5",style:e.normalizeStyle({background:s.color})},null,4),e.createElementVNode("div",_e,[e.createElementVNode("div",ye,[e.createElementVNode("div",{class:"size-11 rounded-xl flex-shrink-0 flex items-center justify-center text-white font-semibold text-sm shadow-sm",style:e.normalizeStyle({background:s.color})},e.toDisplayString(s.avatarLabel||s.name.charAt(0).toUpperCase()),5),e.createElementVNode("div",ke,[e.createElementVNode("div",Ee,[e.createElementVNode("h3",he,[e.createTextVNode(e.toDisplayString(s.name)+" ",1),s.isActive?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",De,"(Inactive)"))])]),s.publicLabel&&s.publicLabel!==s.name?(e.openBlock(),e.createElementBlock("p",Be,e.toDisplayString(s.publicLabel),1)):e.createCommentVNode("",!0)]),e.createVNode(q,null,{default:e.withCtx(()=>[e.createVNode(F,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(c,{variant:"ghost",size:"icon",class:"size-8"},{default:e.withCtx(()=>[...o[4]||(o[4]=[e.createElementVNode("svg",{class:"size-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e.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}),e.createVNode(j,{align:"end"},{default:e.withCtx(()=>[e.createVNode(b,{onClick:_=>t(s)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Pencil),{class:"size-4 mr-2"}),o[5]||(o[5]=e.createTextVNode(" Edit ",-1))]),_:1},8,["onClick"]),e.createVNode(b,{onClick:_=>$(s)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Copy),{class:"size-4 mr-2"}),o[6]||(o[6]=e.createTextVNode(" Duplicate ",-1))]),_:1},8,["onClick"]),e.createVNode(H),e.createVNode(b,{variant:"destructive",onClick:_=>h(s.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Trash2),{class:"size-4 mr-2"}),o[7]||(o[7]=e.createTextVNode(" Delete ",-1))]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),s.description?(e.openBlock(),e.createElementBlock("p",Se,e.toDisplayString(s.description),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Te,[e.createElementVNode("div",Me,[e.createVNode(e.unref(u.Users),{class:"size-3.5"}),e.createElementVNode("span",null,e.toDisplayString(s.capacity)+" "+e.toDisplayString(s.capacity===1?"slot":"slots"),1)]),e.createElementVNode("div",Re,[o[8]||(o[8]=e.createElementVNode("svg",{class:"size-3.5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e.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)),e.createElementVNode("span",null,e.toDisplayString(s.interval)+" min",1)]),e.unref(R)>=640?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[o[9]||(o[9]=e.createElementVNode("div",{class:"flex-1"},null,-1)),e.createElementVNode("div",Ae,[e.createElementVNode("span",ze,e.toDisplayString(s.isActive?"Active":"Inactive"),1),e.createVNode(V,{defaultValue:s.isActive,"onUpdate:modelValue":_=>L(s),class:"scale-90"},null,8,["defaultValue","onUpdate:modelValue"])])],64)):s.isActive?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Le,[e.createVNode(e.unref(u.CircleAlert),{class:"size-3.5"}),o[10]||(o[10]=e.createElementVNode("span",null,"Inactive",-1))]))])])]),_:2},1032,["class"]))),128))])):d.value.length>0&&x.value.length===0?(e.openBlock(),e.createElementBlock("div",$e,[...o[11]||(o[11]=[e.createElementVNode("p",null,"No resources match your search.",-1)])])):n.value?(e.openBlock(),e.createElementBlock("div",Ie,[e.createVNode(B,{class:"size-8"})])):(e.openBlock(),e.createBlock(W,{key:4,class:"border border-dashed"},{default:e.withCtx(()=>[e.createVNode(Y,null,{default:e.withCtx(()=>[e.createVNode(m,{variant:"icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Users),{class:"size-6"})]),_:1}),e.createVNode(P,null,{default:e.withCtx(()=>[...o[12]||(o[12]=[e.createTextVNode("No Resources Yet",-1)])]),_:1}),e.createVNode(S,null,{default:e.withCtx(()=>[...o[13]||(o[13]=[e.createTextVNode(" You haven't added any bookable resources yet. Define your staff, rooms, or equipment to start configuring availability. ",-1)])]),_:1})]),_:1}),e.createVNode(J,null,{default:e.withCtx(()=>[e.createVNode(c,{variant:"outline",onClick:r},{default:e.withCtx(()=>[e.createVNode(e.unref(u.Plus),{class:"size-4 mr-1.5"}),o[14]||(o[14]=e.createTextVNode(" Add Your First Resource ",-1))]),_:1})]),_:1})]),_:1})),g.value?(e.openBlock(),e.createElementBlock("div",Ue,[e.createVNode(B,{class:"size-4"}),o[15]||(o[15]=e.createElementVNode("span",{class:"text-sm"},"Saving...",-1))])):e.createCommentVNode("",!0)])]),e.createVNode(fe,{ref_key:"resourceDialogRef",ref:w,onAddResource:E,onUpdateResource:z,onRemoveResource:h},null,512)]),_:1})}}});exports.default=Fe;
@@ -1 +1 @@
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;
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;