tanstack_start_ts 1.0.0

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 (336) hide show
  1. package/.wrangler/deploy/config.json +1 -0
  2. package/bunfig.toml +6 -0
  3. package/components.json +22 -0
  4. package/config.json +0 -0
  5. package/dist/client/.assetsignore +2 -0
  6. package/dist/client/assets/ProductCard-DbIkJAE-.js +1 -0
  7. package/dist/client/assets/about-AskxOruL.js +1 -0
  8. package/dist/client/assets/admin-BZVcAQM3.js +1 -0
  9. package/dist/client/assets/admin.functions--RdVcuBx.js +1 -0
  10. package/dist/client/assets/admin.login-QgrF_9Fp.js +1 -0
  11. package/dist/client/assets/affiliate-disclosure-BIAsA-HO.js +1 -0
  12. package/dist/client/assets/categories-D0N418mK.js +1 -0
  13. package/dist/client/assets/category._slug-aCaQm14E.js +1 -0
  14. package/dist/client/assets/contact-PhvO-V15.js +1 -0
  15. package/dist/client/assets/faq-BsiHWPM8.js +1 -0
  16. package/dist/client/assets/hero-bg-BP2eVUIX.jpg +0 -0
  17. package/dist/client/assets/index-BU9rnkF3.js +1 -0
  18. package/dist/client/assets/index-BpJWZkva.js +1 -0
  19. package/dist/client/assets/index-vRX-zAyq.js +1 -0
  20. package/dist/client/assets/login-DteE0ZGp.js +1 -0
  21. package/dist/client/assets/logo-pSNfLJQk.png +0 -0
  22. package/dist/client/assets/privacy-B_Pu7040.js +1 -0
  23. package/dist/client/assets/product-links-BkZ41Gv3.js +1 -0
  24. package/dist/client/assets/product._id-BVUysCW-.js +1 -0
  25. package/dist/client/assets/products.functions-cGzRziKO.js +1 -0
  26. package/dist/client/assets/profile-CveRcKq2.js +1 -0
  27. package/dist/client/assets/reset-password-ySEjItX_.js +1 -0
  28. package/dist/client/assets/saved-CHtdQDJF.js +1 -0
  29. package/dist/client/assets/search-CXWfET1y.js +1 -0
  30. package/dist/client/assets/signup-CEx90iuV.js +1 -0
  31. package/dist/client/assets/styles-DrNJG0BO.css +1 -0
  32. package/dist/client/assets/terms-VqJ9kX9b.js +1 -0
  33. package/dist/client/assets/update-password-C-d0ix5e.js +1 -0
  34. package/dist/client/assets/vendor-aria-hidden-DvXkyWUv.js +1 -0
  35. package/dist/client/assets/vendor-class-variance-authority-5VPnzWs2.js +1 -0
  36. package/dist/client/assets/vendor-clsx-B-dksMZM.js +1 -0
  37. package/dist/client/assets/vendor-cookie-es-CS0aJGDi.js +1 -0
  38. package/dist/client/assets/vendor-detect-node-es-l0sNRNKZ.js +1 -0
  39. package/dist/client/assets/vendor-floating-ui-core-BlUy28sp.js +1 -0
  40. package/dist/client/assets/vendor-floating-ui-dom-BxK0hn2R.js +1 -0
  41. package/dist/client/assets/vendor-floating-ui-react-dom-Bas3975S.js +1 -0
  42. package/dist/client/assets/vendor-floating-ui-utils-BfYUAVcw.js +1 -0
  43. package/dist/client/assets/vendor-framer-motion-BMdL-cuX.js +9 -0
  44. package/dist/client/assets/vendor-get-nonce-C-Z93AgS.js +1 -0
  45. package/dist/client/assets/vendor-iceberg-js-tWD4K6Lg.js +1 -0
  46. package/dist/client/assets/vendor-lovable.dev-cloud-auth-js-VuzqtJVg.js +1 -0
  47. package/dist/client/assets/vendor-lucide-react-b5K2fehp.js +1 -0
  48. package/dist/client/assets/vendor-motion-dom-BETJamZt.js +1 -0
  49. package/dist/client/assets/vendor-motion-utils-BuWewJbj.js +1 -0
  50. package/dist/client/assets/vendor-radix-ui-primitive-Dc_FVRD7.js +1 -0
  51. package/dist/client/assets/vendor-radix-ui-react-accordion-C22Rgxe9.js +1 -0
  52. package/dist/client/assets/vendor-radix-ui-react-arrow-DMHj2mKI.js +1 -0
  53. package/dist/client/assets/vendor-radix-ui-react-avatar-CVPBkFXg.js +1 -0
  54. package/dist/client/assets/vendor-radix-ui-react-collapsible-BvM-4sKX.js +1 -0
  55. package/dist/client/assets/vendor-radix-ui-react-collection-D9KtqmHm.js +1 -0
  56. package/dist/client/assets/vendor-radix-ui-react-compose-refs-Cvq0AS8Z.js +1 -0
  57. package/dist/client/assets/vendor-radix-ui-react-context-CAqqn5Nx.js +1 -0
  58. package/dist/client/assets/vendor-radix-ui-react-dialog-DZ01vOLq.js +5 -0
  59. package/dist/client/assets/vendor-radix-ui-react-direction-DxZwNuei.js +1 -0
  60. package/dist/client/assets/vendor-radix-ui-react-dismissable-layer-Dqgrs55Y.js +1 -0
  61. package/dist/client/assets/vendor-radix-ui-react-dropdown-menu-0uzvrqkn.js +1 -0
  62. package/dist/client/assets/vendor-radix-ui-react-focus-guards-DgWoZ-fP.js +1 -0
  63. package/dist/client/assets/vendor-radix-ui-react-focus-scope-BLIu5QaL.js +1 -0
  64. package/dist/client/assets/vendor-radix-ui-react-id-bpga_rLa.js +1 -0
  65. package/dist/client/assets/vendor-radix-ui-react-menu-D0qf2r6_.js +1 -0
  66. package/dist/client/assets/vendor-radix-ui-react-popper-BafIylxU.js +1 -0
  67. package/dist/client/assets/vendor-radix-ui-react-portal-BnAsfNCS.js +1 -0
  68. package/dist/client/assets/vendor-radix-ui-react-presence-C-f3UKQ2.js +1 -0
  69. package/dist/client/assets/vendor-radix-ui-react-primitive-zTHwXNoz.js +1 -0
  70. package/dist/client/assets/vendor-radix-ui-react-roving-focus-jyJB8K2E.js +1 -0
  71. package/dist/client/assets/vendor-radix-ui-react-slot-6LXHJrHl.js +1 -0
  72. package/dist/client/assets/vendor-radix-ui-react-use-callback-ref-E91aPc6s.js +1 -0
  73. package/dist/client/assets/vendor-radix-ui-react-use-controllable-state-Ca3eMtxa.js +1 -0
  74. package/dist/client/assets/vendor-radix-ui-react-use-effect-event-CPeX4A3c.js +1 -0
  75. package/dist/client/assets/vendor-radix-ui-react-use-escape-keydown-7n3YsXFo.js +1 -0
  76. package/dist/client/assets/vendor-radix-ui-react-use-is-hydrated-C1PY1qNv.js +1 -0
  77. package/dist/client/assets/vendor-radix-ui-react-use-layout-effect-B3AcGWPy.js +1 -0
  78. package/dist/client/assets/vendor-radix-ui-react-use-size-CXS04sct.js +1 -0
  79. package/dist/client/assets/vendor-react-dom-BnNs-kzm.js +9 -0
  80. package/dist/client/assets/vendor-react-gJPiVnX5.js +1 -0
  81. package/dist/client/assets/vendor-react-remove-scroll-DHKl-IMP.js +4 -0
  82. package/dist/client/assets/vendor-react-remove-scroll-bar-CSjdInc2.js +38 -0
  83. package/dist/client/assets/vendor-react-style-singleton-BqHpkgXn.js +1 -0
  84. package/dist/client/assets/vendor-scheduler-7OC5HNn7.js +1 -0
  85. package/dist/client/assets/vendor-seroval-B_Fur-nl.js +3 -0
  86. package/dist/client/assets/vendor-seroval-plugins-CBHnPkZJ.js +1 -0
  87. package/dist/client/assets/vendor-sonner-71-LdGG1.js +1 -0
  88. package/dist/client/assets/vendor-supabase-auth-js-DWrN-bIx.js +18 -0
  89. package/dist/client/assets/vendor-supabase-functions-js-uY_V-TxC.js +1 -0
  90. package/dist/client/assets/vendor-supabase-phoenix-BzEf37Ve.js +2 -0
  91. package/dist/client/assets/vendor-supabase-postgrest-js-C4rBWbCx.js +4 -0
  92. package/dist/client/assets/vendor-supabase-realtime-js-D6BlOYKE.js +23 -0
  93. package/dist/client/assets/vendor-supabase-storage-js-BG98L3Zz.js +1 -0
  94. package/dist/client/assets/vendor-supabase-supabase-js-DCCzdwBJ.js +1 -0
  95. package/dist/client/assets/vendor-tailwind-merge-Ct12j0u0.js +1 -0
  96. package/dist/client/assets/vendor-tanstack-history-C617CaxG.js +1 -0
  97. package/dist/client/assets/vendor-tanstack-query-core-7wuJJ5ZL.js +1 -0
  98. package/dist/client/assets/vendor-tanstack-react-query-HImzo8sX.js +1 -0
  99. package/dist/client/assets/vendor-tanstack-react-router-sIZLK-LU.js +1 -0
  100. package/dist/client/assets/vendor-tanstack-react-start-client-GiYCfWmf.js +1 -0
  101. package/dist/client/assets/vendor-tanstack-react-store-EvTi3ahh.js +1 -0
  102. package/dist/client/assets/vendor-tanstack-router-core-Cr7bYUZv.js +1 -0
  103. package/dist/client/assets/vendor-tanstack-start-client-core-C-00BBOu.js +2 -0
  104. package/dist/client/assets/vendor-tanstack-start-fn-stubs-l0sNRNKZ.js +1 -0
  105. package/dist/client/assets/vendor-tanstack-store-BC7mA7pq.js +1 -0
  106. package/dist/client/assets/vendor-tslib-Du-meQkk.js +1 -0
  107. package/dist/client/assets/vendor-use-callback-ref-C_fIAtot.js +1 -0
  108. package/dist/client/assets/vendor-use-sidecar-Bh0DDN6h.js +1 -0
  109. package/dist/client/assets/vendor-use-sync-external-store-ZvKHXaIn.js +1 -0
  110. package/dist/client/assets/vendor-vercel-analytics-DwPM5BWs.js +1 -0
  111. package/dist/client/assets/vendor-zod-By9teAtI.js +1 -0
  112. package/dist/client/robots.txt +2 -0
  113. package/dist/server/.dev.vars +5 -0
  114. package/dist/server/.vite/manifest.json +2528 -0
  115. package/dist/server/assets/ProductCard-CUPXy5Eo.js +149 -0
  116. package/dist/server/assets/_tanstack-start-manifest_v-do7vTWFD.js +4 -0
  117. package/dist/server/assets/about-TfKQw0Ga.js +28 -0
  118. package/dist/server/assets/admin-DspfJOJk.js +578 -0
  119. package/dist/server/assets/admin.functions-B78ppWLR.js +645 -0
  120. package/dist/server/assets/admin.functions-BWlKBoTL.js +93 -0
  121. package/dist/server/assets/admin.login-CV7QfeA6.js +139 -0
  122. package/dist/server/assets/affiliate-disclosure-B1wI1cDb.js +86 -0
  123. package/dist/server/assets/auth-middleware-Cn49MidW.js +62 -0
  124. package/dist/server/assets/categories-Z7jnAYZP.js +108 -0
  125. package/dist/server/assets/category._slug-D0XY3FGK.js +112 -0
  126. package/dist/server/assets/contact-IzyONsXs.js +104 -0
  127. package/dist/server/assets/faq-aRhB_CR3.js +133 -0
  128. package/dist/server/assets/hero-bg-BP2eVUIX.jpg +0 -0
  129. package/dist/server/assets/index-BTPHbXw9.js +221 -0
  130. package/dist/server/assets/index-ByJkHkrU.js +30 -0
  131. package/dist/server/assets/login-Dvy5Dm0f.js +175 -0
  132. package/dist/server/assets/logo-pSNfLJQk.png +0 -0
  133. package/dist/server/assets/privacy-B6Wiez1P.js +93 -0
  134. package/dist/server/assets/product-links-CGYEPP56.js +16 -0
  135. package/dist/server/assets/product._id-BpRa-1z0.js +231 -0
  136. package/dist/server/assets/products.functions-DSlmibYN.js +209 -0
  137. package/dist/server/assets/products.functions-DlHkRiqi.js +24 -0
  138. package/dist/server/assets/profile-B0NWzVAZ.js +314 -0
  139. package/dist/server/assets/reset-password-CY-rmqMr.js +115 -0
  140. package/dist/server/assets/saved-7FA6Dbom.js +126 -0
  141. package/dist/server/assets/search-Yw5c_fZa.js +329 -0
  142. package/dist/server/assets/signup-UPzgZo4i.js +143 -0
  143. package/dist/server/assets/styles-DrNJG0BO.css +1 -0
  144. package/dist/server/assets/terms-CMnX95bP.js +89 -0
  145. package/dist/server/assets/update-password-Cr94ea8n.js +131 -0
  146. package/dist/server/assets/vendor-aria-hidden-DPa16MWu.js +122 -0
  147. package/dist/server/assets/vendor-class-variance-authority-0YxJPB9Y.js +44 -0
  148. package/dist/server/assets/vendor-cloudflare-unenv-preset-ya0VEFBz.js +250 -0
  149. package/dist/server/assets/vendor-clsx-DgYk2OaC.js +16 -0
  150. package/dist/server/assets/vendor-cookie-es-DAoofYiI.js +44 -0
  151. package/dist/server/assets/vendor-detect-node-es-l0sNRNKZ.js +1 -0
  152. package/dist/server/assets/vendor-floating-ui-core-3tkK0THV.js +726 -0
  153. package/dist/server/assets/vendor-floating-ui-dom-C-cPtgJv.js +626 -0
  154. package/dist/server/assets/vendor-floating-ui-react-dom-CRG6gBpH.js +319 -0
  155. package/dist/server/assets/vendor-floating-ui-utils-DmXANH-E.js +320 -0
  156. package/dist/server/assets/vendor-framer-motion-X4zAkX3J.js +1979 -0
  157. package/dist/server/assets/vendor-get-nonce-DiSj3EHl.js +9 -0
  158. package/dist/server/assets/vendor-h3-v2-CCobnLY5.js +287 -0
  159. package/dist/server/assets/vendor-iceberg-js-bHCkXyJn.js +534 -0
  160. package/dist/server/assets/vendor-isbot-CZ7WjwVs.js +21 -0
  161. package/dist/server/assets/vendor-lovable.dev-cloud-auth-js-BE03njZw.js +180 -0
  162. package/dist/server/assets/vendor-lucide-react-Ddew6HYb.js +458 -0
  163. package/dist/server/assets/vendor-motion-dom-D2MTwGIG.js +5983 -0
  164. package/dist/server/assets/vendor-motion-utils-LJlIFN6m.js +161 -0
  165. package/dist/server/assets/vendor-radix-ui-primitive-B-mNdDrH.js +11 -0
  166. package/dist/server/assets/vendor-radix-ui-react-accordion-1Izf6x00.js +308 -0
  167. package/dist/server/assets/vendor-radix-ui-react-arrow-B882lnFK.js +23 -0
  168. package/dist/server/assets/vendor-radix-ui-react-avatar-BVgZt2Ab.js +209 -0
  169. package/dist/server/assets/vendor-radix-ui-react-collapsible-DCBbMZiS.js +147 -0
  170. package/dist/server/assets/vendor-radix-ui-react-collection-BZ2srfgU.js +150 -0
  171. package/dist/server/assets/vendor-radix-ui-react-compose-refs-D3qsKVk1.js +39 -0
  172. package/dist/server/assets/vendor-radix-ui-react-context-BVoNDLue.js +78 -0
  173. package/dist/server/assets/vendor-radix-ui-react-dialog-DlxMaNYK.js +406 -0
  174. package/dist/server/assets/vendor-radix-ui-react-direction-Dt_WDL1t.js +9 -0
  175. package/dist/server/assets/vendor-radix-ui-react-dismissable-layer-CjsuPohV.js +210 -0
  176. package/dist/server/assets/vendor-radix-ui-react-dropdown-menu-DVxKumY8.js +263 -0
  177. package/dist/server/assets/vendor-radix-ui-react-focus-guards-D_6NoePE.js +29 -0
  178. package/dist/server/assets/vendor-radix-ui-react-focus-scope-DEIhTJJH.js +206 -0
  179. package/dist/server/assets/vendor-radix-ui-react-id-DFFpgh6m.js +14 -0
  180. package/dist/server/assets/vendor-radix-ui-react-menu-CiTMLwjT.js +893 -0
  181. package/dist/server/assets/vendor-radix-ui-react-popper-23Ye2Vyc.js +286 -0
  182. package/dist/server/assets/vendor-radix-ui-react-portal-CZCH5uPk.js +16 -0
  183. package/dist/server/assets/vendor-radix-ui-react-presence-CaAULlDU.js +128 -0
  184. package/dist/server/assets/vendor-radix-ui-react-primitive-BeOk3UYa.js +124 -0
  185. package/dist/server/assets/vendor-radix-ui-react-roving-focus-DES9GR8l.js +224 -0
  186. package/dist/server/assets/vendor-radix-ui-react-slot-DUhZbzoH.js +103 -0
  187. package/dist/server/assets/vendor-radix-ui-react-use-callback-ref-BynBgohw.js +11 -0
  188. package/dist/server/assets/vendor-radix-ui-react-use-controllable-state-C9KpT6DG.js +69 -0
  189. package/dist/server/assets/vendor-radix-ui-react-use-effect-event-gpNY2xjS.js +1 -0
  190. package/dist/server/assets/vendor-radix-ui-react-use-escape-keydown-CcYRQ2pp.js +17 -0
  191. package/dist/server/assets/vendor-radix-ui-react-use-is-hydrated-D_LcBPXY.js +15 -0
  192. package/dist/server/assets/vendor-radix-ui-react-use-layout-effect-1LNLXAjr.js +6 -0
  193. package/dist/server/assets/vendor-radix-ui-react-use-size-D6fiKJQo.js +39 -0
  194. package/dist/server/assets/vendor-react-DvBrY0qp.js +511 -0
  195. package/dist/server/assets/vendor-react-dom-yvMLPM0j.js +10484 -0
  196. package/dist/server/assets/vendor-react-remove-scroll-BNtiEvVN.js +328 -0
  197. package/dist/server/assets/vendor-react-remove-scroll-bar-hLqRASRk.js +82 -0
  198. package/dist/server/assets/vendor-react-style-singleton-BXjcXskB.js +69 -0
  199. package/dist/server/assets/vendor-rou3-3NaGPdI8.js +8 -0
  200. package/dist/server/assets/vendor-seroval-dJyC-Zhz.js +1775 -0
  201. package/dist/server/assets/vendor-seroval-plugins-Pq_U2meB.js +58 -0
  202. package/dist/server/assets/vendor-sonner-CqbjhsRh.js +1086 -0
  203. package/dist/server/assets/vendor-srvx-BA-baEX9.js +6 -0
  204. package/dist/server/assets/vendor-supabase-auth-js-D4xjVprw.js +7602 -0
  205. package/dist/server/assets/vendor-supabase-functions-js-sWy4UYn1.js +322 -0
  206. package/dist/server/assets/vendor-supabase-phoenix-Bw3Uh2Nn.js +1777 -0
  207. package/dist/server/assets/vendor-supabase-postgrest-js-AO-BXa7I.js +4938 -0
  208. package/dist/server/assets/vendor-supabase-realtime-js-BtdNgJbm.js +2111 -0
  209. package/dist/server/assets/vendor-supabase-storage-js-Dk_MrPYO.js +2679 -0
  210. package/dist/server/assets/vendor-supabase-supabase-js-D1EEtG3j.js +697 -0
  211. package/dist/server/assets/vendor-tailwind-merge-BHb_obmC.js +3255 -0
  212. package/dist/server/assets/vendor-tanstack-history-C4pKJmkt.js +204 -0
  213. package/dist/server/assets/vendor-tanstack-query-core-PwwTR5ld.js +2552 -0
  214. package/dist/server/assets/vendor-tanstack-react-query-hhHzXAK1.js +190 -0
  215. package/dist/server/assets/vendor-tanstack-react-router-XzqpA65A.js +1120 -0
  216. package/dist/server/assets/vendor-tanstack-react-start-RvWUpvat.js +37 -0
  217. package/dist/server/assets/vendor-tanstack-react-start-client-gpNY2xjS.js +1 -0
  218. package/dist/server/assets/vendor-tanstack-react-start-server-uj_Y9pEN.js +15 -0
  219. package/dist/server/assets/vendor-tanstack-react-store-gpNY2xjS.js +1 -0
  220. package/dist/server/assets/vendor-tanstack-router-core-6wywV3KN.js +4252 -0
  221. package/dist/server/assets/vendor-tanstack-start-client-core-DoOKV2pA.js +1741 -0
  222. package/dist/server/assets/vendor-tanstack-start-fn-stubs-l0sNRNKZ.js +1 -0
  223. package/dist/server/assets/vendor-tanstack-start-server-core-CsAstXv7.js +1421 -0
  224. package/dist/server/assets/vendor-tanstack-start-storage-context-DgH9hIJT.js +17 -0
  225. package/dist/server/assets/vendor-tanstack-store-l0sNRNKZ.js +1 -0
  226. package/dist/server/assets/vendor-tslib-_8ICaZ64.js +67 -0
  227. package/dist/server/assets/vendor-unenv-DUvF4YIF.js +544 -0
  228. package/dist/server/assets/vendor-use-callback-ref-DMFDRvmi.js +66 -0
  229. package/dist/server/assets/vendor-use-sidecar-DG1tHua4.js +106 -0
  230. package/dist/server/assets/vendor-use-sync-external-store-rZ8vi0It.js +64 -0
  231. package/dist/server/assets/vendor-vercel-analytics-oP8BDp0L.js +168 -0
  232. package/dist/server/assets/vendor-zod-BRyQdbC-.js +3580 -0
  233. package/dist/server/index.js +158 -0
  234. package/dist/server/wrangler.json +1 -0
  235. package/enable-powershell.ps1 +7 -0
  236. package/eslint.config.js +41 -0
  237. package/lint.bat +4 -0
  238. package/package.json +95 -0
  239. package/public/robots.txt +2 -0
  240. package/run-npm-build.cjs +20 -0
  241. package/run-npm-build.js +20 -0
  242. package/src/assets/hero-bg.jpg +0 -0
  243. package/src/assets/logo.png +0 -0
  244. package/src/components/scrollsy/Footer.tsx +68 -0
  245. package/src/components/scrollsy/LiveTicker.tsx +31 -0
  246. package/src/components/scrollsy/Logo.tsx +28 -0
  247. package/src/components/scrollsy/Nav.tsx +255 -0
  248. package/src/components/scrollsy/ProductCard.tsx +190 -0
  249. package/src/components/scrollsy/ProductFilters.tsx +226 -0
  250. package/src/components/scrollsy/SupportWidget.tsx +197 -0
  251. package/src/components/ui/accordion.tsx +51 -0
  252. package/src/components/ui/alert-dialog.tsx +115 -0
  253. package/src/components/ui/alert.tsx +49 -0
  254. package/src/components/ui/aspect-ratio.tsx +5 -0
  255. package/src/components/ui/avatar.tsx +47 -0
  256. package/src/components/ui/badge.tsx +32 -0
  257. package/src/components/ui/breadcrumb.tsx +101 -0
  258. package/src/components/ui/button.tsx +49 -0
  259. package/src/components/ui/calendar.tsx +177 -0
  260. package/src/components/ui/card.tsx +55 -0
  261. package/src/components/ui/carousel.tsx +240 -0
  262. package/src/components/ui/chart.tsx +331 -0
  263. package/src/components/ui/checkbox.tsx +26 -0
  264. package/src/components/ui/collapsible.tsx +11 -0
  265. package/src/components/ui/command.tsx +143 -0
  266. package/src/components/ui/context-menu.tsx +187 -0
  267. package/src/components/ui/dialog.tsx +104 -0
  268. package/src/components/ui/drawer.tsx +98 -0
  269. package/src/components/ui/dropdown-menu.tsx +188 -0
  270. package/src/components/ui/form.tsx +171 -0
  271. package/src/components/ui/hover-card.tsx +27 -0
  272. package/src/components/ui/input-otp.tsx +69 -0
  273. package/src/components/ui/input.tsx +22 -0
  274. package/src/components/ui/label.tsx +21 -0
  275. package/src/components/ui/menubar.tsx +229 -0
  276. package/src/components/ui/navigation-menu.tsx +120 -0
  277. package/src/components/ui/pagination.tsx +98 -0
  278. package/src/components/ui/popover.tsx +31 -0
  279. package/src/components/ui/progress.tsx +25 -0
  280. package/src/components/ui/radio-group.tsx +36 -0
  281. package/src/components/ui/resizable.tsx +37 -0
  282. package/src/components/ui/scroll-area.tsx +44 -0
  283. package/src/components/ui/select.tsx +152 -0
  284. package/src/components/ui/separator.tsx +24 -0
  285. package/src/components/ui/sheet.tsx +122 -0
  286. package/src/components/ui/sidebar.tsx +744 -0
  287. package/src/components/ui/skeleton.tsx +7 -0
  288. package/src/components/ui/slider.tsx +23 -0
  289. package/src/components/ui/sonner.tsx +23 -0
  290. package/src/components/ui/switch.tsx +27 -0
  291. package/src/components/ui/table.tsx +94 -0
  292. package/src/components/ui/tabs.tsx +53 -0
  293. package/src/components/ui/textarea.tsx +21 -0
  294. package/src/components/ui/toggle-group.tsx +57 -0
  295. package/src/components/ui/toggle.tsx +42 -0
  296. package/src/components/ui/tooltip.tsx +32 -0
  297. package/src/hooks/use-auth.ts +26 -0
  298. package/src/hooks/use-mobile.tsx +19 -0
  299. package/src/integrations/lovable/index.ts +41 -0
  300. package/src/lib/admin.functions.ts +564 -0
  301. package/src/lib/error-capture.ts +27 -0
  302. package/src/lib/error-page.ts +30 -0
  303. package/src/lib/product-links.ts +39 -0
  304. package/src/lib/products.functions.ts +101 -0
  305. package/src/lib/utils.ts +6 -0
  306. package/src/routeTree.gen.ts +480 -0
  307. package/src/router.tsx +16 -0
  308. package/src/routes/__root.tsx +177 -0
  309. package/src/routes/about.tsx +66 -0
  310. package/src/routes/admin.login.tsx +95 -0
  311. package/src/routes/admin.tsx +811 -0
  312. package/src/routes/affiliate-disclosure.tsx +35 -0
  313. package/src/routes/categories.tsx +57 -0
  314. package/src/routes/category.$slug.tsx +51 -0
  315. package/src/routes/contact.tsx +69 -0
  316. package/src/routes/faq.tsx +63 -0
  317. package/src/routes/index.tsx +269 -0
  318. package/src/routes/login.tsx +160 -0
  319. package/src/routes/privacy.tsx +39 -0
  320. package/src/routes/product.$id.tsx +212 -0
  321. package/src/routes/profile.tsx +393 -0
  322. package/src/routes/reset-password.tsx +71 -0
  323. package/src/routes/saved.tsx +83 -0
  324. package/src/routes/search.tsx +136 -0
  325. package/src/routes/signup.tsx +108 -0
  326. package/src/routes/sitemap[.]xml.ts +34 -0
  327. package/src/routes/terms.tsx +40 -0
  328. package/src/routes/update-password.tsx +91 -0
  329. package/src/server.ts +80 -0
  330. package/src/start.ts +24 -0
  331. package/src/styles.css +333 -0
  332. package/terminal-test-output.txt +1 -0
  333. package/tsconfig.json +27 -0
  334. package/vercel.json +26 -0
  335. package/vite.config.ts +38 -0
  336. package/wrangler.jsonc +7 -0
