@devvistatech/devvista-kit 0.0.1

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 (377) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +7 -0
  3. package/README.md +15 -0
  4. package/app/about/page.tsx +306 -0
  5. package/app/adRequest/page.tsx +550 -0
  6. package/app/analytics/page.tsx +347 -0
  7. package/app/api/about/route.ts +307 -0
  8. package/app/api/adRequest/route.ts +568 -0
  9. package/app/api/analytics/[reportType]/route.ts +338 -0
  10. package/app/api/bio/route.ts +314 -0
  11. package/app/api/blog/route.ts +307 -0
  12. package/app/api/chat/route.ts +15 -0
  13. package/app/api/contact/route.ts +410 -0
  14. package/app/api/contacts/route.ts +225 -0
  15. package/app/api/files/route.ts +430 -0
  16. package/app/api/gallery-data/route.ts +661 -0
  17. package/app/api/schedule/route.ts +456 -0
  18. package/app/api/sync-user/route.ts +114 -0
  19. package/app/api/trial-request/route.ts +298 -0
  20. package/app/blog/[id]/page.tsx +281 -0
  21. package/app/blog/page.tsx +217 -0
  22. package/app/constants/about.ts +49 -0
  23. package/app/constants/adRequest.ts +114 -0
  24. package/app/constants/contact.ts +41 -0
  25. package/app/constants/faq.ts +46 -0
  26. package/app/constants/gallery.ts +43 -0
  27. package/app/constants/page.ts +70 -0
  28. package/app/constants/schedule.ts +72 -0
  29. package/app/contact/page.tsx +285 -0
  30. package/app/faq/page.tsx +192 -0
  31. package/app/favicon.ico +0 -0
  32. package/app/gallery/page.tsx +320 -0
  33. package/app/globals.css +58 -0
  34. package/app/layout.tsx +62 -0
  35. package/app/page.tsx +339 -0
  36. package/app/schedule/page.tsx +661 -0
  37. package/bin/init.js +187 -0
  38. package/components/addOns/functional/BioEditor.tsx +430 -0
  39. package/components/addOns/functional/CalendlyWidget.tsx +101 -0
  40. package/components/addOns/functional/ClassList.tsx +146 -0
  41. package/components/addOns/functional/ClassPopup.tsx +399 -0
  42. package/components/addOns/functional/ContactForm.tsx +285 -0
  43. package/components/addOns/functional/FileUploader.tsx +293 -0
  44. package/components/addOns/functional/ImageDescCarousel.tsx +821 -0
  45. package/components/addOns/functional/NewUserAnalytics.tsx +101 -0
  46. package/components/addOns/functional/ScheduleCarousel.tsx +172 -0
  47. package/components/addOns/functional/aboutSections/AboutSection.tsx +571 -0
  48. package/components/addOns/functional/aboutSections/constants/aboutSection.ts +66 -0
  49. package/components/addOns/functional/blogSections/BlogDashboard.tsx +185 -0
  50. package/components/addOns/functional/blogSections/BlogFormPopUp.tsx +555 -0
  51. package/components/addOns/functional/blogSections/BlogList.tsx +149 -0
  52. package/components/addOns/functional/blogSections/BlogSidebar.tsx +59 -0
  53. package/components/addOns/functional/blogSections/constants/blogDashboard.ts +29 -0
  54. package/components/addOns/functional/blogSections/constants/blogFormPopUp.ts +98 -0
  55. package/components/addOns/functional/blogSections/constants/blogList.ts +23 -0
  56. package/components/addOns/functional/blogSections/constants/blogSidebar.ts +16 -0
  57. package/components/addOns/functional/contactsDashboard/ContactsDashboard.tsx +348 -0
  58. package/components/addOns/functional/contactsDashboard/constants/contactsDashboard.ts +71 -0
  59. package/components/addOns/functional/galleries/GalleryComplex.tsx +908 -0
  60. package/components/addOns/functional/galleries/GallerySimple.tsx +604 -0
  61. package/components/addOns/functional/galleries/constants/galleryComplex.ts +105 -0
  62. package/components/addOns/functional/galleries/constants/gallerySimple.ts +75 -0
  63. package/components/addOns/functional/schedules/ScheduleGridOne.tsx +263 -0
  64. package/components/addOns/functional/schedules/ScheduleGridTwo.tsx +295 -0
  65. package/components/addOns/functional/schedules/ScheduleGridTwoBasic.tsx +289 -0
  66. package/components/addOns/functional/schedules/SchedulerForm.tsx +429 -0
  67. package/components/addOns/functional/schedules/constants/ScheduleGridTwo.ts +41 -0
  68. package/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.ts +41 -0
  69. package/components/addOns/functional/schedules/constants/SchedulerForm.ts +66 -0
  70. package/components/addOns/functional/schedules/constants/scheduleGridOne.ts +55 -0
  71. package/components/addOns/non-functional/AnnouncementBanner.tsx +47 -0
  72. package/components/addOns/non-functional/FeaturesSection.tsx +63 -0
  73. package/components/addOns/non-functional/HeroSection.tsx +143 -0
  74. package/components/addOns/non-functional/IconBubble.tsx +50 -0
  75. package/components/addOns/non-functional/SampleCarousel.tsx +205 -0
  76. package/components/addOns/non-functional/Testimonials.tsx +336 -0
  77. package/components/addOns/non-functional/ThreeSetGallery.tsx +64 -0
  78. package/components/addOns/non-functional/aboutSections/AboutSection.tsx +63 -0
  79. package/components/addOns/non-functional/aboutSections/constants/aboutSection.ts +25 -0
  80. package/components/addOns/non-functional/imageCarousels/ProductSlider.tsx +118 -0
  81. package/components/addOns/non-functional/imageCarousels/ProgramCarousel.tsx +233 -0
  82. package/components/addOns/non-functional/imageCarousels/constants/programCarousel.ts +40 -0
  83. package/components/addOns/non-functional/imageCarousels/constants/programSlider.ts +37 -0
  84. package/components/addOns/non-functional/spinner.tsx +22 -0
  85. package/components/footers/footer.tsx +454 -0
  86. package/components/navBars/navbar.tsx +311 -0
  87. package/components/other/accordion.tsx +58 -0
  88. package/components/other/admin-menu.tsx +69 -0
  89. package/components/other/alert-dialog.tsx +141 -0
  90. package/components/other/alert.tsx +59 -0
  91. package/components/other/aspect-ratio.tsx +7 -0
  92. package/components/other/avatar.tsx +50 -0
  93. package/components/other/badge.tsx +36 -0
  94. package/components/other/breadcrumb.tsx +115 -0
  95. package/components/other/button.tsx +733 -0
  96. package/components/other/calendar.tsx +66 -0
  97. package/components/other/card.tsx +86 -0
  98. package/components/other/carousel.tsx +275 -0
  99. package/components/other/chart.tsx +363 -0
  100. package/components/other/checkbox.tsx +30 -0
  101. package/components/other/collapsible.tsx +11 -0
  102. package/components/other/command.tsx +155 -0
  103. package/components/other/context-menu.tsx +200 -0
  104. package/components/other/dialog.tsx +122 -0
  105. package/components/other/drawer.tsx +118 -0
  106. package/components/other/dropdown-menu.tsx +200 -0
  107. package/components/other/form.tsx +179 -0
  108. package/components/other/hover-card.tsx +29 -0
  109. package/components/other/input-otp.tsx +71 -0
  110. package/components/other/input.tsx +25 -0
  111. package/components/other/label.tsx +26 -0
  112. package/components/other/login-popup.tsx +0 -0
  113. package/components/other/menubar.tsx +236 -0
  114. package/components/other/mobile-icon.tsx +22 -0
  115. package/components/other/navigation-menu.tsx +128 -0
  116. package/components/other/pagination.tsx +117 -0
  117. package/components/other/popover.tsx +31 -0
  118. package/components/other/progress.tsx +28 -0
  119. package/components/other/radio-group.tsx +44 -0
  120. package/components/other/resizable.tsx +45 -0
  121. package/components/other/scroll-area.tsx +48 -0
  122. package/components/other/select.tsx +160 -0
  123. package/components/other/separator.tsx +31 -0
  124. package/components/other/sheet.tsx +140 -0
  125. package/components/other/signup-popup.tsx +0 -0
  126. package/components/other/skeleton.tsx +15 -0
  127. package/components/other/slider.tsx +28 -0
  128. package/components/other/social-icons.tsx +40 -0
  129. package/components/other/sonner.tsx +31 -0
  130. package/components/other/switch.tsx +29 -0
  131. package/components/other/table.tsx +117 -0
  132. package/components/other/tabs.tsx +55 -0
  133. package/components/other/textarea.tsx +24 -0
  134. package/components/other/toast.tsx +123 -0
  135. package/components/other/toaster.tsx +35 -0
  136. package/components/other/toggle-group.tsx +61 -0
  137. package/components/other/toggle.tsx +45 -0
  138. package/components/other/tooltip.tsx +30 -0
  139. package/components/theme-provider.tsx +9 -0
  140. package/components/types.ts +22 -0
  141. package/dist/.next/types/app/api/about/route.js +52 -0
  142. package/dist/.next/types/app/api/blog/route.js +52 -0
  143. package/dist/.next/types/app/api/files/route.js +52 -0
  144. package/dist/.next/types/app/api/schedule/route.js +52 -0
  145. package/dist/.next/types/app/api/sync-user/route.js +52 -0
  146. package/dist/.next/types/app/layout.js +22 -0
  147. package/dist/.next/types/app/page.js +22 -0
  148. package/dist/app/about/page.jsx +259 -0
  149. package/dist/app/adRequest/page.jsx +531 -0
  150. package/dist/app/analytics/page.jsx +298 -0
  151. package/dist/app/api/about/route.js +285 -0
  152. package/dist/app/api/adRequest/route.js +440 -0
  153. package/dist/app/api/analytics/[reportType]/route.js +346 -0
  154. package/dist/app/api/bio/route.js +293 -0
  155. package/dist/app/api/blog/route.js +366 -0
  156. package/dist/app/api/chat/route.js +58 -0
  157. package/dist/app/api/contact/route.js +163 -0
  158. package/dist/app/api/contacts/route.js +234 -0
  159. package/dist/app/api/files/route.js +444 -0
  160. package/dist/app/api/gallery-data/route.js +642 -0
  161. package/dist/app/api/schedule/route.js +461 -0
  162. package/dist/app/api/sync-user/route.js +174 -0
  163. package/dist/app/api/trial-request/route.js +165 -0
  164. package/dist/app/blog/[id]/page.jsx +307 -0
  165. package/dist/app/blog/page.jsx +210 -0
  166. package/dist/app/constants/about.js +32 -0
  167. package/dist/app/constants/adRequest.js +113 -0
  168. package/dist/app/constants/contact.js +40 -0
  169. package/dist/app/constants/faq.js +36 -0
  170. package/dist/app/constants/gallery.js +42 -0
  171. package/dist/app/constants/page.js +69 -0
  172. package/dist/app/constants/schedule.js +71 -0
  173. package/dist/app/contact/page.jsx +119 -0
  174. package/dist/app/faq/page.jsx +97 -0
  175. package/dist/app/gallery/page.jsx +280 -0
  176. package/dist/app/layout.jsx +45 -0
  177. package/dist/app/page.jsx +324 -0
  178. package/dist/app/schedule/page.jsx +500 -0
  179. package/dist/components/addOns/functional/BioEditor.jsx +175 -0
  180. package/dist/components/addOns/functional/CalendlyWidget.jsx +61 -0
  181. package/dist/components/addOns/functional/ClassList.jsx +158 -0
  182. package/dist/components/addOns/functional/ClassPopup.jsx +300 -0
  183. package/dist/components/addOns/functional/ContactForm.jsx +219 -0
  184. package/dist/components/addOns/functional/FileUploader.jsx +222 -0
  185. package/dist/components/addOns/functional/ImageDescCarousel.jsx +464 -0
  186. package/dist/components/addOns/functional/NewUserAnalytics.jsx +71 -0
  187. package/dist/components/addOns/functional/ScheduleCarousel.jsx +68 -0
  188. package/dist/components/addOns/functional/aboutSections/AboutSection.jsx +369 -0
  189. package/dist/components/addOns/functional/aboutSections/constants/aboutSection.js +65 -0
  190. package/dist/components/addOns/functional/blogSections/BlogDashboard.jsx +111 -0
  191. package/dist/components/addOns/functional/blogSections/BlogFormPopUp.jsx +465 -0
  192. package/dist/components/addOns/functional/blogSections/BlogList.jsx +170 -0
  193. package/dist/components/addOns/functional/blogSections/BlogSidebar.jsx +35 -0
  194. package/dist/components/addOns/functional/blogSections/constants/blogDashboard.js +28 -0
  195. package/dist/components/addOns/functional/blogSections/constants/blogFormPopUp.js +97 -0
  196. package/dist/components/addOns/functional/blogSections/constants/blogList.js +22 -0
  197. package/dist/components/addOns/functional/blogSections/constants/blogSidebar.js +15 -0
  198. package/dist/components/addOns/functional/contactsDashboard/ContactsDashboard.jsx +323 -0
  199. package/dist/components/addOns/functional/contactsDashboard/constants/contactsDashboard.js +70 -0
  200. package/dist/components/addOns/functional/galleries/GalleryComplex.jsx +586 -0
  201. package/dist/components/addOns/functional/galleries/GallerySimple.jsx +385 -0
  202. package/dist/components/addOns/functional/galleries/constants/galleryComplex.js +104 -0
  203. package/dist/components/addOns/functional/galleries/constants/gallerySimple.js +74 -0
  204. package/dist/components/addOns/functional/schedules/ScheduleGridOne.jsx +167 -0
  205. package/dist/components/addOns/functional/schedules/ScheduleGridTwo.jsx +100 -0
  206. package/dist/components/addOns/functional/schedules/ScheduleGridTwoBasic.jsx +97 -0
  207. package/dist/components/addOns/functional/schedules/SchedulerForm.jsx +188 -0
  208. package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwo.js +40 -0
  209. package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.js +40 -0
  210. package/dist/components/addOns/functional/schedules/constants/SchedulerForm.js +65 -0
  211. package/dist/components/addOns/functional/schedules/constants/scheduleGridOne.js +54 -0
  212. package/dist/components/addOns/non-functional/AnnouncementBanner.jsx +24 -0
  213. package/dist/components/addOns/non-functional/FeaturesSection.jsx +38 -0
  214. package/dist/components/addOns/non-functional/HeroSection.jsx +71 -0
  215. package/dist/components/addOns/non-functional/IconBubble.jsx +36 -0
  216. package/dist/components/addOns/non-functional/SampleCarousel.jsx +114 -0
  217. package/dist/components/addOns/non-functional/Testimonials.jsx +177 -0
  218. package/dist/components/addOns/non-functional/ThreeSetGallery.jsx +40 -0
  219. package/dist/components/addOns/non-functional/aboutSections/AboutSection.jsx +35 -0
  220. package/dist/components/addOns/non-functional/aboutSections/constants/aboutSection.js +24 -0
  221. package/dist/components/addOns/non-functional/imageCarousels/ProductSlider.jsx +80 -0
  222. package/dist/components/addOns/non-functional/imageCarousels/ProgramCarousel.jsx +155 -0
  223. package/dist/components/addOns/non-functional/imageCarousels/constants/programCarousel.js +39 -0
  224. package/dist/components/addOns/non-functional/imageCarousels/constants/programSlider.js +36 -0
  225. package/dist/components/addOns/non-functional/spinner.jsx +13 -0
  226. package/dist/components/footers/footer.jsx +219 -0
  227. package/dist/components/navBars/navbar.jsx +158 -0
  228. package/dist/components/other/accordion.jsx +40 -0
  229. package/dist/components/other/admin-menu.jsx +34 -0
  230. package/dist/components/other/alert-dialog.jsx +64 -0
  231. package/dist/components/other/alert.jsx +41 -0
  232. package/dist/components/other/aspect-ratio.jsx +4 -0
  233. package/dist/components/other/avatar.jsx +31 -0
  234. package/dist/components/other/badge.jsx +32 -0
  235. package/dist/components/other/breadcrumb.jsx +57 -0
  236. package/dist/components/other/button.jsx +321 -0
  237. package/dist/components/other/calendar.jsx +43 -0
  238. package/dist/components/other/card.jsx +44 -0
  239. package/dist/components/other/carousel.jsx +140 -0
  240. package/dist/components/other/chart.jsx +182 -0
  241. package/dist/components/other/checkbox.jsx +26 -0
  242. package/dist/components/other/collapsible.jsx +6 -0
  243. package/dist/components/other/command.jsx +68 -0
  244. package/dist/components/other/context-menu.jsx +88 -0
  245. package/dist/components/other/dialog.jsx +60 -0
  246. package/dist/components/other/drawer.jsx +60 -0
  247. package/dist/components/other/dropdown-menu.jsx +90 -0
  248. package/dist/components/other/form.jsx +89 -0
  249. package/dist/components/other/hover-card.jsx +23 -0
  250. package/dist/components/other/input-otp.jsx +46 -0
  251. package/dist/components/other/input.jsx +19 -0
  252. package/dist/components/other/label.jsx +23 -0
  253. package/dist/components/other/login-popup.jsx +1 -0
  254. package/dist/components/other/menubar.jsx +96 -0
  255. package/dist/components/other/mobile-icon.jsx +11 -0
  256. package/dist/components/other/navigation-menu.jsx +62 -0
  257. package/dist/components/other/pagination.jsx +63 -0
  258. package/dist/components/other/popover.jsx +25 -0
  259. package/dist/components/other/progress.jsx +23 -0
  260. package/dist/components/other/radio-group.jsx +31 -0
  261. package/dist/components/other/resizable.jsx +29 -0
  262. package/dist/components/other/scroll-area.jsx +36 -0
  263. package/dist/components/other/select.jsx +83 -0
  264. package/dist/components/other/separator.jsx +21 -0
  265. package/dist/components/other/sheet.jsx +74 -0
  266. package/dist/components/other/signup-popup.jsx +1 -0
  267. package/dist/components/other/skeleton.jsx +17 -0
  268. package/dist/components/other/slider.jsx +26 -0
  269. package/dist/components/other/social-icons.jsx +15 -0
  270. package/dist/components/other/sonner.jsx +27 -0
  271. package/dist/components/other/switch.jsx +23 -0
  272. package/dist/components/other/table.jsx +56 -0
  273. package/dist/components/other/tabs.jsx +32 -0
  274. package/dist/components/other/textarea.jsx +19 -0
  275. package/dist/components/other/toast.jsx +58 -0
  276. package/dist/components/other/toaster.jsx +31 -0
  277. package/dist/components/other/toggle-group.jsx +41 -0
  278. package/dist/components/other/toggle.jsx +39 -0
  279. package/dist/components/other/tooltip.jsx +24 -0
  280. package/dist/components/theme-provider.jsx +18 -0
  281. package/dist/components/types.js +1 -0
  282. package/dist/hooks/use-toast.js +135 -0
  283. package/dist/lib/auth-context.jsx +144 -0
  284. package/dist/lib/google-analytics.jsx +148 -0
  285. package/dist/lib/utils.js +9 -0
  286. package/dist/lib/verify-user.js +142 -0
  287. package/dist/middleware.js +32 -0
  288. package/dist/tailwind.config.js +86 -0
  289. package/dist/tsconfig.tsbuildinfo +1 -0
  290. package/hooks/use-toast.ts +188 -0
  291. package/lib/auth-context.tsx +131 -0
  292. package/lib/google-analytics.tsx +98 -0
  293. package/lib/utils.ts +6 -0
  294. package/lib/verify-user.ts +118 -0
  295. package/middleware.ts +35 -0
  296. package/next.config.js +10 -0
  297. package/package.json +116 -0
  298. package/postcss.config.js +6 -0
  299. package/public/images/FitStop.png +0 -0
  300. package/public/images/classes/bodyblast.JPG +0 -0
  301. package/public/images/classes/cardioxtrain.JPG +0 -0
  302. package/public/images/classes/combo.JPG +0 -0
  303. package/public/images/classes/flexiblefriday.JPG +0 -0
  304. package/public/images/classes/freestyle.jpg +0 -0
  305. package/public/images/classes/noclasses.jpg +0 -0
  306. package/public/images/classes/seniorstretch.JPG +0 -0
  307. package/public/images/classes/stretch.JPG +0 -0
  308. package/public/images/classes/zoomba.JPG +0 -0
  309. package/public/images/fitstoproom1.jpg +0 -0
  310. package/public/images/fitstoproom2.jpg +0 -0
  311. package/public/images/gallery/021-1024x768.jpg +0 -0
  312. package/public/images/gallery/023-1024x768.jpg +0 -0
  313. package/public/images/gallery/027-1024x768.jpg +0 -0
  314. package/public/images/gallery/029-1024x768.jpg +0 -0
  315. package/public/images/gallery/030-1024x768.jpg +0 -0
  316. package/public/images/gallery/042-1024x768.jpg +0 -0
  317. package/public/images/gallery/049-1024x768.jpg +0 -0
  318. package/public/images/gallery/073-1024x768.jpg +0 -0
  319. package/public/images/gallery/108-300x225.jpg +0 -0
  320. package/public/images/gallery/109-300x225.jpg +0 -0
  321. package/public/images/gallery/116.jpg +0 -0
  322. package/public/images/gallery/123-1-1024x768.jpg +0 -0
  323. package/public/images/gallery/133.jpg +0 -0
  324. package/public/images/gallery/142-1.jpg +0 -0
  325. package/public/images/gallery/143.jpg +0 -0
  326. package/public/images/gallery/145-1-1024x768.jpg +0 -0
  327. package/public/images/gallery/151-1024x768.jpg +0 -0
  328. package/public/images/gallery/166-300x225.jpg +0 -0
  329. package/public/images/gallery/175.jpg +0 -0
  330. package/public/images/gallery/183-1024x768.jpg +0 -0
  331. package/public/images/gallery/311.JPG +0 -0
  332. package/public/images/gallery/413-1.jpg +0 -0
  333. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0003-1024x683.jpg +0 -0
  334. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0076-1024x683.jpg +0 -0
  335. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0171-1024x683.jpg +0 -0
  336. package/public/images/gallery/DSCN0233-1024x768.jpg +0 -0
  337. package/public/images/gallery/DSCN0245-1-1024x768.jpg +0 -0
  338. package/public/images/gallery/Fitstopgirls2.jpg +0 -0
  339. package/public/images/gallery/GrandOpening2009.JPG +0 -0
  340. package/public/images/gallery/IMG_1937.JPG +0 -0
  341. package/public/images/gallery/IMG_1950-20.jpg +0 -0
  342. package/public/images/gallery/IMG_2112.JPG +0 -0
  343. package/public/images/gallery/IMG_2229.JPG +0 -0
  344. package/public/images/gallery/IMG_2272.JPG +0 -0
  345. package/public/images/gallery/IMG_2336.JPG +0 -0
  346. package/public/images/gallery/IMG_2367.JPG +0 -0
  347. package/public/images/gallery/IMG_2520.jpg +0 -0
  348. package/public/images/gallery/IMG_2564.jpg +0 -0
  349. package/public/images/gallery/IMG_3678.jpg +0 -0
  350. package/public/images/gallery/IMG_3744.jpg +0 -0
  351. package/public/images/gallery/IMG_3745.jpg +0 -0
  352. package/public/images/gallery/IMG_6383.jpg +0 -0
  353. package/public/images/gallery/Jillian-8-Months-2338-1024x683.jpg +0 -0
  354. package/public/images/gallery/Kathys-Fit-Stop-0032-1024x675.jpg +0 -0
  355. package/public/images/gallery/LaurieinPlank.jpeg +0 -0
  356. package/public/images/gallery/May2017032.JPG +0 -0
  357. package/public/images/gallery/clubpic10.jpg +0 -0
  358. package/public/images/gallery/clubpic15.jpg +0 -0
  359. package/public/images/gallery/clubpic2.jpg +0 -0
  360. package/public/images/gallery/clubpic3.jpg +0 -0
  361. package/public/images/gallery/clubpic4.jpg +0 -0
  362. package/public/images/gallery/clubpic5.jpg +0 -0
  363. package/public/images/gallery/clubpic6.jpg +0 -0
  364. package/public/images/gallery/clubpic7.jpg +0 -0
  365. package/public/images/gallery/clubpic8.jpg +0 -0
  366. package/public/images/gallery/clubpic9.jpg +0 -0
  367. package/public/images/gallery/z014-1024x768.jpg +0 -0
  368. package/public/images/gallery/z019-1-1024x768.jpg +0 -0
  369. package/public/images/kathy_faq-300x132.jpg +0 -0
  370. package/public/images/kathyportrait.jpg +0 -0
  371. package/public/images/kristiportrait.jpg +0 -0
  372. package/public/images/maincoverbackground.JPG +0 -0
  373. package/public/images/videos/FitStopLoopVideo.mp4 +0 -0
  374. package/public/images/weights.jpg +0 -0
  375. package/public/pdf/FitStop-Forum-April-2025.pdf +0 -0
  376. package/tailwind.config.ts +89 -0
  377. package/tsconfig.json +24 -0
@@ -0,0 +1,40 @@
1
+ var ThreeSetGallery = function (_a) {
2
+ var _b = _a.images, images = _b === void 0 ? [
3
+ {
4
+ src: '/images/gallery/placeholder1.jpg',
5
+ alt: 'Gallery Image 1',
6
+ title: 'Image One',
7
+ description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
8
+ },
9
+ {
10
+ src: '/images/gallery/placeholder2.jpg',
11
+ alt: 'Gallery Image 2',
12
+ title: 'Image Two',
13
+ description: 'Sed do eiusmod tempor incididunt ut labore et dolore.',
14
+ },
15
+ {
16
+ src: '/images/gallery/placeholder3.jpg',
17
+ alt: 'Gallery Image 3',
18
+ title: 'Image Three',
19
+ description: 'Ut enim ad minim veniam, quis nostrud exercitation.',
20
+ },
21
+ ] : _b, _c = _a.columns, columns = _c === void 0 ? '3' : _c;
22
+ var gridCols = {
23
+ '1': 'grid-cols-1',
24
+ '2': 'grid-cols-2',
25
+ '3': 'grid-cols-3',
26
+ '4': 'grid-cols-4',
27
+ };
28
+ return (<section className="w-full h-full">
29
+ <div className={"grid ".concat(gridCols[columns], " gap-0")}>
30
+ {images.map(function (image, index) { return (<div key={index} className="relative overflow-hidden group">
31
+ <img src={image.src} alt={image.alt} className="w-full h-[400px] sm:h-[900px] object-cover object-top transform transition-all duration-300 group-hover:scale-105 group-hover:blur-sm"/>
32
+ <div className="absolute inset-0 flex flex-col items-center justify-center bg-black/50 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300">
33
+ <h3 className="text-2xl font-bold">{image.title}</h3>
34
+ <p className="text-lg">{image.description}</p>
35
+ </div>
36
+ </div>); })}
37
+ </div>
38
+ </section>);
39
+ };
40
+ export default ThreeSetGallery;
@@ -0,0 +1,35 @@
1
+ // src/components/AboutSection.tsx
2
+ "use client";
3
+ import { useState } from 'react';
4
+ import { motion } from 'framer-motion';
5
+ import { EditToggleButton } from '@/components/other/button';
6
+ import { ABOUT_SECTION } from './constants/aboutSection';
7
+ export default function AboutSection() {
8
+ var _a = useState(false), isReadMore = _a[0], setIsReadMore = _a[1];
9
+ var toggleReadMore = function () {
10
+ setIsReadMore(!isReadMore);
11
+ };
12
+ return (<section className="relative py-16 sm:py-24 md:py-32 bg-white w-full flex justify-center">
13
+ <div className="w-full px-4 sm:px-6 md:px-12 text-center">
14
+ <motion.h2 className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-8 md:mb-16 text-blue-900" initial={{ opacity: 0, y: 40 }} whileInView={{ opacity: 1, y: 0 }} transition={{ duration: 1.2, ease: 'easeOut' }} viewport={{ once: true }}>
15
+ {ABOUT_SECTION.UI.LOREM_IPSUM_DOLOR}
16
+ </motion.h2>
17
+ <div className="max-w-4xl mx-auto space-y-6 md:space-y-8">
18
+ <p className="text-base sm:text-lg md:text-xl max-w-3xl mx-auto mb-8 md:mb-12 text-gray-700">
19
+ {ABOUT_SECTION.UI.LOREM_IPSUM_PARAGRAPH}
20
+ </p>
21
+ {isReadMore && (<>
22
+ <motion.p className="text-base sm:text-lg md:text-xl max-w-3xl mx-auto mb-8 md:mb-12 text-gray-700" initial={{ opacity: 0, height: 0 }} animate={{ opacity: 1, height: 'auto' }} transition={{ duration: 0.5, ease: 'easeOut' }}>
23
+ {ABOUT_SECTION.UI.AT_VERO_PARAGRAPH}
24
+ </motion.p>
25
+ <motion.p className="text-base sm:text-lg md:text-xl max-w-3xl mx-auto mb-8 md:mb-12 text-gray-700" initial={{ opacity: 0, height: 0 }} animate={{ opacity: 1, height: 'auto' }} transition={{ duration: 0.5, ease: 'easeOut', delay: 0.2 }}>
26
+ {ABOUT_SECTION.UI.LOREM_IPSUM_PARAGRAPH}
27
+ </motion.p>
28
+ </>)}
29
+ <EditToggleButton onClick={toggleReadMore} size="lg" className="mt-4 bg-teal-600 hover:bg-teal-700 text-white rounded-full text-base sm:text-lg md:text-xl shadow-xl transform active:scale-95 transition-transform">
30
+ {isReadMore ? ABOUT_SECTION.BUTTONS.MINUS_LEGERE_BUTTON : ABOUT_SECTION.BUTTONS.PLUS_LEGERE_BUTTON}
31
+ </EditToggleButton>
32
+ </div>
33
+ </div>
34
+ </section>);
35
+ }
@@ -0,0 +1,24 @@
1
+ // components/addOns/non-functional/aboutSections/constants/aboutSection.ts
2
+ // Constants for hardcoded text in AboutSection.tsx, organized by purpose
3
+ export var ABOUT_SECTION = {
4
+ // UI Text for AboutSection
5
+ UI: {
6
+ // Heading for the section
7
+ LOREM_IPSUM_DOLOR: "Lorem Ipsum Dolor",
8
+ // Paragraph text (used for first and third paragraphs)
9
+ LOREM_IPSUM_PARAGRAPH: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
10
+ // Second paragraph text (shown when read more is toggled)
11
+ AT_VERO_PARAGRAPH: "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate.",
12
+ },
13
+ // Button Text for AboutSection
14
+ BUTTONS: {
15
+ // EditToggleButton text when read more is active
16
+ MINUS_LEGERE_BUTTON: "Minus Legere",
17
+ // EditToggleButton text when read more is inactive
18
+ PLUS_LEGERE_BUTTON: "Plus Legere",
19
+ },
20
+ // Error Messages for AboutSection
21
+ ERRORS: {
22
+ // No hardcoded errors
23
+ },
24
+ };
@@ -0,0 +1,80 @@
1
+ // src/components/ProductSlider.tsx
2
+ 'use client';
3
+ import { ChevronLeft, ChevronRight } from 'lucide-react';
4
+ import { PROGRAM_SLIDER } from './constants/programSlider';
5
+ var ProductSlider = function (_a) {
6
+ var _b = _a.products, products = _b === void 0 ? [
7
+ {
8
+ id: '1',
9
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[0],
10
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[0],
11
+ image: '/images/products/placeholder1.jpg',
12
+ },
13
+ {
14
+ id: '2',
15
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[1],
16
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[1],
17
+ image: '/images/products/placeholder2.jpg',
18
+ },
19
+ {
20
+ id: '3',
21
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[2],
22
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[2],
23
+ image: '/images/products/placeholder3.jpg',
24
+ },
25
+ {
26
+ id: '4',
27
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[3],
28
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[3],
29
+ image: '/images/products/placeholder4.jpg',
30
+ },
31
+ {
32
+ id: '5',
33
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[4],
34
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[4],
35
+ image: '/images/products/placeholder5.jpg',
36
+ },
37
+ {
38
+ id: '6',
39
+ name: PROGRAM_SLIDER.UI.PRODUCT_NAMES[5],
40
+ description: PROGRAM_SLIDER.UI.PRODUCT_DESCRIPTIONS[5],
41
+ image: '/images/products/placeholder6.jpg',
42
+ },
43
+ ] : _b;
44
+ var scrollLeft = function () {
45
+ var _a;
46
+ (_a = document.getElementById('scroll-container')) === null || _a === void 0 ? void 0 : _a.scrollBy({ left: -300, behavior: 'smooth' });
47
+ };
48
+ var scrollRight = function () {
49
+ var _a;
50
+ (_a = document.getElementById('scroll-container')) === null || _a === void 0 ? void 0 : _a.scrollBy({ left: 300, behavior: 'smooth' });
51
+ };
52
+ return (<section className="bg-white">
53
+ <div className="w-full px-0">
54
+ <div className="relative w-full">
55
+ <button onClick={scrollLeft} className="absolute left-4 top-1/2 -translate-y-1/2 z-10 hover:bg-black/70 text-white bg-black/40 w-12 h-12 flex items-center justify-center rounded-full shadow-lg transition-all duration-300" aria-label={PROGRAM_SLIDER.BUTTONS.PREVIOUS_PRODUCT_ARIA}>
56
+ <ChevronLeft size={24}/>
57
+ </button>
58
+ <div id="scroll-container" className="flex overflow-x-scroll scroll-smooth snap-x snap-mandatory scrollbar-hide" style={{
59
+ scrollSnapType: 'x mandatory',
60
+ scrollbarWidth: 'none',
61
+ msOverflowStyle: 'none',
62
+ }}>
63
+ {products.map(function (product) { return (<div key={product.id} className="min-w-full md:min-w-[50%] lg:min-w-[33.3333%] snap-start relative">
64
+ <div className="relative w-full h-[500px] sm:h-[600px] md:h-[800px] lg:h-[1200px]">
65
+ <img src={product.image} alt={product.name} className="w-full h-full object-cover"/>
66
+ <div className="absolute bottom-0 w-full bg-black/50 text-white text-center py-4">
67
+ <h3 className="text-2xl font-bold">{product.name}</h3>
68
+ <p className="text-lg">{product.description}</p>
69
+ </div>
70
+ </div>
71
+ </div>); })}
72
+ </div>
73
+ <button onClick={scrollRight} className="absolute right-4 top-1/2 -translate-y-1/2 z-10 hover:bg-black/70 text-white bg-black/40 w-12 h-12 flex items-center justify-center rounded-full shadow-lg transition-all duration-300" aria-label={PROGRAM_SLIDER.BUTTONS.NEXT_PRODUCT_ARIA}>
74
+ <ChevronRight size={24}/>
75
+ </button>
76
+ </div>
77
+ </div>
78
+ </section>);
79
+ };
80
+ export default ProductSlider;
@@ -0,0 +1,155 @@
1
+ // src/components/ProgramsCarousel.tsx
2
+ "use client";
3
+ import Link from 'next/link';
4
+ import { PrevButton, NextButton, ActionButton } from "@/components/other/button";
5
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/other/card';
6
+ import { ChevronLeft, ChevronRight } from 'lucide-react';
7
+ import { motion } from 'framer-motion';
8
+ import { useCallback, useEffect, useRef, useState } from 'react';
9
+ import useEmblaCarousel from 'embla-carousel-react';
10
+ import { PROGRAM_CAROUSEL } from './constants/programCarousel';
11
+ var staggerChildren = {
12
+ hidden: { opacity: 0 },
13
+ visible: {
14
+ opacity: 1,
15
+ transition: {
16
+ staggerChildren: 0.2,
17
+ delayChildren: 0.3,
18
+ },
19
+ },
20
+ };
21
+ var childVariant = {
22
+ hidden: { opacity: 0, y: 20 },
23
+ visible: {
24
+ opacity: 1,
25
+ y: 0,
26
+ transition: { duration: 0.5, ease: 'easeOut' },
27
+ },
28
+ };
29
+ // Separate component for each slide
30
+ var ProgramSlide = function (_a) {
31
+ var program = _a.program;
32
+ var videoRef = useRef(null);
33
+ var handleMouseEnter = function () {
34
+ if (videoRef.current) {
35
+ videoRef.current.play().catch(function (error) { return console.error(PROGRAM_CAROUSEL.ERRORS.VIDEO_PLAY_ERROR, error); });
36
+ }
37
+ };
38
+ var handleMouseLeave = function () {
39
+ if (videoRef.current) {
40
+ videoRef.current.pause();
41
+ videoRef.current.currentTime = 0;
42
+ }
43
+ };
44
+ return (<motion.div className="embla__slide flex-[0_0_100%] max-[640px]:h-[400px] sm:flex-[0_0_33.333333%] sm:h-[900px] w-full flex items-center justify-center" variants={childVariant} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>
45
+ <Card className="bg-white/90 w-full max-[640px]:h-[400px] sm:h-[900px] flex flex-col border-none pb-6 sm:pb-12 shadow-lg hover:shadow-xl transition-shadow duration-300">
46
+ <div className="relative w-full max-[640px]:h-[280px] sm:h-[800px]">
47
+ <video ref={videoRef} src={program.video} poster={program.poster} className="w-full h-full object-cover" muted playsInline loop/>
48
+ </div>
49
+ <CardHeader className="flex-shrink-0 max-[640px]">
50
+ <CardTitle className="max-[640px]:text-xl sm:text-3xl font-bold text-center">
51
+ {program.title}
52
+ </CardTitle>
53
+ </CardHeader>
54
+ <CardContent className="flex-grow flex items-center justify-center max-[640px]">
55
+ <CardDescription className="max-[640px]:text-lg sm:text-lg text-gray-800 text-center line-clamp-3">
56
+ {program.description}
57
+ </CardDescription>
58
+ </CardContent>
59
+ </Card>
60
+ </motion.div>);
61
+ };
62
+ var ProgramsCarousel = function (_a) {
63
+ var _b = _a.programs, programs = _b === void 0 ? [
64
+ {
65
+ title: PROGRAM_CAROUSEL.UI.PROGRAM_TITLES[0],
66
+ video: '/videos/placeholder1.mp4',
67
+ poster: '/images/placeholder1.jpg',
68
+ description: PROGRAM_CAROUSEL.UI.PROGRAM_DESCRIPTIONS[0],
69
+ link: '/',
70
+ },
71
+ {
72
+ title: PROGRAM_CAROUSEL.UI.PROGRAM_TITLES[1],
73
+ video: '/videos/placeholder2.mp4',
74
+ poster: '/images/placeholder2.jpg',
75
+ description: PROGRAM_CAROUSEL.UI.PROGRAM_DESCRIPTIONS[1],
76
+ link: '/',
77
+ },
78
+ {
79
+ title: PROGRAM_CAROUSEL.UI.PROGRAM_TITLES[2],
80
+ video: '/videos/placeholder3.mp4',
81
+ poster: '/images/placeholder3.jpg',
82
+ description: PROGRAM_CAROUSEL.UI.PROGRAM_DESCRIPTIONS[2],
83
+ link: '/',
84
+ },
85
+ {
86
+ title: PROGRAM_CAROUSEL.UI.PROGRAM_TITLES[3],
87
+ video: '/videos/placeholder4.mp4',
88
+ poster: '/images/placeholder4.jpg',
89
+ description: PROGRAM_CAROUSEL.UI.PROGRAM_DESCRIPTIONS[3],
90
+ link: '/',
91
+ },
92
+ {
93
+ title: PROGRAM_CAROUSEL.UI.PROGRAM_TITLES[4],
94
+ video: '/videos/placeholder5.mp4',
95
+ poster: '/images/placeholder5.jpg',
96
+ description: PROGRAM_CAROUSEL.UI.PROGRAM_DESCRIPTIONS[4],
97
+ link: '/',
98
+ },
99
+ ] : _b, _c = _a.sectionTitle, sectionTitle = _c === void 0 ? PROGRAM_CAROUSEL.UI.SECTION_TITLE : _c, _d = _a.buttonText, buttonText = _d === void 0 ? PROGRAM_CAROUSEL.UI.VIEW_ALL_BUTTON_TEXT : _d, _e = _a.buttonLink, buttonLink = _e === void 0 ? '/' : _e;
100
+ var _f = useEmblaCarousel({ loop: true, align: 'start', containScroll: 'trimSnaps', slidesToScroll: 1 }), emblaRef = _f[0], emblaApi = _f[1];
101
+ var _g = useState(false), canPrev = _g[0], setCanPrev = _g[1];
102
+ var _h = useState(true), canNext = _h[0], setCanNext = _h[1];
103
+ var scrollPrev = useCallback(function () {
104
+ if (emblaApi)
105
+ emblaApi.scrollPrev();
106
+ }, [emblaApi]);
107
+ var scrollNext = useCallback(function () {
108
+ if (emblaApi)
109
+ emblaApi.scrollNext();
110
+ }, [emblaApi]);
111
+ var onSelect = useCallback(function () {
112
+ if (!emblaApi)
113
+ return;
114
+ setCanPrev(emblaApi.canScrollPrev());
115
+ setCanNext(emblaApi.canScrollNext());
116
+ }, [emblaApi]);
117
+ useEffect(function () {
118
+ if (!emblaApi)
119
+ return;
120
+ emblaApi.on('select', onSelect);
121
+ emblaApi.on('reInit', onSelect);
122
+ onSelect();
123
+ emblaApi.reInit();
124
+ emblaApi.scrollTo(0, false);
125
+ var handleResize = function () { return emblaApi.reInit(); };
126
+ window.addEventListener('resize', handleResize);
127
+ return function () { return window.removeEventListener('resize', handleResize); };
128
+ }, [emblaApi, onSelect]);
129
+ return (<motion.section className="w-full bg-white/80 relative overflow-hidden p-0 m-0" initial="hidden" whileInView="visible">
130
+ <div className="w-full py-12 sm:py-24 m-0">
131
+ <motion.h2 className="text-4xl sm:text-6xl font-bold text-center mb-8">
132
+ {sectionTitle}
133
+ </motion.h2>
134
+ <div className="embla relative border-none outline-none w-full" ref={emblaRef}>
135
+ <motion.div className="embla__container flex gap-0 w-full" variants={staggerChildren} initial="hidden" whileInView="visible" viewport={{ once: true }}>
136
+ {programs.map(function (program, index) { return (<ProgramSlide key={index} program={program}/>); })}
137
+ </motion.div>
138
+ <PrevButton className="absolute left-0 top-1/2 transform -translate-y-1/2 p-2 rounded-r-full" onClick={scrollPrev} disabled={!canPrev} aria-label={PROGRAM_CAROUSEL.BUTTONS.PREVIOUS_SLIDE_ARIA}>
139
+ <ChevronLeft size={24}/>
140
+ </PrevButton>
141
+ <NextButton className="absolute right-0 top-1/2 transform -translate-y-1/2 p-2 rounded-l-full" onClick={scrollNext} disabled={!canNext} aria-label={PROGRAM_CAROUSEL.BUTTONS.NEXT_SLIDE_ARIA}>
142
+ <ChevronRight size={24}/>
143
+ </NextButton>
144
+ </div>
145
+ <motion.div className="mt-8 text-center" initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 0.6, ease: 'easeOut' }}>
146
+ <Link href={buttonLink}>
147
+ <ActionButton className="hover:scale-110 hover:shadow-lg hover:shadow-gray-800" aria-label={buttonText}>
148
+ {buttonText}
149
+ </ActionButton>
150
+ </Link>
151
+ </motion.div>
152
+ </div>
153
+ </motion.section>);
154
+ };
155
+ export default ProgramsCarousel;
@@ -0,0 +1,39 @@
1
+ // components/addOns/non-functional/imageCarousels/constants/programCarousel.ts
2
+ // Constants for hardcoded text in ProgramsCarousel.tsx, organized by purpose
3
+ export var PROGRAM_CAROUSEL = {
4
+ // UI Text for ProgramsCarousel
5
+ UI: {
6
+ // Default program titles
7
+ PROGRAM_TITLES: [
8
+ "Program One",
9
+ "Program Two",
10
+ "Program Three",
11
+ "Program Four",
12
+ "Program Five",
13
+ ],
14
+ // Default program descriptions
15
+ PROGRAM_DESCRIPTIONS: [
16
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
17
+ "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
18
+ "Ut enim ad minim veniam, quis nostrud exercitation ullamco.",
19
+ "Duis aute irure dolor in reprehenderit in voluptate velit.",
20
+ "Excepteur sint occaecat cupidatat non proident.",
21
+ ],
22
+ // Default section title
23
+ SECTION_TITLE: "Our Programs",
24
+ // Default button text (also used as aria-label)
25
+ VIEW_ALL_BUTTON_TEXT: "View All Programs",
26
+ },
27
+ // Button Text for ProgramsCarousel
28
+ BUTTONS: {
29
+ // Aria-label for previous button
30
+ PREVIOUS_SLIDE_ARIA: "Previous slide",
31
+ // Aria-label for next button
32
+ NEXT_SLIDE_ARIA: "Next slide",
33
+ },
34
+ // Error Messages for ProgramsCarousel
35
+ ERRORS: {
36
+ // Console error message for video playback failure
37
+ VIDEO_PLAY_ERROR: "Video play error:",
38
+ },
39
+ };
@@ -0,0 +1,36 @@
1
+ // components/addOns/non-functional/imageCarousels/constants/programSlider.ts
2
+ // Constants for hardcoded text in ProductSlider.tsx, organized by purpose
3
+ export var PROGRAM_SLIDER = {
4
+ // UI Text for ProductSlider
5
+ UI: {
6
+ // Default product names
7
+ PRODUCT_NAMES: [
8
+ "Product One",
9
+ "Product Two",
10
+ "Product Three",
11
+ "Product Four",
12
+ "Product Five",
13
+ "Product Six",
14
+ ],
15
+ // Default product descriptions
16
+ PRODUCT_DESCRIPTIONS: [
17
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
18
+ "Sed do eiusmod tempor incididunt ut labore et dolore.",
19
+ "Ut enim ad minim veniam, quis nostrud exercitation.",
20
+ "Duis aute irure dolor in reprehenderit in voluptate velit.",
21
+ "Excepteur sint occaecat cupidatat non proident.",
22
+ "Sunt in culpa qui officia deserunt mollit anim id est laborum.",
23
+ ],
24
+ },
25
+ // Button Text for ProductSlider
26
+ BUTTONS: {
27
+ // Aria-label for previous button
28
+ PREVIOUS_PRODUCT_ARIA: "Previous product",
29
+ // Aria-label for next button
30
+ NEXT_PRODUCT_ARIA: "Next product",
31
+ },
32
+ // Error Messages for ProductSlider
33
+ ERRORS: {
34
+ // No hardcoded errors
35
+ },
36
+ };
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { motion } from "framer-motion";
3
+ var spinnerVariants = {
4
+ animate: {
5
+ rotate: 360,
6
+ transition: { duration: 1, repeat: Infinity, ease: "linear" },
7
+ },
8
+ };
9
+ export default function Spinner() {
10
+ return (<div className="fixed inset-0 flex items-center justify-center bg-gray-900/80 z-50">
11
+ <motion.div variants={spinnerVariants} animate="animate" className="w-12 h-12 border-4 border-t-4 border-gray-300 border-t-blue-500 rounded-full"/>
12
+ </div>);
13
+ }
@@ -0,0 +1,219 @@
1
+ "use client";
2
+ import Link from "next/link";
3
+ import Image from "next/image";
4
+ import { Mail, Phone, MapPin, Facebook, X } from "lucide-react";
5
+ import { useState, useEffect } from "react";
6
+ import { SignIn, SignUp, SignedIn, SignedOut, SignOutButton as ClerkSignOutButton, useAuth } from "@clerk/nextjs";
7
+ import { useStrapiAuth } from "@/lib/auth-context";
8
+ import { motion, AnimatePresence } from "framer-motion";
9
+ import AdminMenu from "../other/admin-menu";
10
+ import { SignInButton, SignUpButton, SignOutButton, SettingsButton } from "../other/button";
11
+ var baseLinks = [
12
+ { href: "/", label: "Home" },
13
+ { href: "/about", label: "About" },
14
+ { href: "/contact", label: "Contact" },
15
+ { href: "/gallery", label: "Gallery" },
16
+ { href: "/schedule", label: "Schedule & Rates" },
17
+ { href: "/faq", label: "FAQ" },
18
+ ];
19
+ export default function Footer() {
20
+ var isSignedIn = useAuth().isSignedIn;
21
+ var _a = useStrapiAuth(), user = _a.user, authLoading = _a.authLoading, checkSession = _a.checkSession;
22
+ var _b = useState(false), isLoginOpen = _b[0], setIsLoginOpen = _b[1];
23
+ var _c = useState(false), isSignupOpen = _c[0], setIsSignupOpen = _c[1];
24
+ var _d = useState(false), isAdminMenuOpen = _d[0], setIsAdminMenuOpen = _d[1];
25
+ var _e = useState(null), error = _e[0], setError = _e[1];
26
+ useEffect(function () {
27
+ if (isSignedIn) {
28
+ setIsLoginOpen(false);
29
+ setIsSignupOpen(false);
30
+ setIsAdminMenuOpen(false);
31
+ }
32
+ }, [isSignedIn]);
33
+ useEffect(function () {
34
+ if (isLoginOpen || isSignupOpen || isAdminMenuOpen) {
35
+ document.body.style.overflow = "hidden";
36
+ }
37
+ else {
38
+ document.body.style.overflow = "auto";
39
+ }
40
+ return function () {
41
+ document.body.style.overflow = "auto";
42
+ };
43
+ }, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
44
+ useEffect(function () {
45
+ var event = new CustomEvent("modalStateChange", {
46
+ detail: { isOpen: isLoginOpen || isSignupOpen || isAdminMenuOpen },
47
+ });
48
+ window.dispatchEvent(event);
49
+ }, [isLoginOpen, isSignupOpen, isAdminMenuOpen]);
50
+ useEffect(function () {
51
+ if (!authLoading) {
52
+ if (isSignedIn && !user) {
53
+ checkSession().catch(function (err) {
54
+ console.error("Footer: Failed to sync user data", err);
55
+ setError("Failed to load user data. Please try logging out and back in.");
56
+ });
57
+ }
58
+ else {
59
+ setError(null);
60
+ }
61
+ }
62
+ }, [isSignedIn, user, authLoading, checkSession]);
63
+ var isAdmin = isSignedIn && !!(user === null || user === void 0 ? void 0 : user.businessAdminId) && (user === null || user === void 0 ? void 0 : user.userRole) === "admin";
64
+ if (authLoading) {
65
+ return <div>Loading...</div>;
66
+ }
67
+ if (error) {
68
+ return <div className="text-red-500">Error: {error}</div>;
69
+ }
70
+ return (<footer className="w-full bg-[#2D2D2D] text-gray-300 border-t border-gray-700">
71
+ <style jsx>{"\n @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');\n\n :root {\n --caviar: #2D2D2D;\n --natural-white: #F7F7F7;\n --blue-500: #3B82F6;\n --blue-600: #2563EB;\n --blue-700: #1D4ED8;\n }\n\n * {\n font-family: 'Inter', sans-serif;\n }\n\n .glassmorphism {\n background: rgba(255, 255, 255, 0.08);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n }\n\n .modal-glassmorphism {\n background: rgba(255, 255, 255, 0.08);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border: 2px solid transparent;\n border-image: linear-gradient(45deg, var(--blue-500), var(--blue-600), var(--blue-700)) 1;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);\n border-radius: 2rem;\n max-height: 90vh;\n overflow: hidden;\n }\n\n .gradient-text {\n background: linear-gradient(90deg, var(--blue-500), var(--blue-600));\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n }\n\n .contact-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.75rem;\n border-radius: 0.5rem;\n background: rgba(255, 255, 255, 0.1);\n transition: color 0.2s ease, transform 0.2s ease;\n }\n\n .contact-icon:hover {\n color: var(--blue-500);\n transform: scale(1.1);\n }\n\n .cl-signIn-root,\n .cl-signUp-root {\n background: rgba(17, 24, 39, 0.95);\n border: 1px solid #374151;\n border-radius: 0.5rem;\n color: white;\n font-family: 'Inter', sans-serif;\n max-height: 80vh;\n overflow-y: auto;\n max-width: 90vw;\n box-sizing: border-box;\n }\n\n .cl-button {\n background: var(--blue-500);\n }\n\n .cl-button:hover {\n background: var(--blue-600);\n }\n\n .admin-menu-container {\n position: relative;\n }\n\n @media (max-width: 640px) {\n .cl-signIn-root,\n .cl-signUp-root {\n max-width: 95vw;\n max-height: 80vh;\n overflow-y: auto;\n padding: 0.5rem;\n }\n\n .cl-signIn-root .cl-main,\n .cl-signUp-root .cl-main {\n font-size: 0.9rem;\n }\n\n .cl-signIn-root .cl-headerTitle,\n .cl-signUp-root .cl-headerTitle {\n font-size: 1.25rem;\n }\n\n .cl-signIn-root .cl-formFieldInput,\n .cl-signUp-root .cl-formFieldInput {\n padding: 0.5rem;\n font-size: 0.9rem;\n background: #1f2937;\n color: #ffffff;\n border: 1px solid #4b5563;\n }\n\n .cl-button {\n padding: 0.5rem;\n font-size: 0.9rem;\n }\n\n .modal-glassmorphism {\n backdrop-filter: none;\n background: rgba(255, 255, 255, 0.2);\n padding: 1rem;\n max-height: 85vh;\n }\n }\n\n @supports not (backdrop-filter: blur(10px)) {\n .glassmorphism,\n .modal-glassmorphism {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n "}</style>
72
+
73
+ <div className="w-full px-4 sm:px-6 lg:px-8 2xl:px-24 py-12 sm:py-16 glassmorphism">
74
+ <div className="grid grid-cols-1 2xl:grid-cols-3 gap-8 sm:gap-12">
75
+ <div className="flex flex-col items-center 2xl:items-start">
76
+ <Link href="/" className="flex items-center space-x-4 mb-6">
77
+ <Image src="/images/FitStop.png" alt="DevVista Kit Logo" width={64} height={64} className="h-20 w-20 rounded-full shadow-md transition-transform duration-300 ease-in-out transform hover:scale-105" quality={80} loading="lazy"/>
78
+ <div>
79
+ <span className="text-lg sm:text-xl 2xl:text-2xl font-extrabold text-blue-500 uppercase tracking-tight">
80
+ DevVista's
81
+ </span>
82
+ <br />
83
+ <span className="text-2xl sm:text-3xl 2xl:text-4xl font-extrabold text-blue-500 uppercase tracking-tight">
84
+ Kit
85
+ </span>
86
+ </div>
87
+ </Link>
88
+ <p className="text-sm sm:text-base 2xl:text-lg text-gray-400 text-center 2xl:text-left font-medium">
89
+ 24/7 Fitness Access & Diverse Classes
90
+ </p>
91
+ </div>
92
+
93
+ <div className="flex flex-col items-center">
94
+ <h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
95
+ Quick Links
96
+ </h3>
97
+ <ul className="grid grid-cols-2 gap-x-4 gap-y-3 text-center">
98
+ {baseLinks.map(function (link) { return (<li key={link.href}>
99
+ <Link href={link.href} className="text-sm sm:text-base 2xl:text-lg font-medium uppercase text-gray-300 hover:text-blue-400 transition-all">
100
+ {link.label}
101
+ </Link>
102
+ </li>); })}
103
+ </ul>
104
+ </div>
105
+
106
+ <div className="flex flex-col items-center 2xl:items-end">
107
+ <h3 className="text-lg sm:text-xl 2xl:text-2xl font-bold gradient-text mb-6 uppercase tracking-tight">
108
+ Reach Out
109
+ </h3>
110
+ <ul className="flex space-x-4 2xl:hidden">
111
+ <li>
112
+ <a href="tel:3154154043" className="contact-icon text-gray-300" aria-label="Call 315-415-4043">
113
+ <Phone className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500"/>
114
+ </a>
115
+ </li>
116
+ <li>
117
+ <a href="mailto:devvistainfo@gmail.com" className="contact-icon text-gray-300" aria-label="Email devvistainfo@gmail.com">
118
+ <Mail className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500"/>
119
+ </a>
120
+ </li>
121
+ <li>
122
+ <a href="https://www.google.com/maps/place/215+W+Manlius+St,+East+Syracuse,+NY+13057" className="contact-icon text-gray-300" aria-label="View 215 W. Manlius St, East Syracuse, NY 13057 on Google Maps" target="_blank" rel="noopener noreferrer">
123
+ <MapPin className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500"/>
124
+ </a>
125
+ </li>
126
+ <li>
127
+ <a href="https://www.facebook.com/KathyCaiellosFitStop" className="contact-icon text-gray-300" aria-label="Visit our Facebook page" target="_blank" rel="noopener noreferrer">
128
+ <Facebook className="h-6 w-6 sm:h-8 sm:w-8 text-blue-500"/>
129
+ </a>
130
+ </li>
131
+ </ul>
132
+ <ul className="space-y-3 text-center 2xl:text-right hidden 2xl:block">
133
+ <li className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium">
134
+ 215 W. Manlius St, East Syracuse, NY 13057
135
+ </li>
136
+ <li className="flex items-center justify-center 2xl:justify-end space-x-3">
137
+ <Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500"/>
138
+ <a href="tel:3152145466" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
139
+ 315-214-5466
140
+ </a>
141
+ </li>
142
+ <li className="flex items-center justify-center 2xl:justify-end space-x-3">
143
+ <Phone className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500"/>
144
+ <a href="tel:3154154043" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
145
+ 315-415-4043
146
+ </a>
147
+ </li>
148
+ <li className="flex items-center justify-center 2xl:justify-end space-x-3">
149
+ <Mail className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500"/>
150
+ <a href="mailto:devvistainfo@gmail.com" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all">
151
+ devvistainfo@gmail.com
152
+ </a>
153
+ </li>
154
+ <li className="flex items-center justify-center 2xl:justify-end space-x-3">
155
+ <Facebook className="h-4 w-4 sm:h-5 sm:w-5 text-blue-500"/>
156
+ <a href="https://www.facebook.com/KathyCaiellosFitStop" className="text-sm sm:text-base 2xl:text-lg text-gray-300 font-medium hover:text-blue-400 transition-all" target="_blank" rel="noopener noreferrer">
157
+ Facebook
158
+ </a>
159
+ </li>
160
+ </ul>
161
+ </div>
162
+ </div>
163
+
164
+ {/* Authentication Buttons Moved Above the Bordered Div */}
165
+ <div className="flex justify-center 2xl:justify-start mt-8 space-x-4 admin-menu-container">
166
+ {!authLoading && (<SignedIn>
167
+ <div className="flex items-center space-x-2">
168
+ <ClerkSignOutButton redirectUrl="/">
169
+ <SignOutButton size="sm" aria-label="Logout">
170
+ Logout
171
+ </SignOutButton>
172
+ </ClerkSignOutButton>
173
+ {isAdmin && (<SettingsButton size="sm" onClick={function () { return setIsAdminMenuOpen(true); }} aria-label="Admin Menu">
174
+ </SettingsButton>)}
175
+ </div>
176
+ </SignedIn>)}
177
+ {!authLoading && (<SignedOut>
178
+ <SignInButton size="sm" onClick={function () { return setIsLoginOpen(true); }} aria-label="Login">
179
+ Login
180
+ </SignInButton>
181
+ <SignUpButton size="sm" onClick={function () { return setIsSignupOpen(true); }} aria-label="Sign Up">
182
+ Sign Up
183
+ </SignUpButton>
184
+ </SignedOut>)}
185
+ </div>
186
+
187
+ {/* Bordered Div Now Only Contains Copyright Text */}
188
+ <div className="mt-8 pt-6 border-t border-gray-700 relative">
189
+ <div className="flex justify-center items-center w-full mx-auto max-w-full">
190
+ <p className="text-sm sm:text-base 2xl:text-lg text-gray-400 font-medium text-center">
191
+ © {new Date().getFullYear()} DevVista Kit. All rights reserved.
192
+ </p>
193
+ </div>
194
+ </div>
195
+ </div>
196
+
197
+ <AnimatePresence>
198
+ {isLoginOpen && (<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate" onClick={function () { return setIsLoginOpen(false); }}>
199
+ <motion.div initial={{ scale: 0.9, y: 20 }} animate={{ scale: 1, y: 0 }} exit={{ scale: 0.9, y: 20 }} transition={{ type: "spring", damping: 25, stiffness: 300 }} className="relative max-w-md w-full mx-4 modal-glassmorphism" onClick={function (e) { return e.stopPropagation(); }}>
200
+ <button onClick={function () { return setIsLoginOpen(false); }} className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200
201
+
202
+ w-12 h-12 flex items-center justify-center" aria-label="Close login modal">
203
+ <X className="h-6 w-6"/>
204
+ </button>
205
+ <SignIn routing="hash"/>
206
+ </motion.div>
207
+ </motion.div>)}
208
+ {isSignupOpen && (<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate" onClick={function () { return setIsSignupOpen(false); }}>
209
+ <motion.div initial={{ scale: 0.9, y: 20 }} animate={{ scale: 1, y: 0 }} exit={{ scale: 0.9, y: 20 }} transition={{ type: "spring", damping: 25, stiffness: 300 }} className="relative max-w-md w-full mx-4 modal-glassmorphism" onClick={function (e) { return e.stopPropagation(); }}>
210
+ <button onClick={function () { return setIsSignupOpen(false); }} className="absolute right-2 md:right-14 top-2 z-50 text-gray-600 hover:text-white hover:bg-gray-700/50 rounded-full p-3 transition-all duration-200 w-12 h-12 flex items-center justify-center" aria-label="Close signup modal">
211
+ <X className="h-6 w-6"/>
212
+ </button>
213
+ <SignUp routing="hash"/>
214
+ </motion.div>
215
+ </motion.div>)}
216
+ {isAdminMenuOpen && isAdmin && (<AdminMenu onClose={function () { return setIsAdminMenuOpen(false); }}/>)}
217
+ </AnimatePresence>
218
+ </footer>);
219
+ }