@@ -0,0 +1,1741 @@
1
+ import { g as getStartContext } from "./vendor-tanstack-start-storage-context-DgH9hIJT.js";
2
+ import { F as parseRedirect, D as mergeHeaders, y as isRedirect, h as defaultSerovalPlugins, C as makeSerovalPlugin } from "./vendor-tanstack-router-core-6wywV3KN.js";
3
+ import "./vendor-seroval-dJyC-Zhz.js";
4
+ import { L as Link, e as useRouterState, a as createRootRouteWithContext, d as useRouter, O as Outlet, H as HeadContent, S as Scripts, c as createFileRoute, l as lazyRouteComponent, b as createRouter } from "./vendor-tanstack-react-router-XzqpA65A.js";
5
+ import { j as jsxRuntimeExports, r as reactExports } from "./vendor-react-DvBrY0qp.js";
6
+ import { a as useQuery, Q as QueryClientProvider, b as useQueryClient } from "./vendor-tanstack-react-query-hhHzXAK1.js";
7
+ import { A as Analytics } from "./vendor-vercel-analytics-oP8BDp0L.js";
8
+ import { c as Root2, T as Trigger, P as Portal2, a as Content2, L as Label2, S as Separator2, I as Item2, e as SubTrigger2, d as SubContent2, C as CheckboxItem2, b as ItemIndicator2, R as RadioItem2 } from "./vendor-radix-ui-react-dropdown-menu-DVxKumY8.js";
9
+ import { c as clsx } from "./vendor-clsx-DgYk2OaC.js";
10
+ import { t as twMerge } from "./vendor-tailwind-merge-BHb_obmC.js";
11
+ import { d as ChevronRight, a as Check, e as Circle, S as Search, H as Heart, b as ChevronDown, U as User, t as Shield, n as LogOut, x as Sparkles, X, o as Menu, f as Copy, E as ExternalLink, m as LockKeyhole, W as WalletCards, L as Link2 } from "./vendor-lucide-react-Ddew6HYb.js";
12
+ import { R as Root, I as Image, F as Fallback } from "./vendor-radix-ui-react-avatar-BVgZt2Ab.js";
13
+ import { S as Slot } from "./vendor-radix-ui-react-slot-DUhZbzoH.js";
14
+ import { c as cva } from "./vendor-class-variance-authority-0YxJPB9Y.js";
15
+ import { R as Root$1, P as Portal, a as Content, C as Close, T as Title, O as Overlay, D as Description } from "./vendor-radix-ui-react-dialog-DlxMaNYK.js";
16
+ import { m as motion, A as AnimatePresence } from "./vendor-framer-motion-X4zAkX3J.js";
17
+ import { T as Toaster$1 } from "./vendor-sonner-CqbjhsRh.js";
18
+ import { o as objectType, s as stringType } from "./vendor-zod-BRyQdbC-.js";
19
+ import { Q as QueryClient } from "./vendor-tanstack-query-core-PwwTR5ld.js";
20
+ import { c as createClient } from "./vendor-supabase-supabase-js-D1EEtG3j.js";
21
+ function renderErrorPage() {
22
+ return `<!doctype html>
23
+ <html lang="en">
24
+ <head>
25
+ <meta charset="utf-8" />
26
+ <title>This page didn't load</title>
27
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
28
+ <style>
29
+ body { font: 15px/1.5 system-ui, -apple-system, sans-serif; background: #fafafa; color: #111; display: grid; place-items: center; min-height: 100vh; margin: 0; padding: 1.5rem; }
30
+ .card { max-width: 28rem; width: 100%; text-align: center; padding: 2rem; }
31
+ h1 { font-size: 1.25rem; margin: 0 0 0.5rem; }
32
+ p { color: #4b5563; margin: 0 0 1.5rem; }
33
+ .actions { display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; }
34
+ a, button { padding: 0.5rem 1rem; border-radius: 0.375rem; font: inherit; cursor: pointer; text-decoration: none; border: 1px solid transparent; }
35
+ .primary { background: #111; color: #fff; }
36
+ .secondary { background: #fff; color: #111; border-color: #d1d5db; }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <div class="card">
41
+ <h1>This page didn't load</h1>
42
+ <p>Something went wrong on our end. You can try refreshing or head back home.</p>
43
+ <div class="actions">
44
+ <button class="primary" onclick="location.reload()">Try again</button>
45
+ <a class="secondary" href="/">Go home</a>
46
+ </div>
47
+ </div>
48
+ </body>
49
+ </html>`;
50
+ }
51
+ var TSS_FORMDATA_CONTEXT = "__TSS_CONTEXT";
52
+ var TSS_SERVER_FUNCTION = /* @__PURE__ */ Symbol.for("TSS_SERVER_FUNCTION");
53
+ var TSS_SERVER_FUNCTION_FACTORY = /* @__PURE__ */ Symbol.for("TSS_SERVER_FUNCTION_FACTORY");
54
+ var X_TSS_SERIALIZED = "x-tss-serialized";
55
+ var X_TSS_RAW_RESPONSE = "x-tss-raw";
56
+ var TSS_CONTENT_TYPE_FRAMED = "application/x-tss-framed";
57
+ var FrameType = {
58
+ JSON: 0,
59
+ CHUNK: 1,
60
+ END: 2,
61
+ ERROR: 3
62
+ };
63
+ var FRAME_HEADER_SIZE = 9;
64
+ var TSS_CONTENT_TYPE_FRAMED_VERSIONED = `${TSS_CONTENT_TYPE_FRAMED}; v=1`;
65
+ function isSafeKey(key) {
66
+ return key !== "__proto__" && key !== "constructor" && key !== "prototype";
67
+ }
68
+ function safeObjectMerge(target, source) {
69
+ const result = /* @__PURE__ */ Object.create(null);
70
+ if (target) {
71
+ for (const key of Object.keys(target)) if (isSafeKey(key)) result[key] = target[key];
72
+ }
73
+ if (source && typeof source === "object") {
74
+ for (const key of Object.keys(source)) if (isSafeKey(key)) result[key] = source[key];
75
+ }
76
+ return result;
77
+ }
78
+ function createNullProtoObject(source) {
79
+ if (!source) return /* @__PURE__ */ Object.create(null);
80
+ const obj = /* @__PURE__ */ Object.create(null);
81
+ for (const key of Object.keys(source)) if (isSafeKey(key)) obj[key] = source[key];
82
+ return obj;
83
+ }
84
+ var getStartOptions = () => getStartContext().startOptions;
85
+ var getStartContextServerOnly = getStartContext;
86
+ var createServerFn = (options, __opts) => {
87
+ const resolvedOptions = __opts || options || {};
88
+ if (typeof resolvedOptions.method === "undefined") resolvedOptions.method = "GET";
89
+ const res = {
90
+ options: resolvedOptions,
91
+ middleware: (middleware) => {
92
+ const newMiddleware = [...resolvedOptions.middleware || []];
93
+ middleware.map((m) => {
94
+ if (TSS_SERVER_FUNCTION_FACTORY in m) {
95
+ if (m.options.middleware) newMiddleware.push(...m.options.middleware);
96
+ } else newMiddleware.push(m);
97
+ });
98
+ const res2 = createServerFn(void 0, {
99
+ ...resolvedOptions,
100
+ middleware: newMiddleware
101
+ });
102
+ res2[TSS_SERVER_FUNCTION_FACTORY] = true;
103
+ return res2;
104
+ },
105
+ inputValidator: (inputValidator) => {
106
+ return createServerFn(void 0, {
107
+ ...resolvedOptions,
108
+ inputValidator
109
+ });
110
+ },
111
+ handler: (...args) => {
112
+ const [extractedFn, serverFn] = args;
113
+ const newOptions = {
114
+ ...resolvedOptions,
115
+ extractedFn,
116
+ serverFn
117
+ };
118
+ const resolvedMiddleware = [...newOptions.middleware || [], serverFnBaseToMiddleware(newOptions)];
119
+ extractedFn.method = resolvedOptions.method;
120
+ return Object.assign(async (opts) => {
121
+ const result = await executeMiddleware(resolvedMiddleware, "client", {
122
+ ...extractedFn,
123
+ ...newOptions,
124
+ data: opts?.data,
125
+ headers: opts?.headers,
126
+ signal: opts?.signal,
127
+ fetch: opts?.fetch,
128
+ context: createNullProtoObject()
129
+ });
130
+ const redirect = parseRedirect(result.error);
131
+ if (redirect) throw redirect;
132
+ if (result.error) throw result.error;
133
+ return result.result;
134
+ }, {
135
+ ...extractedFn,
136
+ method: resolvedOptions.method,
137
+ __executeServer: async (opts) => {
138
+ const startContext = getStartContextServerOnly();
139
+ const serverContextAfterGlobalMiddlewares = startContext.contextAfterGlobalMiddlewares;
140
+ return await executeMiddleware(resolvedMiddleware, "server", {
141
+ ...extractedFn,
142
+ ...opts,
143
+ serverFnMeta: extractedFn.serverFnMeta,
144
+ context: safeObjectMerge(opts.context, serverContextAfterGlobalMiddlewares),
145
+ request: startContext.request
146
+ }).then((d) => ({
147
+ result: d.result,
148
+ error: d.error,
149
+ context: d.sendContext
150
+ }));
151
+ }
152
+ });
153
+ }
154
+ };
155
+ const fun = (options2) => {
156
+ return createServerFn(void 0, {
157
+ ...resolvedOptions,
158
+ ...options2
159
+ });
160
+ };
161
+ return Object.assign(fun, res);
162
+ };
163
+ async function executeMiddleware(middlewares, env, opts) {
164
+ let flattenedMiddlewares = flattenMiddlewares([...getStartOptions()?.functionMiddleware || [], ...middlewares]);
165
+ if (env === "server") {
166
+ const startContext = getStartContextServerOnly({ throwIfNotFound: false });
167
+ if (startContext?.executedRequestMiddlewares) flattenedMiddlewares = flattenedMiddlewares.filter((m) => !startContext.executedRequestMiddlewares.has(m));
168
+ }
169
+ const callNextMiddleware = async (ctx) => {
170
+ const nextMiddleware = flattenedMiddlewares.shift();
171
+ if (!nextMiddleware) return ctx;
172
+ try {
173
+ if ("inputValidator" in nextMiddleware.options && nextMiddleware.options.inputValidator && env === "server") ctx.data = await execValidator(nextMiddleware.options.inputValidator, ctx.data);
174
+ let middlewareFn = void 0;
175
+ if (env === "client") {
176
+ if ("client" in nextMiddleware.options) middlewareFn = nextMiddleware.options.client;
177
+ } else if ("server" in nextMiddleware.options) middlewareFn = nextMiddleware.options.server;
178
+ if (middlewareFn) {
179
+ const userNext = async (userCtx = {}) => {
180
+ const result2 = await callNextMiddleware({
181
+ ...ctx,
182
+ ...userCtx,
183
+ context: safeObjectMerge(ctx.context, userCtx.context),
184
+ sendContext: safeObjectMerge(ctx.sendContext, userCtx.sendContext),
185
+ headers: mergeHeaders(ctx.headers, userCtx.headers),
186
+ _callSiteFetch: ctx._callSiteFetch,
187
+ fetch: ctx._callSiteFetch ?? userCtx.fetch ?? ctx.fetch,
188
+ result: userCtx.result !== void 0 ? userCtx.result : userCtx instanceof Response ? userCtx : ctx.result,
189
+ error: userCtx.error ?? ctx.error
190
+ });
191
+ if (result2.error) throw result2.error;
192
+ return result2;
193
+ };
194
+ const result = await middlewareFn({
195
+ ...ctx,
196
+ next: userNext
197
+ });
198
+ if (isRedirect(result)) return {
199
+ ...ctx,
200
+ error: result
201
+ };
202
+ if (result instanceof Response) return {
203
+ ...ctx,
204
+ result
205
+ };
206
+ if (!result) throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");
207
+ return result;
208
+ }
209
+ return callNextMiddleware(ctx);
210
+ } catch (error) {
211
+ return {
212
+ ...ctx,
213
+ error
214
+ };
215
+ }
216
+ };
217
+ return callNextMiddleware({
218
+ ...opts,
219
+ headers: opts.headers || {},
220
+ sendContext: opts.sendContext || {},
221
+ context: opts.context || createNullProtoObject(),
222
+ _callSiteFetch: opts.fetch
223
+ });
224
+ }
225
+ function flattenMiddlewares(middlewares, maxDepth = 100) {
226
+ const seen = /* @__PURE__ */ new Set();
227
+ const flattened = [];
228
+ const recurse = (middleware, depth) => {
229
+ if (depth > maxDepth) throw new Error(`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`);
230
+ middleware.forEach((m) => {
231
+ if (m.options.middleware) recurse(m.options.middleware, depth + 1);
232
+ if (!seen.has(m)) {
233
+ seen.add(m);
234
+ flattened.push(m);
235
+ }
236
+ });
237
+ };
238
+ recurse(middlewares, 0);
239
+ return flattened;
240
+ }
241
+ async function execValidator(validator, input) {
242
+ if (validator == null) return {};
243
+ if ("~standard" in validator) {
244
+ const result = await validator["~standard"].validate(input);
245
+ if (result.issues) throw new Error(JSON.stringify(result.issues, void 0, 2));
246
+ return result.value;
247
+ }
248
+ if ("parse" in validator) return validator.parse(input);
249
+ if (typeof validator === "function") return validator(input);
250
+ throw new Error("Invalid validator type!");
251
+ }
252
+ function serverFnBaseToMiddleware(options) {
253
+ return {
254
+ "~types": void 0,
255
+ options: {
256
+ inputValidator: options.inputValidator,
257
+ client: async ({ next, sendContext, fetch, ...ctx }) => {
258
+ const payload = {
259
+ ...ctx,
260
+ context: sendContext,
261
+ fetch
262
+ };
263
+ return next(await options.extractedFn?.(payload));
264
+ },
265
+ server: async ({ next, ...ctx }) => {
266
+ const result = await options.serverFn?.(ctx);
267
+ return next({
268
+ ...ctx,
269
+ result
270
+ });
271
+ }
272
+ }
273
+ };
274
+ }
275
+ var createMiddleware = (options, __opts) => {
276
+ const resolvedOptions = {
277
+ type: "request",
278
+ ...__opts || options
279
+ };
280
+ return {
281
+ options: resolvedOptions,
282
+ middleware: (middleware) => {
283
+ return createMiddleware({}, Object.assign(resolvedOptions, { middleware }));
284
+ },
285
+ inputValidator: (inputValidator) => {
286
+ return createMiddleware({}, Object.assign(resolvedOptions, { inputValidator }));
287
+ },
288
+ client: (client) => {
289
+ return createMiddleware({}, Object.assign(resolvedOptions, { client }));
290
+ },
291
+ server: (server) => {
292
+ return createMiddleware({}, Object.assign(resolvedOptions, { server }));
293
+ }
294
+ };
295
+ };
296
+ var innerCreateCsrfMiddleware = (opts = {}) => {
297
+ const middleware = createMiddleware().server(async (ctx) => {
298
+ const csrfCtx = ctx;
299
+ if (opts.filter && !await opts.filter(csrfCtx)) return ctx.next();
300
+ if (await isCsrfRequestAllowed(opts, csrfCtx)) return ctx.next();
301
+ return getFailureResponse(opts, csrfCtx);
302
+ });
303
+ return middleware;
304
+ };
305
+ var createCsrfMiddleware = innerCreateCsrfMiddleware;
306
+ async function isCsrfRequestAllowed(opts, ctx) {
307
+ const result = await getCsrfRequestValidationResult(opts, ctx);
308
+ return result === true || result === void 0 && opts.allowRequestsWithoutOriginCheck === true;
309
+ }
310
+ async function getCsrfRequestValidationResult(opts, ctx) {
311
+ const fetchSite = ctx.request.headers.get("Sec-Fetch-Site");
312
+ if (fetchSite !== null) return matchValue(opts.secFetchSite ?? "same-origin", fetchSite, ctx);
313
+ const origin = ctx.request.headers.get("Origin");
314
+ if (origin !== null) {
315
+ if (opts.origin) return matchValue(opts.origin, origin, ctx);
316
+ return origin === new URL(ctx.request.url).origin;
317
+ }
318
+ const referer = ctx.request.headers.get("Referer");
319
+ if (referer === null || opts.referer === false) return;
320
+ if (typeof opts.referer === "function") return opts.referer(referer, ctx);
321
+ if (opts.origin) {
322
+ const refererOrigin = getOriginFromUrl(referer);
323
+ return refererOrigin !== void 0 && matchValue(opts.origin, refererOrigin, ctx);
324
+ }
325
+ return isRefererSameOrigin(referer, new URL(ctx.request.url).origin);
326
+ }
327
+ async function matchValue(matcher, value, ctx) {
328
+ if (typeof matcher === "function") return matcher(value, ctx);
329
+ if (Array.isArray(matcher)) return matcher.includes(value);
330
+ return value === matcher;
331
+ }
332
+ function getOriginFromUrl(url) {
333
+ try {
334
+ return new URL(url).origin;
335
+ } catch {
336
+ return;
337
+ }
338
+ }
339
+ function isRefererSameOrigin(referer, requestOrigin) {
340
+ if (referer === requestOrigin) return true;
341
+ if (!referer.startsWith(requestOrigin)) return false;
342
+ if (referer.length === requestOrigin.length) return true;
343
+ const code = referer.charCodeAt(requestOrigin.length);
344
+ return code === 47 || code === 63 || code === 35;
345
+ }
346
+ async function getFailureResponse(opts, ctx) {
347
+ if (typeof opts.failureResponse === "function") return opts.failureResponse(ctx);
348
+ return opts.failureResponse?.clone() ?? new Response("Forbidden", {
349
+ status: 403
350
+ });
351
+ }
352
+ function dedupeSerializationAdapters(deduped, serializationAdapters) {
353
+ for (let i = 0, len = serializationAdapters.length; i < len; i++) {
354
+ const current = serializationAdapters[i];
355
+ if (!deduped.has(current)) {
356
+ deduped.add(current);
357
+ if (current.extends) dedupeSerializationAdapters(deduped, current.extends);
358
+ }
359
+ }
360
+ }
361
+ var createStart = (getOptions) => {
362
+ return {
363
+ getOptions: async () => {
364
+ const options = await getOptions();
365
+ if (options.serializationAdapters) {
366
+ const deduped = /* @__PURE__ */ new Set();
367
+ dedupeSerializationAdapters(deduped, options.serializationAdapters);
368
+ options.serializationAdapters = Array.from(deduped);
369
+ }
370
+ return options;
371
+ },
372
+ createMiddleware
373
+ };
374
+ };
375
+ function getDefaultSerovalPlugins() {
376
+ return [...getStartOptions()?.serializationAdapters?.map(makeSerovalPlugin) ?? [], ...defaultSerovalPlugins];
377
+ }
378
+ function createSupabaseClient() {
379
+ const SUPABASE_URL = "https://nzjcdmvweufrawyphzzy.supabase.co";
380
+ const SUPABASE_PUBLISHABLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im56amNkbXZ3ZXVmcmF3eXBoenp5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzkzMTE1NjQsImV4cCI6MjA5NDg4NzU2NH0.HSGmMtYJTCFBcS17l6RsFxrgtOZdxpzL6_5v5vI9TOo";
381
+ return createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {
382
+ auth: {
383
+ storage: typeof window !== "undefined" ? localStorage : void 0,
384
+ persistSession: true,
385
+ autoRefreshToken: true
386
+ }
387
+ });
388
+ }
389
+ let _supabase;
390
+ const supabase = new Proxy({}, {
391
+ get(_, prop, receiver) {
392
+ if (!_supabase) _supabase = createSupabaseClient();
393
+ return Reflect.get(_supabase, prop, receiver);
394
+ }
395
+ });
396
+ const attachSupabaseAuth = createMiddleware({ type: "function" }).client(
397
+ async ({ next }) => {
398
+ const { data } = await supabase.auth.getSession();
399
+ const token = data.session?.access_token;
400
+ return next({
401
+ headers: token ? { Authorization: `Bearer ${token}` } : {}
402
+ });
403
+ }
404
+ );
405
+ const errorMiddleware = createMiddleware().server(async ({ next }) => {
406
+ try {
407
+ return await next();
408
+ } catch (error) {
409
+ if (error != null && typeof error === "object" && "statusCode" in error) {
410
+ throw error;
411
+ }
412
+ console.error(error);
413
+ return new Response(renderErrorPage(), {
414
+ status: 500,
415
+ headers: { "content-type": "text/html; charset=utf-8" }
416
+ });
417
+ }
418
+ });
419
+ const startInstance = createStart(() => ({
420
+ requestMiddleware: [errorMiddleware],
421
+ functionMiddleware: [attachSupabaseAuth]
422
+ }));
423
+ const start = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
424
+ __proto__: null,
425
+ startInstance
426
+ }, Symbol.toStringTag, { value: "Module" }));
427
+ const pluginSerializationAdapters = [];
428
+ const hasPluginAdapters = false;
429
+ const __23tanstackStartPluginAdapters = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
430
+ __proto__: null,
431
+ hasPluginAdapters,
432
+ pluginSerializationAdapters
433
+ }, Symbol.toStringTag, { value: "Module" }));
434
+ const appCss = "/assets/styles-DrNJG0BO.css";
435
+ const logo = "/assets/logo-pSNfLJQk.png";
436
+ function Logo({
437
+ size = 32,
438
+ withWordmark = true
439
+ }) {
440
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/", className: "flex items-center gap-2 group", children: [
441
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
442
+ "img",
443
+ {
444
+ src: logo,
445
+ alt: "Scrollsy logo",
446
+ width: size,
447
+ height: size,
448
+ className: "drop-shadow-[0_0_12px_rgba(232,67,147,0.45)] transition-transform group-hover:rotate-[-8deg]",
449
+ style: { width: size, height: size }
450
+ }
451
+ ),
452
+ withWordmark && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-display font-bold text-xl tracking-tight", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-gradient", children: "Scrollsy" }) })
453
+ ] });
454
+ }
455
+ function useAuth() {
456
+ const [session, setSession] = reactExports.useState(null);
457
+ const [user, setUser] = reactExports.useState(null);
458
+ const [loading, setLoading] = reactExports.useState(true);
459
+ reactExports.useEffect(() => {
460
+ const {
461
+ data: { subscription }
462
+ } = supabase.auth.onAuthStateChange((_e, s) => {
463
+ setSession(s);
464
+ setUser(s?.user ?? null);
465
+ });
466
+ supabase.auth.getSession().then(({ data }) => {
467
+ setSession(data.session);
468
+ setUser(data.session?.user ?? null);
469
+ setLoading(false);
470
+ });
471
+ return () => subscription.unsubscribe();
472
+ }, []);
473
+ return { session, user, loading };
474
+ }
475
+ function cn(...inputs) {
476
+ return twMerge(clsx(inputs));
477
+ }
478
+ const DropdownMenu = Root2;
479
+ const DropdownMenuTrigger = Trigger;
480
+ const DropdownMenuSubTrigger = reactExports.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
481
+ SubTrigger2,
482
+ {
483
+ ref,
484
+ className: cn(
485
+ "flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
486
+ inset && "pl-8",
487
+ className
488
+ ),
489
+ ...props,
490
+ children: [
491
+ children,
492
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-auto" })
493
+ ]
494
+ }
495
+ ));
496
+ DropdownMenuSubTrigger.displayName = SubTrigger2.displayName;
497
+ const DropdownMenuSubContent = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
498
+ SubContent2,
499
+ {
500
+ ref,
501
+ className: cn(
502
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-dropdown-menu-content-transform-origin)",
503
+ className
504
+ ),
505
+ ...props
506
+ }
507
+ ));
508
+ DropdownMenuSubContent.displayName = SubContent2.displayName;
509
+ const DropdownMenuContent = reactExports.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Portal2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
510
+ Content2,
511
+ {
512
+ ref,
513
+ sideOffset,
514
+ className: cn(
515
+ "z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
516
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-dropdown-menu-content-transform-origin)",
517
+ className
518
+ ),
519
+ ...props
520
+ }
521
+ ) }));
522
+ DropdownMenuContent.displayName = Content2.displayName;
523
+ const DropdownMenuItem = reactExports.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
524
+ Item2,
525
+ {
526
+ ref,
527
+ className: cn(
528
+ "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",
529
+ inset && "pl-8",
530
+ className
531
+ ),
532
+ ...props
533
+ }
534
+ ));
535
+ DropdownMenuItem.displayName = Item2.displayName;
536
+ const DropdownMenuCheckboxItem = reactExports.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
537
+ CheckboxItem2,
538
+ {
539
+ ref,
540
+ className: cn(
541
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
542
+ className
543
+ ),
544
+ checked,
545
+ ...props,
546
+ children: [
547
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "h-4 w-4" }) }) }),
548
+ children
549
+ ]
550
+ }
551
+ ));
552
+ DropdownMenuCheckboxItem.displayName = CheckboxItem2.displayName;
553
+ const DropdownMenuRadioItem = reactExports.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
554
+ RadioItem2,
555
+ {
556
+ ref,
557
+ className: cn(
558
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
559
+ className
560
+ ),
561
+ ...props,
562
+ children: [
563
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
564
+ children
565
+ ]
566
+ }
567
+ ));
568
+ DropdownMenuRadioItem.displayName = RadioItem2.displayName;
569
+ const DropdownMenuLabel = reactExports.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
570
+ Label2,
571
+ {
572
+ ref,
573
+ className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className),
574
+ ...props
575
+ }
576
+ ));
577
+ DropdownMenuLabel.displayName = Label2.displayName;
578
+ const DropdownMenuSeparator = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
579
+ Separator2,
580
+ {
581
+ ref,
582
+ className: cn("-mx-1 my-1 h-px bg-muted", className),
583
+ ...props
584
+ }
585
+ ));
586
+ DropdownMenuSeparator.displayName = Separator2.displayName;
587
+ const Avatar = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
588
+ Root,
589
+ {
590
+ ref,
591
+ className: cn("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", className),
592
+ ...props
593
+ }
594
+ ));
595
+ Avatar.displayName = Root.displayName;
596
+ const AvatarImage = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
597
+ Image,
598
+ {
599
+ ref,
600
+ className: cn("aspect-square h-full w-full", className),
601
+ ...props
602
+ }
603
+ ));
604
+ AvatarImage.displayName = Image.displayName;
605
+ const AvatarFallback = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
606
+ Fallback,
607
+ {
608
+ ref,
609
+ className: cn(
610
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
611
+ className
612
+ ),
613
+ ...props
614
+ }
615
+ ));
616
+ AvatarFallback.displayName = Fallback.displayName;
617
+ const navLinks = [
618
+ { to: "/", label: "Discover" },
619
+ { to: "/categories", label: "Categories" },
620
+ { to: "/search", label: "Search" }
621
+ ];
622
+ function Nav() {
623
+ const { user } = useAuth();
624
+ const path = useRouterState({ select: (r) => r.location.pathname });
625
+ const [open, setOpen] = reactExports.useState(false);
626
+ const { data: profile } = useQuery({
627
+ queryKey: ["nav-profile", user?.id],
628
+ enabled: !!user,
629
+ queryFn: async () => {
630
+ const { data } = await supabase.from("profiles").select("display_name, avatar_url").eq("id", user.id).maybeSingle();
631
+ return data ?? null;
632
+ }
633
+ });
634
+ const initials = profile?.display_name?.slice(0, 1)?.toUpperCase() ?? user?.email?.slice(0, 1)?.toUpperCase() ?? "U";
635
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("header", { className: "sticky top-0 z-50 px-3 pt-3", children: [
636
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "glass-strong rounded-2xl px-4 md:px-6 h-14 flex items-center justify-between max-w-7xl mx-auto shadow-card", children: [
637
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-8", children: [
638
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Logo, {}),
639
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "hidden md:flex items-center gap-1", children: navLinks.map((l) => /* @__PURE__ */ jsxRuntimeExports.jsx(
640
+ Link,
641
+ {
642
+ to: l.to,
643
+ className: `px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${path === l.to ? "text-foreground bg-white/5" : "text-muted-foreground hover:text-foreground hover:bg-white/5"}`,
644
+ children: l.label
645
+ },
646
+ l.to
647
+ )) })
648
+ ] }),
649
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
650
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
651
+ Link,
652
+ {
653
+ to: "/search",
654
+ search: { q: "" },
655
+ className: "hidden sm:flex items-center gap-2 glass rounded-full px-3 py-1.5 text-sm text-muted-foreground hover:text-foreground transition w-56",
656
+ children: [
657
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "w-4 h-4" }),
658
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Search trending finds…" })
659
+ ]
660
+ }
661
+ ),
662
+ user ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
663
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
664
+ Link,
665
+ {
666
+ to: "/saved",
667
+ className: "hidden sm:inline-flex p-2 rounded-full hover:bg-white/5 transition",
668
+ "aria-label": "Saved",
669
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Heart, { className: "w-5 h-5" })
670
+ }
671
+ ),
672
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
673
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
674
+ "button",
675
+ {
676
+ className: "flex items-center gap-2 rounded-full p-1.5 pr-2.5 hover:bg-white/5 transition",
677
+ "aria-label": "Open profile menu",
678
+ children: [
679
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Avatar, { className: "h-9 w-9 border border-white/10", children: [
680
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
681
+ AvatarImage,
682
+ {
683
+ src: profile?.avatar_url ?? void 0,
684
+ alt: profile?.display_name ?? "Profile"
685
+ }
686
+ ),
687
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AvatarFallback, { className: "bg-brand-magenta/20 text-sm font-semibold text-foreground", children: initials })
688
+ ] }),
689
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "hidden sm:block w-4 h-4 text-muted-foreground" })
690
+ ]
691
+ }
692
+ ) }),
693
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuContent, { align: "end", className: "w-64", children: [
694
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuLabel, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
695
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Avatar, { className: "h-10 w-10 border border-white/10", children: [
696
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
697
+ AvatarImage,
698
+ {
699
+ src: profile?.avatar_url ?? void 0,
700
+ alt: profile?.display_name ?? "Profile"
701
+ }
702
+ ),
703
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AvatarFallback, { className: "bg-brand-magenta/20 text-sm font-semibold text-foreground", children: initials })
704
+ ] }),
705
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
706
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-sm font-semibold", children: profile?.display_name || "Your account" }),
707
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-xs text-muted-foreground", children: user.email })
708
+ ] })
709
+ ] }) }),
710
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuSeparator, {}),
711
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/profile", className: "flex w-full items-center gap-2", children: [
712
+ /* @__PURE__ */ jsxRuntimeExports.jsx(User, { className: "w-4 h-4" }),
713
+ "Profile"
714
+ ] }) }),
715
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/saved", className: "flex w-full items-center gap-2", children: [
716
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Heart, { className: "w-4 h-4" }),
717
+ "Saved items"
718
+ ] }) }),
719
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/admin", className: "flex w-full items-center gap-2", children: [
720
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Shield, { className: "w-4 h-4" }),
721
+ "Admin page"
722
+ ] }) }),
723
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuSeparator, {}),
724
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
725
+ DropdownMenuItem,
726
+ {
727
+ className: "flex items-center gap-2 text-destructive focus:text-destructive",
728
+ onSelect: () => {
729
+ supabase.auth.signOut();
730
+ },
731
+ children: [
732
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LogOut, { className: "w-4 h-4" }),
733
+ "Sign out"
734
+ ]
735
+ }
736
+ )
737
+ ] })
738
+ ] })
739
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
740
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
741
+ Link,
742
+ {
743
+ to: "/login",
744
+ className: "hidden sm:inline-flex px-3 py-1.5 text-sm rounded-lg hover:bg-white/5 transition",
745
+ children: "Log in"
746
+ }
747
+ ),
748
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
749
+ Link,
750
+ {
751
+ to: "/signup",
752
+ className: "btn-glow rounded-full px-4 py-1.5 text-sm font-semibold inline-flex items-center gap-1.5",
753
+ children: [
754
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { className: "w-3.5 h-3.5" }),
755
+ " Join free"
756
+ ]
757
+ }
758
+ )
759
+ ] }),
760
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
761
+ "button",
762
+ {
763
+ className: "md:hidden p-2 rounded-lg hover:bg-white/5",
764
+ onClick: () => setOpen(!open),
765
+ "aria-label": "Menu",
766
+ children: open ? /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-5 h-5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Menu, { className: "w-5 h-5" })
767
+ }
768
+ )
769
+ ] })
770
+ ] }),
771
+ open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "md:hidden glass-strong rounded-2xl mt-2 max-w-7xl mx-auto p-3 animate-fade-up", children: [
772
+ navLinks.map((l) => /* @__PURE__ */ jsxRuntimeExports.jsx(
773
+ Link,
774
+ {
775
+ to: l.to,
776
+ onClick: () => setOpen(false),
777
+ className: "block px-3 py-2 rounded-lg text-sm hover:bg-white/5",
778
+ children: l.label
779
+ },
780
+ l.to
781
+ )),
782
+ user ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 border-t border-white/10 pt-2 space-y-1", children: [
783
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
784
+ Link,
785
+ {
786
+ to: "/profile",
787
+ onClick: () => setOpen(false),
788
+ className: "block px-3 py-2 rounded-lg text-sm hover:bg-white/5",
789
+ children: "Profile"
790
+ }
791
+ ),
792
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
793
+ Link,
794
+ {
795
+ to: "/saved",
796
+ onClick: () => setOpen(false),
797
+ className: "block px-3 py-2 rounded-lg text-sm hover:bg-white/5",
798
+ children: "Saved items"
799
+ }
800
+ ),
801
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
802
+ Link,
803
+ {
804
+ to: "/admin",
805
+ onClick: () => setOpen(false),
806
+ className: "block px-3 py-2 rounded-lg text-sm hover:bg-white/5",
807
+ children: "Admin page"
808
+ }
809
+ ),
810
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
811
+ "button",
812
+ {
813
+ onClick: async () => {
814
+ setOpen(false);
815
+ await supabase.auth.signOut();
816
+ },
817
+ className: "w-full text-left px-3 py-2 rounded-lg text-sm text-destructive hover:bg-white/5",
818
+ children: "Sign out"
819
+ }
820
+ )
821
+ ] }) : null
822
+ ] })
823
+ ] });
824
+ }
825
+ const cols = [
826
+ {
827
+ title: "Discover",
828
+ links: [
829
+ { to: "/", label: "Home" },
830
+ { to: "/categories", label: "Categories" },
831
+ { to: "/search", label: "Search" },
832
+ { to: "/saved", label: "Saved" }
833
+ ]
834
+ },
835
+ {
836
+ title: "Company",
837
+ links: [
838
+ { to: "/about", label: "About" },
839
+ { to: "/contact", label: "Contact" },
840
+ { to: "/faq", label: "FAQ" }
841
+ ]
842
+ },
843
+ {
844
+ title: "Legal",
845
+ links: [
846
+ { to: "/privacy", label: "Privacy" },
847
+ { to: "/terms", label: "Terms" },
848
+ { to: "/affiliate-disclosure", label: "Affiliate Disclosure" }
849
+ ]
850
+ }
851
+ ];
852
+ function Footer() {
853
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("footer", { className: "mt-24 border-t border-white/5 px-4", children: [
854
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto py-14 grid grid-cols-2 md:grid-cols-4 gap-10", children: [
855
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "col-span-2 md:col-span-1", children: [
856
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Logo, {}),
857
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-4 max-w-xs", children: "Scroll. Discover. Save. The visual marketplace of the internet's hidden gems." })
858
+ ] }),
859
+ cols.map((c) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
860
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-semibold mb-3", children: c.title }),
861
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: c.links.map((l) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
862
+ Link,
863
+ {
864
+ to: l.to,
865
+ className: "text-sm text-muted-foreground hover:text-foreground transition",
866
+ children: l.label
867
+ }
868
+ ) }, l.to)) })
869
+ ] }, c.title))
870
+ ] }),
871
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto pb-8 text-xs text-muted-foreground flex flex-wrap justify-between gap-3", children: [
872
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
873
+ "© ",
874
+ (/* @__PURE__ */ new Date()).getFullYear(),
875
+ " Scrollsy. All rights reserved."
876
+ ] }),
877
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "opacity-80", children: "Scrollsy may earn commissions from purchases made through affiliate links." })
878
+ ] })
879
+ ] });
880
+ }
881
+ const buttonVariants = cva(
882
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
883
+ {
884
+ variants: {
885
+ variant: {
886
+ default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
887
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
888
+ outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
889
+ secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
890
+ ghost: "hover:bg-accent hover:text-accent-foreground",
891
+ link: "text-primary underline-offset-4 hover:underline"
892
+ },
893
+ size: {
894
+ default: "h-9 px-4 py-2",
895
+ sm: "h-8 rounded-md px-3 text-xs",
896
+ lg: "h-10 rounded-md px-8",
897
+ icon: "h-9 w-9"
898
+ }
899
+ },
900
+ defaultVariants: {
901
+ variant: "default",
902
+ size: "default"
903
+ }
904
+ }
905
+ );
906
+ const Button = reactExports.forwardRef(
907
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
908
+ const Comp = asChild ? Slot : "button";
909
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Comp, { className: cn(buttonVariants({ variant, size, className })), ref, ...props });
910
+ }
911
+ );
912
+ Button.displayName = "Button";
913
+ const Dialog = Root$1;
914
+ const DialogPortal = Portal;
915
+ const DialogOverlay = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
916
+ Overlay,
917
+ {
918
+ ref,
919
+ className: cn(
920
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
921
+ className
922
+ ),
923
+ ...props
924
+ }
925
+ ));
926
+ DialogOverlay.displayName = Overlay.displayName;
927
+ const DialogContent = reactExports.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogPortal, { children: [
928
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogOverlay, {}),
929
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
930
+ Content,
931
+ {
932
+ ref,
933
+ className: cn(
934
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",
935
+ className
936
+ ),
937
+ ...props,
938
+ children: [
939
+ children,
940
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background cursor-pointer transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
941
+ /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "h-4 w-4" }),
942
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Close" })
943
+ ] })
944
+ ]
945
+ }
946
+ )
947
+ ] }));
948
+ DialogContent.displayName = Content.displayName;
949
+ const DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
950
+ DialogHeader.displayName = "DialogHeader";
951
+ const DialogTitle = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
952
+ Title,
953
+ {
954
+ ref,
955
+ className: cn("text-lg font-semibold leading-none tracking-tight", className),
956
+ ...props
957
+ }
958
+ ));
959
+ DialogTitle.displayName = Title.displayName;
960
+ const DialogDescription = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
961
+ Description,
962
+ {
963
+ ref,
964
+ className: cn("text-sm text-muted-foreground", className),
965
+ ...props
966
+ }
967
+ ));
968
+ DialogDescription.displayName = Description.displayName;
969
+ const paymentMethods = [
970
+ {
971
+ id: "binance",
972
+ name: "Binance Pay",
973
+ logo: "🟡",
974
+ detailLabel: "Binance Pay ID",
975
+ detail: "scrollsy-support",
976
+ href: "https://pay.binance.com/",
977
+ tone: "from-[#f3ba2f]/30 via-[#f3ba2f]/10 to-white/5"
978
+ },
979
+ {
980
+ id: "googlepay",
981
+ name: "Google Pay",
982
+ logo: "G",
983
+ detailLabel: "Google Pay",
984
+ detail: "scrollsy.support@googlepay",
985
+ href: "https://pay.google.com/",
986
+ tone: "from-[#67e8f9]/30 via-[#00d4ff]/10 to-white/5"
987
+ },
988
+ {
989
+ id: "paypal",
990
+ name: "PayPal",
991
+ logo: "P",
992
+ detailLabel: "PayPal",
993
+ detail: "paypal.me/scrollsydev",
994
+ href: "https://paypal.me/",
995
+ tone: "from-[#8b5cf6]/30 via-[#ff3cac]/10 to-white/5"
996
+ },
997
+ {
998
+ id: "mpesa",
999
+ name: "M-Pesa",
1000
+ logo: "M",
1001
+ detailLabel: "Pay number",
1002
+ detail: "+254 700 000 000",
1003
+ tone: "from-[#10b981]/30 via-[#67e8f9]/10 to-white/5"
1004
+ }
1005
+ ];
1006
+ function SupportWidget() {
1007
+ const [open, setOpen] = reactExports.useState(false);
1008
+ const [copiedId, setCopiedId] = reactExports.useState(null);
1009
+ const [pulse, setPulse] = reactExports.useState(false);
1010
+ const particleSeed = reactExports.useMemo(() => Array.from({ length: 12 }, (_, i) => i), []);
1011
+ reactExports.useEffect(() => {
1012
+ const id = window.setInterval(() => setPulse((v) => !v), 2600);
1013
+ return () => window.clearInterval(id);
1014
+ }, []);
1015
+ const copyDetail = async (method) => {
1016
+ await navigator.clipboard.writeText(method.detail);
1017
+ setCopiedId(method.id);
1018
+ window.setTimeout(
1019
+ () => setCopiedId((current) => current === method.id ? null : current),
1020
+ 1500
1021
+ );
1022
+ };
1023
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
1024
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1025
+ motion.button,
1026
+ {
1027
+ type: "button",
1028
+ onClick: () => setOpen(true),
1029
+ className: "fixed bottom-4 right-4 z-[60] group rounded-full bg-black/70 backdrop-blur-xl border border-white/10 shadow-[0_0_40px_rgba(0,212,255,0.24)] px-4 py-3 text-sm font-semibold inline-flex items-center gap-2 overflow-hidden",
1030
+ whileHover: { scale: 1.04, y: -2 },
1031
+ whileTap: { scale: 0.97 },
1032
+ "aria-label": "Support the Project",
1033
+ children: [
1034
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute inset-0 bg-gradient-to-r from-[#8b5cf6]/30 via-[#00d4ff]/20 to-[#ff3cac]/30 opacity-60 group-hover:opacity-100 transition-opacity" }),
1035
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "relative inline-flex items-center gap-2", children: [
1036
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Heart, { className: "w-4 h-4 text-[#67e8f9]" }),
1037
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "hidden sm:inline", children: "Support the Project ❤️" }),
1038
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sm:hidden", children: "Support" })
1039
+ ] })
1040
+ ]
1041
+ }
1042
+ ),
1043
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-w-5xl bg-[#050816]/95 border-white/10 text-white overflow-hidden", children: [
1044
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(139,92,246,0.25),_transparent_35%),radial-gradient(circle_at_top_right,_rgba(0,212,255,0.18),_transparent_28%),radial-gradient(circle_at_bottom,_rgba(255,60,172,0.15),_transparent_36%)]" }),
1045
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pointer-events-none absolute inset-0", children: particleSeed.map((n) => /* @__PURE__ */ jsxRuntimeExports.jsx(
1046
+ motion.span,
1047
+ {
1048
+ className: "absolute block h-1.5 w-1.5 rounded-full bg-[#67e8f9]/70 shadow-[0_0_12px_rgba(103,232,249,0.9)]",
1049
+ initial: { opacity: 0.2, y: 0, x: 0 },
1050
+ animate: {
1051
+ opacity: [0.15, 0.8, 0.15],
1052
+ y: [0, -24 - n % 4 * 10, 0],
1053
+ x: [0, n % 2 === 0 ? 14 : -14, 0]
1054
+ },
1055
+ transition: { duration: 5 + n % 4, repeat: Infinity, ease: "easeInOut" },
1056
+ style: { left: `${8 + n * 7}%`, top: `${14 + n % 5 * 14}%` }
1057
+ },
1058
+ n
1059
+ )) }),
1060
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { className: "relative z-10", children: [
1061
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { className: "text-2xl md:text-4xl font-bold tracking-tight", children: "Found something awesome for cheap? Support the platform and keep the deals flowing 🚀" }),
1062
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm md:text-base text-white/75 max-w-2xl mt-2", children: "Your tips help keep the site fast, updated, ad-light, and full of amazing finds." })
1063
+ ] }),
1064
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative z-10 mt-6 grid gap-4 md:grid-cols-2 xl:grid-cols-4", children: paymentMethods.map((method) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
1065
+ motion.div,
1066
+ {
1067
+ className: cn(
1068
+ "relative overflow-hidden rounded-3xl border border-white/10 bg-white/5 backdrop-blur-xl p-4 shadow-[0_20px_70px_rgba(0,0,0,0.4)]",
1069
+ `bg-gradient-to-br ${method.tone}`
1070
+ ),
1071
+ whileHover: { y: -6, scale: 1.01 },
1072
+ transition: { type: "spring", stiffness: 280, damping: 20 },
1073
+ children: [
1074
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 opacity-0 hover:opacity-100 transition-opacity bg-[linear-gradient(110deg,transparent,rgba(255,255,255,0.18),transparent)] bg-[length:200%_100%] animate-[shimmer_2s_linear_infinite]" }),
1075
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex items-start justify-between gap-3", children: [
1076
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
1077
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inline-flex h-12 w-12 items-center justify-center rounded-2xl bg-black/30 border border-white/10 text-2xl shadow-[0_0_24px_rgba(255,255,255,0.08)]", children: method.logo }),
1078
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "mt-3 text-lg font-semibold", children: method.name }),
1079
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-white/70", children: method.detailLabel })
1080
+ ] }),
1081
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { className: "w-5 h-5 text-[#67e8f9]" })
1082
+ ] }),
1083
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative mt-4 rounded-2xl border border-white/10 bg-black/25 p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-mono break-all", children: method.detail }) }),
1084
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative mt-4 flex items-center gap-2", children: [
1085
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1086
+ Button,
1087
+ {
1088
+ type: "button",
1089
+ onClick: () => copyDetail(method),
1090
+ className: "flex-1 rounded-full bg-white/10 hover:bg-white/15 text-white border border-white/10",
1091
+ children: [
1092
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "mr-2 h-4 w-4" }),
1093
+ copiedId === method.id ? "Copied" : "Copy"
1094
+ ]
1095
+ }
1096
+ ),
1097
+ method.href ? /* @__PURE__ */ jsxRuntimeExports.jsx(
1098
+ Button,
1099
+ {
1100
+ asChild: true,
1101
+ className: "rounded-full bg-gradient-to-r from-[#8b5cf6] via-[#00d4ff] to-[#ff3cac] text-white border-0",
1102
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: method.href, target: "_blank", rel: "noreferrer", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "h-4 w-4" }) })
1103
+ }
1104
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inline-flex h-10 w-10 items-center justify-center rounded-full bg-white/8 border border-white/10", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LockKeyhole, { className: "h-4 w-4 text-white/70" }) })
1105
+ ] })
1106
+ ]
1107
+ },
1108
+ method.id
1109
+ )) }),
1110
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative z-10 mt-6 flex flex-wrap gap-3 text-xs text-white/70", children: [
1111
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1.5", children: [
1112
+ /* @__PURE__ */ jsxRuntimeExports.jsx(WalletCards, { className: "h-3.5 w-3.5 text-[#67e8f9]" }),
1113
+ " Secure, low-friction support"
1114
+ ] }),
1115
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1.5", children: [
1116
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link2, { className: "h-3.5 w-3.5 text-[#ff3cac]" }),
1117
+ " No spammy upsells"
1118
+ ] })
1119
+ ] })
1120
+ ] }) }) })
1121
+ ] });
1122
+ }
1123
+ const Toaster = ({ ...props }) => {
1124
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
1125
+ Toaster$1,
1126
+ {
1127
+ className: "toaster group",
1128
+ toastOptions: {
1129
+ classNames: {
1130
+ toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
1131
+ description: "group-[.toast]:text-muted-foreground",
1132
+ actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
1133
+ cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
1134
+ }
1135
+ },
1136
+ ...props
1137
+ }
1138
+ );
1139
+ };
1140
+ function NotFoundComponent() {
1141
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-h-screen items-center justify-center px-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md text-center", children: [
1142
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-8xl font-display font-bold text-gradient", children: "404" }),
1143
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mt-4 text-2xl font-semibold", children: "Page not found" }),
1144
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "This deal might have scrolled off the page." }),
1145
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1146
+ Link,
1147
+ {
1148
+ to: "/",
1149
+ className: "btn-glow inline-flex items-center justify-center rounded-full px-5 py-2.5 text-sm font-semibold",
1150
+ children: "Back to discovery"
1151
+ }
1152
+ ) })
1153
+ ] }) });
1154
+ }
1155
+ function ErrorComponent({ error, reset }) {
1156
+ console.error(error);
1157
+ const router2 = useRouter();
1158
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-h-screen items-center justify-center px-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md text-center glass-strong rounded-3xl p-8", children: [
1159
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-xl font-semibold", children: "Something went wrong" }),
1160
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Try again or head home." }),
1161
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-6 flex flex-wrap justify-center gap-2", children: [
1162
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1163
+ "button",
1164
+ {
1165
+ onClick: () => {
1166
+ router2.invalidate();
1167
+ reset();
1168
+ },
1169
+ className: "btn-glow rounded-full px-4 py-2 text-sm font-semibold",
1170
+ children: "Try again"
1171
+ }
1172
+ ),
1173
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1174
+ "a",
1175
+ {
1176
+ href: "/",
1177
+ className: "rounded-full border border-white/10 px-4 py-2 text-sm hover:bg-white/5",
1178
+ children: "Go home"
1179
+ }
1180
+ )
1181
+ ] })
1182
+ ] }) });
1183
+ }
1184
+ const Route$k = createRootRouteWithContext()({
1185
+ head: () => ({
1186
+ meta: [
1187
+ { charSet: "utf-8" },
1188
+ { name: "viewport", content: "width=device-width, initial-scale=1" },
1189
+ { title: "Scrollsy — Scroll. Discover. Save." },
1190
+ {
1191
+ name: "description",
1192
+ content: "Scrollsy is the visual marketplace for viral gadgets, hidden gems, and trending finds. Scroll, discover, and save deals from across the web."
1193
+ },
1194
+ { name: "author", content: "Scrollsy" },
1195
+ { name: "theme-color", content: "#0a0a14" },
1196
+ { property: "og:title", content: "Scrollsy — Scroll. Discover. Save." },
1197
+ {
1198
+ property: "og:description",
1199
+ content: "Scrollsy is the visual marketplace for viral gadgets, hidden gems, and trending finds. Scroll, discover, and save deals from across the web."
1200
+ },
1201
+ { property: "og:type", content: "website" },
1202
+ { name: "twitter:card", content: "summary_large_image" },
1203
+ { name: "twitter:site", content: "@scrollsy" },
1204
+ { name: "twitter:title", content: "Scrollsy — Scroll. Discover. Save." },
1205
+ {
1206
+ name: "twitter:description",
1207
+ content: "Scrollsy is the visual marketplace for viral gadgets, hidden gems, and trending finds. Scroll, discover, and save deals from across the web."
1208
+ },
1209
+ {
1210
+ property: "og:image",
1211
+ content: "https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/65d9820e-6b8c-4ad9-8991-3bc47757ff5e"
1212
+ },
1213
+ {
1214
+ name: "twitter:image",
1215
+ content: "https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/65d9820e-6b8c-4ad9-8991-3bc47757ff5e"
1216
+ }
1217
+ ],
1218
+ links: [{ rel: "stylesheet", href: appCss }]
1219
+ }),
1220
+ shellComponent: RootShell,
1221
+ component: RootComponent,
1222
+ notFoundComponent: NotFoundComponent,
1223
+ errorComponent: ErrorComponent
1224
+ });
1225
+ function RootShell({ children }) {
1226
+ reactExports.useEffect(() => {
1227
+ if (typeof window === "undefined" || !("serviceWorker" in navigator)) return;
1228
+ navigator.serviceWorker.register("/sw.js").catch(() => void 0);
1229
+ }, []);
1230
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("html", { lang: "en", className: "dark", children: [
1231
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("head", { children: [
1232
+ /* @__PURE__ */ jsxRuntimeExports.jsx(HeadContent, {}),
1233
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1234
+ "link",
1235
+ {
1236
+ rel: "stylesheet",
1237
+ href: "https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=DM+Sans:wght@400;500;600;700&display=swap"
1238
+ }
1239
+ ),
1240
+ /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "manifest", href: "/manifest.webmanifest" }),
1241
+ /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "apple-mobile-web-app-capable", content: "yes" }),
1242
+ /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "apple-mobile-web-app-status-bar-style", content: "black-translucent" })
1243
+ ] }),
1244
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("body", { children: [
1245
+ children,
1246
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Scripts, {})
1247
+ ] })
1248
+ ] });
1249
+ }
1250
+ function AuthInvalidator() {
1251
+ const router2 = useRouter();
1252
+ const qc = useQueryClient();
1253
+ reactExports.useEffect(() => {
1254
+ const {
1255
+ data: { subscription }
1256
+ } = supabase.auth.onAuthStateChange(() => {
1257
+ router2.invalidate();
1258
+ qc.invalidateQueries();
1259
+ });
1260
+ return () => subscription.unsubscribe();
1261
+ }, [router2, qc]);
1262
+ return null;
1263
+ }
1264
+ function RootComponent() {
1265
+ const { queryClient } = Route$k.useRouteContext();
1266
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(QueryClientProvider, { client: queryClient, children: [
1267
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AuthInvalidator, {}),
1268
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-h-screen flex flex-col", children: [
1269
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Nav, {}),
1270
+ /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) }),
1271
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Footer, {})
1272
+ ] }),
1273
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SupportWidget, {}),
1274
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Toaster, { theme: "dark", position: "bottom-right" }),
1275
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Analytics, {})
1276
+ ] });
1277
+ }
1278
+ const $$splitComponentImporter$i = () => import("./update-password-Cr94ea8n.js");
1279
+ const Route$j = createFileRoute("/update-password")({
1280
+ head: () => ({
1281
+ meta: [{
1282
+ title: "Set a new password · Scrollsy"
1283
+ }]
1284
+ }),
1285
+ component: lazyRouteComponent($$splitComponentImporter$i, "component")
1286
+ });
1287
+ const $$splitComponentImporter$h = () => import("./terms-CMnX95bP.js");
1288
+ const Route$i = createFileRoute("/terms")({
1289
+ head: () => ({
1290
+ meta: [{
1291
+ title: "Terms of Service · Scrollsy"
1292
+ }, {
1293
+ name: "description",
1294
+ content: "Scrollsy terms of service."
1295
+ }]
1296
+ }),
1297
+ component: lazyRouteComponent($$splitComponentImporter$h, "component")
1298
+ });
1299
+ const BASE_URL = "";
1300
+ const Route$h = createFileRoute("/sitemap.xml")({
1301
+ server: {
1302
+ handlers: {
1303
+ GET: async () => {
1304
+ const paths = [
1305
+ { path: "/", priority: "1.0", changefreq: "daily" },
1306
+ { path: "/categories", priority: "0.9", changefreq: "weekly" },
1307
+ { path: "/search", priority: "0.6", changefreq: "weekly" },
1308
+ { path: "/about", priority: "0.5", changefreq: "monthly" },
1309
+ { path: "/contact", priority: "0.5", changefreq: "monthly" },
1310
+ { path: "/faq", priority: "0.5", changefreq: "monthly" },
1311
+ { path: "/privacy", priority: "0.3", changefreq: "yearly" },
1312
+ { path: "/terms", priority: "0.3", changefreq: "yearly" },
1313
+ { path: "/affiliate-disclosure", priority: "0.3", changefreq: "yearly" },
1314
+ { path: "/login", priority: "0.3", changefreq: "yearly" },
1315
+ { path: "/signup", priority: "0.4", changefreq: "yearly" }
1316
+ ];
1317
+ const urls = paths.map(
1318
+ (e) => ` <url>
1319
+ <loc>${BASE_URL}${e.path}</loc>
1320
+ <changefreq>${e.changefreq}</changefreq>
1321
+ <priority>${e.priority}</priority>
1322
+ </url>`
1323
+ );
1324
+ const xml = `<?xml version="1.0" encoding="UTF-8"?>
1325
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
1326
+ ${urls.join("\n")}
1327
+ </urlset>`;
1328
+ return new Response(xml, {
1329
+ headers: { "Content-Type": "application/xml", "Cache-Control": "public, max-age=3600" }
1330
+ });
1331
+ }
1332
+ }
1333
+ }
1334
+ });
1335
+ const $$splitComponentImporter$g = () => import("./signup-UPzgZo4i.js");
1336
+ const Route$g = createFileRoute("/signup")({
1337
+ head: () => ({
1338
+ meta: [{
1339
+ title: "Join Scrollsy — Sign up free"
1340
+ }]
1341
+ }),
1342
+ component: lazyRouteComponent($$splitComponentImporter$g, "component")
1343
+ });
1344
+ const $$splitComponentImporter$f = () => import("./search-Yw5c_fZa.js");
1345
+ const searchSchema = objectType({
1346
+ q: stringType().optional().default("")
1347
+ });
1348
+ const Route$f = createFileRoute("/search")({
1349
+ validateSearch: (s) => searchSchema.parse(s),
1350
+ head: () => ({
1351
+ meta: [{
1352
+ title: "Search · Scrollsy"
1353
+ }, {
1354
+ name: "description",
1355
+ content: "Search trending products and viral finds on Scrollsy."
1356
+ }]
1357
+ }),
1358
+ component: lazyRouteComponent($$splitComponentImporter$f, "component")
1359
+ });
1360
+ const $$splitComponentImporter$e = () => import("./saved-7FA6Dbom.js");
1361
+ const Route$e = createFileRoute("/saved")({
1362
+ head: () => ({
1363
+ meta: [{
1364
+ title: "Saved · Scrollsy"
1365
+ }]
1366
+ }),
1367
+ component: lazyRouteComponent($$splitComponentImporter$e, "component")
1368
+ });
1369
+ const $$splitComponentImporter$d = () => import("./reset-password-CY-rmqMr.js");
1370
+ const Route$d = createFileRoute("/reset-password")({
1371
+ head: () => ({
1372
+ meta: [{
1373
+ title: "Reset password · Scrollsy"
1374
+ }]
1375
+ }),
1376
+ component: lazyRouteComponent($$splitComponentImporter$d, "component")
1377
+ });
1378
+ const $$splitComponentImporter$c = () => import("./profile-B0NWzVAZ.js");
1379
+ const Route$c = createFileRoute("/profile")({
1380
+ head: () => ({
1381
+ meta: [{
1382
+ title: "Profile · Scrollsy"
1383
+ }]
1384
+ }),
1385
+ component: lazyRouteComponent($$splitComponentImporter$c, "component")
1386
+ });
1387
+ const $$splitComponentImporter$b = () => import("./privacy-B6Wiez1P.js");
1388
+ const Route$b = createFileRoute("/privacy")({
1389
+ head: () => ({
1390
+ meta: [{
1391
+ title: "Privacy Policy · Scrollsy"
1392
+ }, {
1393
+ name: "description",
1394
+ content: "How Scrollsy collects, uses and protects your data."
1395
+ }]
1396
+ }),
1397
+ component: lazyRouteComponent($$splitComponentImporter$b, "component")
1398
+ });
1399
+ const $$splitComponentImporter$a = () => import("./login-Dvy5Dm0f.js");
1400
+ const Route$a = createFileRoute("/login")({
1401
+ head: () => ({
1402
+ meta: [{
1403
+ title: "Log in · Scrollsy"
1404
+ }]
1405
+ }),
1406
+ component: lazyRouteComponent($$splitComponentImporter$a, "component")
1407
+ });
1408
+ function Field({
1409
+ icon,
1410
+ value,
1411
+ onChange,
1412
+ type = "text",
1413
+ placeholder
1414
+ }) {
1415
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 glass rounded-xl px-3 py-2.5", children: [
1416
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground", children: icon }),
1417
+ /* @__PURE__ */ jsxRuntimeExports.jsx("input", { type, value, onChange: (e) => onChange(e.target.value), placeholder, className: "flex-1 bg-transparent outline-none text-sm placeholder:text-muted-foreground" })
1418
+ ] });
1419
+ }
1420
+ const $$splitComponentImporter$9 = () => import("./faq-aRhB_CR3.js");
1421
+ const Route$9 = createFileRoute("/faq")({
1422
+ head: () => ({
1423
+ meta: [{
1424
+ title: "FAQ · Scrollsy"
1425
+ }, {
1426
+ name: "description",
1427
+ content: "Frequently asked questions about Scrollsy — affiliate links, deals, accounts and more."
1428
+ }]
1429
+ }),
1430
+ component: lazyRouteComponent($$splitComponentImporter$9, "component")
1431
+ });
1432
+ const $$splitComponentImporter$8 = () => import("./contact-IzyONsXs.js");
1433
+ const Route$8 = createFileRoute("/contact")({
1434
+ head: () => ({
1435
+ meta: [{
1436
+ title: "Contact · Scrollsy"
1437
+ }, {
1438
+ name: "description",
1439
+ content: "Get in touch with the Scrollsy team — partnerships, press, support and creator collabs."
1440
+ }]
1441
+ }),
1442
+ component: lazyRouteComponent($$splitComponentImporter$8, "component")
1443
+ });
1444
+ const $$splitComponentImporter$7 = () => import("./categories-Z7jnAYZP.js");
1445
+ const Route$7 = createFileRoute("/categories")({
1446
+ head: () => ({
1447
+ meta: [{
1448
+ title: "Categories · Scrollsy"
1449
+ }, {
1450
+ name: "description",
1451
+ content: "Browse Scrollsy product categories — tech, fashion, smart home, gaming, viral finds and more."
1452
+ }],
1453
+ links: [{
1454
+ rel: "canonical",
1455
+ href: "/categories"
1456
+ }]
1457
+ }),
1458
+ component: lazyRouteComponent($$splitComponentImporter$7, "component")
1459
+ });
1460
+ const $$splitComponentImporter$6 = () => import("./affiliate-disclosure-B1wI1cDb.js");
1461
+ const Route$6 = createFileRoute("/affiliate-disclosure")({
1462
+ head: () => ({
1463
+ meta: [{
1464
+ title: "Affiliate Disclosure · Scrollsy"
1465
+ }, {
1466
+ name: "description",
1467
+ content: "How Scrollsy makes money — full affiliate disclosure."
1468
+ }]
1469
+ }),
1470
+ component: lazyRouteComponent($$splitComponentImporter$6, "component")
1471
+ });
1472
+ const $$splitComponentImporter$5 = () => import("./admin-DspfJOJk.js");
1473
+ const Route$5 = createFileRoute("/admin")({
1474
+ head: () => ({
1475
+ meta: [{
1476
+ title: "Admin · Scrollsy"
1477
+ }, {
1478
+ name: "robots",
1479
+ content: "noindex"
1480
+ }]
1481
+ }),
1482
+ component: lazyRouteComponent($$splitComponentImporter$5, "component")
1483
+ });
1484
+ const $$splitComponentImporter$4 = () => import("./about-TfKQw0Ga.js");
1485
+ const Route$4 = createFileRoute("/about")({
1486
+ head: () => ({
1487
+ meta: [{
1488
+ title: "About · Scrollsy"
1489
+ }, {
1490
+ name: "description",
1491
+ content: "Scrollsy is the visual marketplace for trending products, viral finds and smart shopping discoveries."
1492
+ }],
1493
+ links: [{
1494
+ rel: "canonical",
1495
+ href: "/about"
1496
+ }]
1497
+ }),
1498
+ component: lazyRouteComponent($$splitComponentImporter$4, "component")
1499
+ });
1500
+ function Prose({
1501
+ title,
1502
+ subtitle,
1503
+ children
1504
+ }) {
1505
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-3xl mx-auto px-4 pt-12", children: [
1506
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "font-display text-4xl md:text-5xl font-bold tracking-tight", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-gradient", children: title }) }),
1507
+ subtitle && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-muted-foreground mt-3", children: subtitle }),
1508
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "prose prose-invert mt-8 space-y-4 [&_h2]:font-display [&_h2]:text-2xl [&_h2]:font-bold [&_h2]:mt-10 [&_h2]:mb-2 [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:space-y-1 [&_p]:text-muted-foreground [&_li]:text-muted-foreground", children })
1509
+ ] });
1510
+ }
1511
+ const heroBg = "/assets/hero-bg-BP2eVUIX.jpg";
1512
+ const $$splitComponentImporter$3 = () => import("./index-BTPHbXw9.js");
1513
+ const Route$3 = createFileRoute("/")({
1514
+ head: () => ({
1515
+ meta: [{
1516
+ title: "Scrollsy — Scroll. Discover. Save."
1517
+ }, {
1518
+ name: "description",
1519
+ content: "Discover viral gadgets, trending finds and hidden deals on Scrollsy — the visual marketplace built for endless scrolling."
1520
+ }, {
1521
+ property: "og:title",
1522
+ content: "Scrollsy — Scroll. Discover. Save."
1523
+ }, {
1524
+ property: "og:image",
1525
+ content: heroBg
1526
+ }],
1527
+ links: [{
1528
+ rel: "canonical",
1529
+ href: "/"
1530
+ }]
1531
+ }),
1532
+ component: lazyRouteComponent($$splitComponentImporter$3, "component")
1533
+ });
1534
+ const $$splitComponentImporter$2 = () => import("./product._id-BpRa-1z0.js");
1535
+ const Route$2 = createFileRoute("/product/$id")({
1536
+ head: () => ({
1537
+ meta: [{
1538
+ title: "Product · Scrollsy"
1539
+ }]
1540
+ }),
1541
+ component: lazyRouteComponent($$splitComponentImporter$2, "component")
1542
+ });
1543
+ const $$splitComponentImporter$1 = () => import("./category._slug-D0XY3FGK.js");
1544
+ const Route$1 = createFileRoute("/category/$slug")({
1545
+ head: ({
1546
+ params
1547
+ }) => ({
1548
+ meta: [{
1549
+ title: `${params.slug.replace(/-/g, " ")} · Scrollsy`
1550
+ }, {
1551
+ name: "description",
1552
+ content: `Browse trending ${params.slug.replace(/-/g, " ")} finds on Scrollsy.`
1553
+ }]
1554
+ }),
1555
+ component: lazyRouteComponent($$splitComponentImporter$1, "component")
1556
+ });
1557
+ const $$splitComponentImporter = () => import("./admin.login-CV7QfeA6.js");
1558
+ const Route = createFileRoute("/admin/login")({
1559
+ head: () => ({
1560
+ meta: [{
1561
+ title: "Admin sign-in · Scrollsy"
1562
+ }, {
1563
+ name: "robots",
1564
+ content: "noindex"
1565
+ }]
1566
+ }),
1567
+ component: lazyRouteComponent($$splitComponentImporter, "component")
1568
+ });
1569
+ const UpdatePasswordRoute = Route$j.update({
1570
+ id: "/update-password",
1571
+ path: "/update-password",
1572
+ getParentRoute: () => Route$k
1573
+ });
1574
+ const TermsRoute = Route$i.update({
1575
+ id: "/terms",
1576
+ path: "/terms",
1577
+ getParentRoute: () => Route$k
1578
+ });
1579
+ const SitemapDotxmlRoute = Route$h.update({
1580
+ id: "/sitemap.xml",
1581
+ path: "/sitemap.xml",
1582
+ getParentRoute: () => Route$k
1583
+ });
1584
+ const SignupRoute = Route$g.update({
1585
+ id: "/signup",
1586
+ path: "/signup",
1587
+ getParentRoute: () => Route$k
1588
+ });
1589
+ const SearchRoute = Route$f.update({
1590
+ id: "/search",
1591
+ path: "/search",
1592
+ getParentRoute: () => Route$k
1593
+ });
1594
+ const SavedRoute = Route$e.update({
1595
+ id: "/saved",
1596
+ path: "/saved",
1597
+ getParentRoute: () => Route$k
1598
+ });
1599
+ const ResetPasswordRoute = Route$d.update({
1600
+ id: "/reset-password",
1601
+ path: "/reset-password",
1602
+ getParentRoute: () => Route$k
1603
+ });
1604
+ const ProfileRoute = Route$c.update({
1605
+ id: "/profile",
1606
+ path: "/profile",
1607
+ getParentRoute: () => Route$k
1608
+ });
1609
+ const PrivacyRoute = Route$b.update({
1610
+ id: "/privacy",
1611
+ path: "/privacy",
1612
+ getParentRoute: () => Route$k
1613
+ });
1614
+ const LoginRoute = Route$a.update({
1615
+ id: "/login",
1616
+ path: "/login",
1617
+ getParentRoute: () => Route$k
1618
+ });
1619
+ const FaqRoute = Route$9.update({
1620
+ id: "/faq",
1621
+ path: "/faq",
1622
+ getParentRoute: () => Route$k
1623
+ });
1624
+ const ContactRoute = Route$8.update({
1625
+ id: "/contact",
1626
+ path: "/contact",
1627
+ getParentRoute: () => Route$k
1628
+ });
1629
+ const CategoriesRoute = Route$7.update({
1630
+ id: "/categories",
1631
+ path: "/categories",
1632
+ getParentRoute: () => Route$k
1633
+ });
1634
+ const AffiliateDisclosureRoute = Route$6.update({
1635
+ id: "/affiliate-disclosure",
1636
+ path: "/affiliate-disclosure",
1637
+ getParentRoute: () => Route$k
1638
+ });
1639
+ const AdminRoute = Route$5.update({
1640
+ id: "/admin",
1641
+ path: "/admin",
1642
+ getParentRoute: () => Route$k
1643
+ });
1644
+ const AboutRoute = Route$4.update({
1645
+ id: "/about",
1646
+ path: "/about",
1647
+ getParentRoute: () => Route$k
1648
+ });
1649
+ const IndexRoute = Route$3.update({
1650
+ id: "/",
1651
+ path: "/",
1652
+ getParentRoute: () => Route$k
1653
+ });
1654
+ const ProductIdRoute = Route$2.update({
1655
+ id: "/product/$id",
1656
+ path: "/product/$id",
1657
+ getParentRoute: () => Route$k
1658
+ });
1659
+ const CategorySlugRoute = Route$1.update({
1660
+ id: "/category/$slug",
1661
+ path: "/category/$slug",
1662
+ getParentRoute: () => Route$k
1663
+ });
1664
+ const AdminLoginRoute = Route.update({
1665
+ id: "/login",
1666
+ path: "/login",
1667
+ getParentRoute: () => AdminRoute
1668
+ });
1669
+ const AdminRouteChildren = {
1670
+ AdminLoginRoute
1671
+ };
1672
+ const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren);
1673
+ const rootRouteChildren = {
1674
+ IndexRoute,
1675
+ AboutRoute,
1676
+ AdminRoute: AdminRouteWithChildren,
1677
+ AffiliateDisclosureRoute,
1678
+ CategoriesRoute,
1679
+ ContactRoute,
1680
+ FaqRoute,
1681
+ LoginRoute,
1682
+ PrivacyRoute,
1683
+ ProfileRoute,
1684
+ ResetPasswordRoute,
1685
+ SavedRoute,
1686
+ SearchRoute,
1687
+ SignupRoute,
1688
+ SitemapDotxmlRoute,
1689
+ TermsRoute,
1690
+ UpdatePasswordRoute,
1691
+ CategorySlugRoute,
1692
+ ProductIdRoute
1693
+ };
1694
+ const routeTree = Route$k._addFileChildren(rootRouteChildren)._addFileTypes();
1695
+ const getRouter = () => {
1696
+ const queryClient = new QueryClient();
1697
+ const router2 = createRouter({
1698
+ routeTree,
1699
+ context: { queryClient },
1700
+ scrollRestoration: true,
1701
+ defaultPreloadStaleTime: 0
1702
+ });
1703
+ return router2;
1704
+ };
1705
+ const router = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1706
+ __proto__: null,
1707
+ getRouter
1708
+ }, Symbol.toStringTag, { value: "Module" }));
1709
+ export {
1710
+ Avatar as A,
1711
+ FRAME_HEADER_SIZE as F,
1712
+ Logo as L,
1713
+ Prose as P,
1714
+ Route$f as R,
1715
+ TSS_CONTENT_TYPE_FRAMED_VERSIONED as T,
1716
+ X_TSS_RAW_RESPONSE as X,
1717
+ __23tanstackStartPluginAdapters as _,
1718
+ AvatarFallback as a,
1719
+ AvatarImage as b,
1720
+ Field as c,
1721
+ FrameType as d,
1722
+ Route$2 as e,
1723
+ Route$1 as f,
1724
+ TSS_FORMDATA_CONTEXT as g,
1725
+ TSS_SERVER_FUNCTION as h,
1726
+ X_TSS_SERIALIZED as i,
1727
+ cn as j,
1728
+ createCsrfMiddleware as k,
1729
+ createMiddleware as l,
1730
+ createNullProtoObject as m,
1731
+ createServerFn as n,
1732
+ flattenMiddlewares as o,
1733
+ getDefaultSerovalPlugins as p,
1734
+ heroBg as q,
1735
+ renderErrorPage as r,
1736
+ router as s,
1737
+ safeObjectMerge as t,
1738
+ start as u,
1739
+ supabase as v,
1740
+ useAuth as w
1741
+ };