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.
- package/.wrangler/deploy/config.json +1 -0
- package/bunfig.toml +6 -0
- package/components.json +22 -0
- package/config.json +0 -0
- package/dist/client/.assetsignore +2 -0
- package/dist/client/assets/ProductCard-DbIkJAE-.js +1 -0
- package/dist/client/assets/about-AskxOruL.js +1 -0
- package/dist/client/assets/admin-BZVcAQM3.js +1 -0
- package/dist/client/assets/admin.functions--RdVcuBx.js +1 -0
- package/dist/client/assets/admin.login-QgrF_9Fp.js +1 -0
- package/dist/client/assets/affiliate-disclosure-BIAsA-HO.js +1 -0
- package/dist/client/assets/categories-D0N418mK.js +1 -0
- package/dist/client/assets/category._slug-aCaQm14E.js +1 -0
- package/dist/client/assets/contact-PhvO-V15.js +1 -0
- package/dist/client/assets/faq-BsiHWPM8.js +1 -0
- package/dist/client/assets/hero-bg-BP2eVUIX.jpg +0 -0
- package/dist/client/assets/index-BU9rnkF3.js +1 -0
- package/dist/client/assets/index-BpJWZkva.js +1 -0
- package/dist/client/assets/index-vRX-zAyq.js +1 -0
- package/dist/client/assets/login-DteE0ZGp.js +1 -0
- package/dist/client/assets/logo-pSNfLJQk.png +0 -0
- package/dist/client/assets/privacy-B_Pu7040.js +1 -0
- package/dist/client/assets/product-links-BkZ41Gv3.js +1 -0
- package/dist/client/assets/product._id-BVUysCW-.js +1 -0
- package/dist/client/assets/products.functions-cGzRziKO.js +1 -0
- package/dist/client/assets/profile-CveRcKq2.js +1 -0
- package/dist/client/assets/reset-password-ySEjItX_.js +1 -0
- package/dist/client/assets/saved-CHtdQDJF.js +1 -0
- package/dist/client/assets/search-CXWfET1y.js +1 -0
- package/dist/client/assets/signup-CEx90iuV.js +1 -0
- package/dist/client/assets/styles-DrNJG0BO.css +1 -0
- package/dist/client/assets/terms-VqJ9kX9b.js +1 -0
- package/dist/client/assets/update-password-C-d0ix5e.js +1 -0
- package/dist/client/assets/vendor-aria-hidden-DvXkyWUv.js +1 -0
- package/dist/client/assets/vendor-class-variance-authority-5VPnzWs2.js +1 -0
- package/dist/client/assets/vendor-clsx-B-dksMZM.js +1 -0
- package/dist/client/assets/vendor-cookie-es-CS0aJGDi.js +1 -0
- package/dist/client/assets/vendor-detect-node-es-l0sNRNKZ.js +1 -0
- package/dist/client/assets/vendor-floating-ui-core-BlUy28sp.js +1 -0
- package/dist/client/assets/vendor-floating-ui-dom-BxK0hn2R.js +1 -0
- package/dist/client/assets/vendor-floating-ui-react-dom-Bas3975S.js +1 -0
- package/dist/client/assets/vendor-floating-ui-utils-BfYUAVcw.js +1 -0
- package/dist/client/assets/vendor-framer-motion-BMdL-cuX.js +9 -0
- package/dist/client/assets/vendor-get-nonce-C-Z93AgS.js +1 -0
- package/dist/client/assets/vendor-iceberg-js-tWD4K6Lg.js +1 -0
- package/dist/client/assets/vendor-lovable.dev-cloud-auth-js-VuzqtJVg.js +1 -0
- package/dist/client/assets/vendor-lucide-react-b5K2fehp.js +1 -0
- package/dist/client/assets/vendor-motion-dom-BETJamZt.js +1 -0
- package/dist/client/assets/vendor-motion-utils-BuWewJbj.js +1 -0
- package/dist/client/assets/vendor-radix-ui-primitive-Dc_FVRD7.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-accordion-C22Rgxe9.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-arrow-DMHj2mKI.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-avatar-CVPBkFXg.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-collapsible-BvM-4sKX.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-collection-D9KtqmHm.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-compose-refs-Cvq0AS8Z.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-context-CAqqn5Nx.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-dialog-DZ01vOLq.js +5 -0
- package/dist/client/assets/vendor-radix-ui-react-direction-DxZwNuei.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-dismissable-layer-Dqgrs55Y.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-dropdown-menu-0uzvrqkn.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-focus-guards-DgWoZ-fP.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-focus-scope-BLIu5QaL.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-id-bpga_rLa.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-menu-D0qf2r6_.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-popper-BafIylxU.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-portal-BnAsfNCS.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-presence-C-f3UKQ2.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-primitive-zTHwXNoz.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-roving-focus-jyJB8K2E.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-slot-6LXHJrHl.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-callback-ref-E91aPc6s.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-controllable-state-Ca3eMtxa.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-effect-event-CPeX4A3c.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-escape-keydown-7n3YsXFo.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-is-hydrated-C1PY1qNv.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-layout-effect-B3AcGWPy.js +1 -0
- package/dist/client/assets/vendor-radix-ui-react-use-size-CXS04sct.js +1 -0
- package/dist/client/assets/vendor-react-dom-BnNs-kzm.js +9 -0
- package/dist/client/assets/vendor-react-gJPiVnX5.js +1 -0
- package/dist/client/assets/vendor-react-remove-scroll-DHKl-IMP.js +4 -0
- package/dist/client/assets/vendor-react-remove-scroll-bar-CSjdInc2.js +38 -0
- package/dist/client/assets/vendor-react-style-singleton-BqHpkgXn.js +1 -0
- package/dist/client/assets/vendor-scheduler-7OC5HNn7.js +1 -0
- package/dist/client/assets/vendor-seroval-B_Fur-nl.js +3 -0
- package/dist/client/assets/vendor-seroval-plugins-CBHnPkZJ.js +1 -0
- package/dist/client/assets/vendor-sonner-71-LdGG1.js +1 -0
- package/dist/client/assets/vendor-supabase-auth-js-DWrN-bIx.js +18 -0
- package/dist/client/assets/vendor-supabase-functions-js-uY_V-TxC.js +1 -0
- package/dist/client/assets/vendor-supabase-phoenix-BzEf37Ve.js +2 -0
- package/dist/client/assets/vendor-supabase-postgrest-js-C4rBWbCx.js +4 -0
- package/dist/client/assets/vendor-supabase-realtime-js-D6BlOYKE.js +23 -0
- package/dist/client/assets/vendor-supabase-storage-js-BG98L3Zz.js +1 -0
- package/dist/client/assets/vendor-supabase-supabase-js-DCCzdwBJ.js +1 -0
- package/dist/client/assets/vendor-tailwind-merge-Ct12j0u0.js +1 -0
- package/dist/client/assets/vendor-tanstack-history-C617CaxG.js +1 -0
- package/dist/client/assets/vendor-tanstack-query-core-7wuJJ5ZL.js +1 -0
- package/dist/client/assets/vendor-tanstack-react-query-HImzo8sX.js +1 -0
- package/dist/client/assets/vendor-tanstack-react-router-sIZLK-LU.js +1 -0
- package/dist/client/assets/vendor-tanstack-react-start-client-GiYCfWmf.js +1 -0
- package/dist/client/assets/vendor-tanstack-react-store-EvTi3ahh.js +1 -0
- package/dist/client/assets/vendor-tanstack-router-core-Cr7bYUZv.js +1 -0
- package/dist/client/assets/vendor-tanstack-start-client-core-C-00BBOu.js +2 -0
- package/dist/client/assets/vendor-tanstack-start-fn-stubs-l0sNRNKZ.js +1 -0
- package/dist/client/assets/vendor-tanstack-store-BC7mA7pq.js +1 -0
- package/dist/client/assets/vendor-tslib-Du-meQkk.js +1 -0
- package/dist/client/assets/vendor-use-callback-ref-C_fIAtot.js +1 -0
- package/dist/client/assets/vendor-use-sidecar-Bh0DDN6h.js +1 -0
- package/dist/client/assets/vendor-use-sync-external-store-ZvKHXaIn.js +1 -0
- package/dist/client/assets/vendor-vercel-analytics-DwPM5BWs.js +1 -0
- package/dist/client/assets/vendor-zod-By9teAtI.js +1 -0
- package/dist/client/robots.txt +2 -0
- package/dist/server/.dev.vars +5 -0
- package/dist/server/.vite/manifest.json +2528 -0
- package/dist/server/assets/ProductCard-CUPXy5Eo.js +149 -0
- package/dist/server/assets/_tanstack-start-manifest_v-do7vTWFD.js +4 -0
- package/dist/server/assets/about-TfKQw0Ga.js +28 -0
- package/dist/server/assets/admin-DspfJOJk.js +578 -0
- package/dist/server/assets/admin.functions-B78ppWLR.js +645 -0
- package/dist/server/assets/admin.functions-BWlKBoTL.js +93 -0
- package/dist/server/assets/admin.login-CV7QfeA6.js +139 -0
- package/dist/server/assets/affiliate-disclosure-B1wI1cDb.js +86 -0
- package/dist/server/assets/auth-middleware-Cn49MidW.js +62 -0
- package/dist/server/assets/categories-Z7jnAYZP.js +108 -0
- package/dist/server/assets/category._slug-D0XY3FGK.js +112 -0
- package/dist/server/assets/contact-IzyONsXs.js +104 -0
- package/dist/server/assets/faq-aRhB_CR3.js +133 -0
- package/dist/server/assets/hero-bg-BP2eVUIX.jpg +0 -0
- package/dist/server/assets/index-BTPHbXw9.js +221 -0
- package/dist/server/assets/index-ByJkHkrU.js +30 -0
- package/dist/server/assets/login-Dvy5Dm0f.js +175 -0
- package/dist/server/assets/logo-pSNfLJQk.png +0 -0
- package/dist/server/assets/privacy-B6Wiez1P.js +93 -0
- package/dist/server/assets/product-links-CGYEPP56.js +16 -0
- package/dist/server/assets/product._id-BpRa-1z0.js +231 -0
- package/dist/server/assets/products.functions-DSlmibYN.js +209 -0
- package/dist/server/assets/products.functions-DlHkRiqi.js +24 -0
- package/dist/server/assets/profile-B0NWzVAZ.js +314 -0
- package/dist/server/assets/reset-password-CY-rmqMr.js +115 -0
- package/dist/server/assets/saved-7FA6Dbom.js +126 -0
- package/dist/server/assets/search-Yw5c_fZa.js +329 -0
- package/dist/server/assets/signup-UPzgZo4i.js +143 -0
- package/dist/server/assets/styles-DrNJG0BO.css +1 -0
- package/dist/server/assets/terms-CMnX95bP.js +89 -0
- package/dist/server/assets/update-password-Cr94ea8n.js +131 -0
- package/dist/server/assets/vendor-aria-hidden-DPa16MWu.js +122 -0
- package/dist/server/assets/vendor-class-variance-authority-0YxJPB9Y.js +44 -0
- package/dist/server/assets/vendor-cloudflare-unenv-preset-ya0VEFBz.js +250 -0
- package/dist/server/assets/vendor-clsx-DgYk2OaC.js +16 -0
- package/dist/server/assets/vendor-cookie-es-DAoofYiI.js +44 -0
- package/dist/server/assets/vendor-detect-node-es-l0sNRNKZ.js +1 -0
- package/dist/server/assets/vendor-floating-ui-core-3tkK0THV.js +726 -0
- package/dist/server/assets/vendor-floating-ui-dom-C-cPtgJv.js +626 -0
- package/dist/server/assets/vendor-floating-ui-react-dom-CRG6gBpH.js +319 -0
- package/dist/server/assets/vendor-floating-ui-utils-DmXANH-E.js +320 -0
- package/dist/server/assets/vendor-framer-motion-X4zAkX3J.js +1979 -0
- package/dist/server/assets/vendor-get-nonce-DiSj3EHl.js +9 -0
- package/dist/server/assets/vendor-h3-v2-CCobnLY5.js +287 -0
- package/dist/server/assets/vendor-iceberg-js-bHCkXyJn.js +534 -0
- package/dist/server/assets/vendor-isbot-CZ7WjwVs.js +21 -0
- package/dist/server/assets/vendor-lovable.dev-cloud-auth-js-BE03njZw.js +180 -0
- package/dist/server/assets/vendor-lucide-react-Ddew6HYb.js +458 -0
- package/dist/server/assets/vendor-motion-dom-D2MTwGIG.js +5983 -0
- package/dist/server/assets/vendor-motion-utils-LJlIFN6m.js +161 -0
- package/dist/server/assets/vendor-radix-ui-primitive-B-mNdDrH.js +11 -0
- package/dist/server/assets/vendor-radix-ui-react-accordion-1Izf6x00.js +308 -0
- package/dist/server/assets/vendor-radix-ui-react-arrow-B882lnFK.js +23 -0
- package/dist/server/assets/vendor-radix-ui-react-avatar-BVgZt2Ab.js +209 -0
- package/dist/server/assets/vendor-radix-ui-react-collapsible-DCBbMZiS.js +147 -0
- package/dist/server/assets/vendor-radix-ui-react-collection-BZ2srfgU.js +150 -0
- package/dist/server/assets/vendor-radix-ui-react-compose-refs-D3qsKVk1.js +39 -0
- package/dist/server/assets/vendor-radix-ui-react-context-BVoNDLue.js +78 -0
- package/dist/server/assets/vendor-radix-ui-react-dialog-DlxMaNYK.js +406 -0
- package/dist/server/assets/vendor-radix-ui-react-direction-Dt_WDL1t.js +9 -0
- package/dist/server/assets/vendor-radix-ui-react-dismissable-layer-CjsuPohV.js +210 -0
- package/dist/server/assets/vendor-radix-ui-react-dropdown-menu-DVxKumY8.js +263 -0
- package/dist/server/assets/vendor-radix-ui-react-focus-guards-D_6NoePE.js +29 -0
- package/dist/server/assets/vendor-radix-ui-react-focus-scope-DEIhTJJH.js +206 -0
- package/dist/server/assets/vendor-radix-ui-react-id-DFFpgh6m.js +14 -0
- package/dist/server/assets/vendor-radix-ui-react-menu-CiTMLwjT.js +893 -0
- package/dist/server/assets/vendor-radix-ui-react-popper-23Ye2Vyc.js +286 -0
- package/dist/server/assets/vendor-radix-ui-react-portal-CZCH5uPk.js +16 -0
- package/dist/server/assets/vendor-radix-ui-react-presence-CaAULlDU.js +128 -0
- package/dist/server/assets/vendor-radix-ui-react-primitive-BeOk3UYa.js +124 -0
- package/dist/server/assets/vendor-radix-ui-react-roving-focus-DES9GR8l.js +224 -0
- package/dist/server/assets/vendor-radix-ui-react-slot-DUhZbzoH.js +103 -0
- package/dist/server/assets/vendor-radix-ui-react-use-callback-ref-BynBgohw.js +11 -0
- package/dist/server/assets/vendor-radix-ui-react-use-controllable-state-C9KpT6DG.js +69 -0
- package/dist/server/assets/vendor-radix-ui-react-use-effect-event-gpNY2xjS.js +1 -0
- package/dist/server/assets/vendor-radix-ui-react-use-escape-keydown-CcYRQ2pp.js +17 -0
- package/dist/server/assets/vendor-radix-ui-react-use-is-hydrated-D_LcBPXY.js +15 -0
- package/dist/server/assets/vendor-radix-ui-react-use-layout-effect-1LNLXAjr.js +6 -0
- package/dist/server/assets/vendor-radix-ui-react-use-size-D6fiKJQo.js +39 -0
- package/dist/server/assets/vendor-react-DvBrY0qp.js +511 -0
- package/dist/server/assets/vendor-react-dom-yvMLPM0j.js +10484 -0
- package/dist/server/assets/vendor-react-remove-scroll-BNtiEvVN.js +328 -0
- package/dist/server/assets/vendor-react-remove-scroll-bar-hLqRASRk.js +82 -0
- package/dist/server/assets/vendor-react-style-singleton-BXjcXskB.js +69 -0
- package/dist/server/assets/vendor-rou3-3NaGPdI8.js +8 -0
- package/dist/server/assets/vendor-seroval-dJyC-Zhz.js +1775 -0
- package/dist/server/assets/vendor-seroval-plugins-Pq_U2meB.js +58 -0
- package/dist/server/assets/vendor-sonner-CqbjhsRh.js +1086 -0
- package/dist/server/assets/vendor-srvx-BA-baEX9.js +6 -0
- package/dist/server/assets/vendor-supabase-auth-js-D4xjVprw.js +7602 -0
- package/dist/server/assets/vendor-supabase-functions-js-sWy4UYn1.js +322 -0
- package/dist/server/assets/vendor-supabase-phoenix-Bw3Uh2Nn.js +1777 -0
- package/dist/server/assets/vendor-supabase-postgrest-js-AO-BXa7I.js +4938 -0
- package/dist/server/assets/vendor-supabase-realtime-js-BtdNgJbm.js +2111 -0
- package/dist/server/assets/vendor-supabase-storage-js-Dk_MrPYO.js +2679 -0
- package/dist/server/assets/vendor-supabase-supabase-js-D1EEtG3j.js +697 -0
- package/dist/server/assets/vendor-tailwind-merge-BHb_obmC.js +3255 -0
- package/dist/server/assets/vendor-tanstack-history-C4pKJmkt.js +204 -0
- package/dist/server/assets/vendor-tanstack-query-core-PwwTR5ld.js +2552 -0
- package/dist/server/assets/vendor-tanstack-react-query-hhHzXAK1.js +190 -0
- package/dist/server/assets/vendor-tanstack-react-router-XzqpA65A.js +1120 -0
- package/dist/server/assets/vendor-tanstack-react-start-RvWUpvat.js +37 -0
- package/dist/server/assets/vendor-tanstack-react-start-client-gpNY2xjS.js +1 -0
- package/dist/server/assets/vendor-tanstack-react-start-server-uj_Y9pEN.js +15 -0
- package/dist/server/assets/vendor-tanstack-react-store-gpNY2xjS.js +1 -0
- package/dist/server/assets/vendor-tanstack-router-core-6wywV3KN.js +4252 -0
- package/dist/server/assets/vendor-tanstack-start-client-core-DoOKV2pA.js +1741 -0
- package/dist/server/assets/vendor-tanstack-start-fn-stubs-l0sNRNKZ.js +1 -0
- package/dist/server/assets/vendor-tanstack-start-server-core-CsAstXv7.js +1421 -0
- package/dist/server/assets/vendor-tanstack-start-storage-context-DgH9hIJT.js +17 -0
- package/dist/server/assets/vendor-tanstack-store-l0sNRNKZ.js +1 -0
- package/dist/server/assets/vendor-tslib-_8ICaZ64.js +67 -0
- package/dist/server/assets/vendor-unenv-DUvF4YIF.js +544 -0
- package/dist/server/assets/vendor-use-callback-ref-DMFDRvmi.js +66 -0
- package/dist/server/assets/vendor-use-sidecar-DG1tHua4.js +106 -0
- package/dist/server/assets/vendor-use-sync-external-store-rZ8vi0It.js +64 -0
- package/dist/server/assets/vendor-vercel-analytics-oP8BDp0L.js +168 -0
- package/dist/server/assets/vendor-zod-BRyQdbC-.js +3580 -0
- package/dist/server/index.js +158 -0
- package/dist/server/wrangler.json +1 -0
- package/enable-powershell.ps1 +7 -0
- package/eslint.config.js +41 -0
- package/lint.bat +4 -0
- package/package.json +95 -0
- package/public/robots.txt +2 -0
- package/run-npm-build.cjs +20 -0
- package/run-npm-build.js +20 -0
- package/src/assets/hero-bg.jpg +0 -0
- package/src/assets/logo.png +0 -0
- package/src/components/scrollsy/Footer.tsx +68 -0
- package/src/components/scrollsy/LiveTicker.tsx +31 -0
- package/src/components/scrollsy/Logo.tsx +28 -0
- package/src/components/scrollsy/Nav.tsx +255 -0
- package/src/components/scrollsy/ProductCard.tsx +190 -0
- package/src/components/scrollsy/ProductFilters.tsx +226 -0
- package/src/components/scrollsy/SupportWidget.tsx +197 -0
- package/src/components/ui/accordion.tsx +51 -0
- package/src/components/ui/alert-dialog.tsx +115 -0
- package/src/components/ui/alert.tsx +49 -0
- package/src/components/ui/aspect-ratio.tsx +5 -0
- package/src/components/ui/avatar.tsx +47 -0
- package/src/components/ui/badge.tsx +32 -0
- package/src/components/ui/breadcrumb.tsx +101 -0
- package/src/components/ui/button.tsx +49 -0
- package/src/components/ui/calendar.tsx +177 -0
- package/src/components/ui/card.tsx +55 -0
- package/src/components/ui/carousel.tsx +240 -0
- package/src/components/ui/chart.tsx +331 -0
- package/src/components/ui/checkbox.tsx +26 -0
- package/src/components/ui/collapsible.tsx +11 -0
- package/src/components/ui/command.tsx +143 -0
- package/src/components/ui/context-menu.tsx +187 -0
- package/src/components/ui/dialog.tsx +104 -0
- package/src/components/ui/drawer.tsx +98 -0
- package/src/components/ui/dropdown-menu.tsx +188 -0
- package/src/components/ui/form.tsx +171 -0
- package/src/components/ui/hover-card.tsx +27 -0
- package/src/components/ui/input-otp.tsx +69 -0
- package/src/components/ui/input.tsx +22 -0
- package/src/components/ui/label.tsx +21 -0
- package/src/components/ui/menubar.tsx +229 -0
- package/src/components/ui/navigation-menu.tsx +120 -0
- package/src/components/ui/pagination.tsx +98 -0
- package/src/components/ui/popover.tsx +31 -0
- package/src/components/ui/progress.tsx +25 -0
- package/src/components/ui/radio-group.tsx +36 -0
- package/src/components/ui/resizable.tsx +37 -0
- package/src/components/ui/scroll-area.tsx +44 -0
- package/src/components/ui/select.tsx +152 -0
- package/src/components/ui/separator.tsx +24 -0
- package/src/components/ui/sheet.tsx +122 -0
- package/src/components/ui/sidebar.tsx +744 -0
- package/src/components/ui/skeleton.tsx +7 -0
- package/src/components/ui/slider.tsx +23 -0
- package/src/components/ui/sonner.tsx +23 -0
- package/src/components/ui/switch.tsx +27 -0
- package/src/components/ui/table.tsx +94 -0
- package/src/components/ui/tabs.tsx +53 -0
- package/src/components/ui/textarea.tsx +21 -0
- package/src/components/ui/toggle-group.tsx +57 -0
- package/src/components/ui/toggle.tsx +42 -0
- package/src/components/ui/tooltip.tsx +32 -0
- package/src/hooks/use-auth.ts +26 -0
- package/src/hooks/use-mobile.tsx +19 -0
- package/src/integrations/lovable/index.ts +41 -0
- package/src/lib/admin.functions.ts +564 -0
- package/src/lib/error-capture.ts +27 -0
- package/src/lib/error-page.ts +30 -0
- package/src/lib/product-links.ts +39 -0
- package/src/lib/products.functions.ts +101 -0
- package/src/lib/utils.ts +6 -0
- package/src/routeTree.gen.ts +480 -0
- package/src/router.tsx +16 -0
- package/src/routes/__root.tsx +177 -0
- package/src/routes/about.tsx +66 -0
- package/src/routes/admin.login.tsx +95 -0
- package/src/routes/admin.tsx +811 -0
- package/src/routes/affiliate-disclosure.tsx +35 -0
- package/src/routes/categories.tsx +57 -0
- package/src/routes/category.$slug.tsx +51 -0
- package/src/routes/contact.tsx +69 -0
- package/src/routes/faq.tsx +63 -0
- package/src/routes/index.tsx +269 -0
- package/src/routes/login.tsx +160 -0
- package/src/routes/privacy.tsx +39 -0
- package/src/routes/product.$id.tsx +212 -0
- package/src/routes/profile.tsx +393 -0
- package/src/routes/reset-password.tsx +71 -0
- package/src/routes/saved.tsx +83 -0
- package/src/routes/search.tsx +136 -0
- package/src/routes/signup.tsx +108 -0
- package/src/routes/sitemap[.]xml.ts +34 -0
- package/src/routes/terms.tsx +40 -0
- package/src/routes/update-password.tsx +91 -0
- package/src/server.ts +80 -0
- package/src/start.ts +24 -0
- package/src/styles.css +333 -0
- package/terminal-test-output.txt +1 -0
- package/tsconfig.json +27 -0
- package/vercel.json +26 -0
- package/vite.config.ts +38 -0
- package/wrangler.jsonc +7 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { supabase } from "@/integrations/supabase/client";
|
|
4
|
+
import { lovable } from "@/integrations/lovable";
|
|
5
|
+
import { Logo } from "@/components/scrollsy/Logo";
|
|
6
|
+
import { Field } from "./login";
|
|
7
|
+
import { toast } from "sonner";
|
|
8
|
+
import { Mail, Lock, User as UserIcon, Sparkles } from "lucide-react";
|
|
9
|
+
|
|
10
|
+
export const Route = createFileRoute("/signup")({
|
|
11
|
+
head: () => ({ meta: [{ title: "Join Scrollsy — Sign up free" }] }),
|
|
12
|
+
component: Signup,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
function Signup() {
|
|
16
|
+
const nav = useNavigate();
|
|
17
|
+
const [name, setName] = useState("");
|
|
18
|
+
const [email, setEmail] = useState("");
|
|
19
|
+
const [password, setPassword] = useState("");
|
|
20
|
+
const [loading, setLoading] = useState(false);
|
|
21
|
+
|
|
22
|
+
const onSubmit = async (e: React.FormEvent) => {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
setLoading(true);
|
|
25
|
+
const { error } = await supabase.auth.signUp({
|
|
26
|
+
email,
|
|
27
|
+
password,
|
|
28
|
+
options: {
|
|
29
|
+
data: { display_name: name },
|
|
30
|
+
emailRedirectTo: typeof window !== "undefined" ? window.location.origin : undefined,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
setLoading(false);
|
|
34
|
+
if (error) return toast.error(error.message);
|
|
35
|
+
toast.success("Account created — check your email to confirm.");
|
|
36
|
+
nav({ to: "/" });
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const onGoogle = async () => {
|
|
40
|
+
const r = await lovable.auth.signInWithOAuth("google", {
|
|
41
|
+
redirect_uri: window.location.origin,
|
|
42
|
+
});
|
|
43
|
+
if (r.error) toast.error("Sign-up failed");
|
|
44
|
+
if (r.redirected) return;
|
|
45
|
+
nav({ to: "/" });
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div className="min-h-[80vh] flex items-center justify-center px-4 py-16">
|
|
50
|
+
<div className="w-full max-w-md glass-strong rounded-3xl p-8 shadow-elevated animate-scale-in">
|
|
51
|
+
<div className="flex justify-center">
|
|
52
|
+
<Logo size={40} />
|
|
53
|
+
</div>
|
|
54
|
+
<h1 className="font-display text-3xl font-bold text-center mt-4">Join Scrollsy</h1>
|
|
55
|
+
<p className="text-center text-sm text-muted-foreground mt-1">
|
|
56
|
+
Save finds, follow trends, never miss a drop.
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<button
|
|
60
|
+
onClick={onGoogle}
|
|
61
|
+
className="mt-6 w-full glass rounded-full py-3 font-medium text-sm hover:bg-white/10 transition"
|
|
62
|
+
>
|
|
63
|
+
Continue with Google
|
|
64
|
+
</button>
|
|
65
|
+
|
|
66
|
+
<div className="my-5 flex items-center gap-3 text-xs text-muted-foreground">
|
|
67
|
+
<div className="flex-1 h-px bg-white/10" /> or <div className="flex-1 h-px bg-white/10" />
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<form onSubmit={onSubmit} className="space-y-3">
|
|
71
|
+
<Field
|
|
72
|
+
icon={<UserIcon className="w-4 h-4" />}
|
|
73
|
+
value={name}
|
|
74
|
+
onChange={setName}
|
|
75
|
+
placeholder="Display name"
|
|
76
|
+
/>
|
|
77
|
+
<Field
|
|
78
|
+
icon={<Mail className="w-4 h-4" />}
|
|
79
|
+
type="email"
|
|
80
|
+
value={email}
|
|
81
|
+
onChange={setEmail}
|
|
82
|
+
placeholder="Email"
|
|
83
|
+
/>
|
|
84
|
+
<Field
|
|
85
|
+
icon={<Lock className="w-4 h-4" />}
|
|
86
|
+
type="password"
|
|
87
|
+
value={password}
|
|
88
|
+
onChange={setPassword}
|
|
89
|
+
placeholder="Password (min 6 chars)"
|
|
90
|
+
/>
|
|
91
|
+
<button
|
|
92
|
+
disabled={loading}
|
|
93
|
+
className="btn-glow w-full rounded-full py-3 font-semibold text-sm inline-flex items-center justify-center gap-2 disabled:opacity-60"
|
|
94
|
+
>
|
|
95
|
+
<Sparkles className="w-4 h-4" /> {loading ? "Creating…" : "Create account"}
|
|
96
|
+
</button>
|
|
97
|
+
</form>
|
|
98
|
+
|
|
99
|
+
<p className="mt-6 text-sm text-center text-muted-foreground">
|
|
100
|
+
Already a Scrollster?{" "}
|
|
101
|
+
<Link to="/login" className="text-foreground font-semibold">
|
|
102
|
+
Sign in
|
|
103
|
+
</Link>
|
|
104
|
+
</p>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
2
|
+
import type {} from "@tanstack/react-start";
|
|
3
|
+
|
|
4
|
+
const BASE_URL = "";
|
|
5
|
+
|
|
6
|
+
export const Route = createFileRoute("/sitemap.xml")({
|
|
7
|
+
server: {
|
|
8
|
+
handlers: {
|
|
9
|
+
GET: async () => {
|
|
10
|
+
const paths = [
|
|
11
|
+
{ path: "/", priority: "1.0", changefreq: "daily" as const },
|
|
12
|
+
{ path: "/categories", priority: "0.9", changefreq: "weekly" as const },
|
|
13
|
+
{ path: "/search", priority: "0.6", changefreq: "weekly" as const },
|
|
14
|
+
{ path: "/about", priority: "0.5", changefreq: "monthly" as const },
|
|
15
|
+
{ path: "/contact", priority: "0.5", changefreq: "monthly" as const },
|
|
16
|
+
{ path: "/faq", priority: "0.5", changefreq: "monthly" as const },
|
|
17
|
+
{ path: "/privacy", priority: "0.3", changefreq: "yearly" as const },
|
|
18
|
+
{ path: "/terms", priority: "0.3", changefreq: "yearly" as const },
|
|
19
|
+
{ path: "/affiliate-disclosure", priority: "0.3", changefreq: "yearly" as const },
|
|
20
|
+
{ path: "/login", priority: "0.3", changefreq: "yearly" as const },
|
|
21
|
+
{ path: "/signup", priority: "0.4", changefreq: "yearly" as const },
|
|
22
|
+
];
|
|
23
|
+
const urls = paths.map(
|
|
24
|
+
(e) =>
|
|
25
|
+
` <url>\n <loc>${BASE_URL}${e.path}</loc>\n <changefreq>${e.changefreq}</changefreq>\n <priority>${e.priority}</priority>\n </url>`,
|
|
26
|
+
);
|
|
27
|
+
const xml = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls.join("\n")}\n</urlset>`;
|
|
28
|
+
return new Response(xml, {
|
|
29
|
+
headers: { "Content-Type": "application/xml", "Cache-Control": "public, max-age=3600" },
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
2
|
+
import { Prose } from "./about";
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute("/terms")({
|
|
5
|
+
head: () => ({
|
|
6
|
+
meta: [
|
|
7
|
+
{ title: "Terms of Service · Scrollsy" },
|
|
8
|
+
{ name: "description", content: "Scrollsy terms of service." },
|
|
9
|
+
],
|
|
10
|
+
}),
|
|
11
|
+
component: () => (
|
|
12
|
+
<Prose title="Terms of Service" subtitle="Last updated May 2026">
|
|
13
|
+
<p>By using Scrollsy, you agree to these terms.</p>
|
|
14
|
+
<h2>Use of the platform</h2>
|
|
15
|
+
<p>
|
|
16
|
+
Scrollsy is provided as-is for product discovery. You may not scrape, abuse, or misuse the
|
|
17
|
+
service.
|
|
18
|
+
</p>
|
|
19
|
+
<h2>Third-party retailers</h2>
|
|
20
|
+
<p>
|
|
21
|
+
All purchases happen on third-party sites. Scrollsy is not responsible for product quality,
|
|
22
|
+
shipping, returns or any aspect of the transaction with the retailer.
|
|
23
|
+
</p>
|
|
24
|
+
<h2>User content</h2>
|
|
25
|
+
<p>
|
|
26
|
+
You retain ownership of any content you submit (e.g. profile name). You grant Scrollsy a
|
|
27
|
+
license to display it as needed to operate the platform.
|
|
28
|
+
</p>
|
|
29
|
+
<h2>Termination</h2>
|
|
30
|
+
<p>
|
|
31
|
+
We may suspend accounts that violate these terms. You may delete your account at any time.
|
|
32
|
+
</p>
|
|
33
|
+
<h2>Liability</h2>
|
|
34
|
+
<p>
|
|
35
|
+
Scrollsy is provided without warranties. To the extent permitted by law, our liability is
|
|
36
|
+
limited.
|
|
37
|
+
</p>
|
|
38
|
+
</Prose>
|
|
39
|
+
),
|
|
40
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { supabase } from "@/integrations/supabase/client";
|
|
4
|
+
import { Logo } from "@/components/scrollsy/Logo";
|
|
5
|
+
import { Field } from "./login";
|
|
6
|
+
import { toast } from "sonner";
|
|
7
|
+
import { Lock, Check } from "lucide-react";
|
|
8
|
+
|
|
9
|
+
export const Route = createFileRoute("/update-password")({
|
|
10
|
+
head: () => ({ meta: [{ title: "Set a new password · Scrollsy" }] }),
|
|
11
|
+
component: UpdatePassword,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
function UpdatePassword() {
|
|
15
|
+
const nav = useNavigate();
|
|
16
|
+
const [password, setPassword] = useState("");
|
|
17
|
+
const [confirmPassword, setConfirmPassword] = useState("");
|
|
18
|
+
const [loading, setLoading] = useState(false);
|
|
19
|
+
const [isRecoveryReady, setIsRecoveryReady] = useState(false);
|
|
20
|
+
const [status, setStatus] = useState("Checking recovery session...");
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
supabase.auth.getSession().then(({ data }) => {
|
|
24
|
+
if (data.session) {
|
|
25
|
+
setIsRecoveryReady(true);
|
|
26
|
+
setStatus("");
|
|
27
|
+
} else {
|
|
28
|
+
setStatus("No active recovery session found. Request a reset email first.");
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
const onSubmit = async (e: React.FormEvent) => {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
if (!password) return toast.error("Enter a new password.");
|
|
36
|
+
if (password.length < 6) return toast.error("Password must be at least 6 characters.");
|
|
37
|
+
if (password !== confirmPassword) return toast.error("Passwords do not match.");
|
|
38
|
+
setLoading(true);
|
|
39
|
+
const { error } = await supabase.auth.updateUser({ password });
|
|
40
|
+
setLoading(false);
|
|
41
|
+
if (error) {
|
|
42
|
+
return toast.error(error.message || "Unable to reset password.");
|
|
43
|
+
}
|
|
44
|
+
toast.success("Your password has been updated.");
|
|
45
|
+
nav({ to: "/login" });
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div className="min-h-[80vh] flex items-center justify-center px-4 py-16">
|
|
50
|
+
<div className="w-full max-w-md glass-strong rounded-3xl p-8 shadow-elevated animate-scale-in">
|
|
51
|
+
<div className="flex justify-center mb-2">
|
|
52
|
+
<Logo size={40} />
|
|
53
|
+
</div>
|
|
54
|
+
<h1 className="font-display text-3xl font-bold text-center mt-4">Set a new password</h1>
|
|
55
|
+
<p className="text-center text-sm text-muted-foreground mt-1">
|
|
56
|
+
{status || "Create a new password for your account."}
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<form onSubmit={onSubmit} className="space-y-3 mt-6">
|
|
60
|
+
<Field
|
|
61
|
+
icon={<Lock className="w-4 h-4" />}
|
|
62
|
+
type="password"
|
|
63
|
+
value={password}
|
|
64
|
+
onChange={setPassword}
|
|
65
|
+
placeholder="New password"
|
|
66
|
+
/>
|
|
67
|
+
<Field
|
|
68
|
+
icon={<Check className="w-4 h-4" />}
|
|
69
|
+
type="password"
|
|
70
|
+
value={confirmPassword}
|
|
71
|
+
onChange={setConfirmPassword}
|
|
72
|
+
placeholder="Confirm password"
|
|
73
|
+
/>
|
|
74
|
+
<button
|
|
75
|
+
disabled={loading || !isRecoveryReady}
|
|
76
|
+
className="btn-glow w-full rounded-full py-3 font-semibold text-sm inline-flex items-center justify-center gap-2 disabled:opacity-60"
|
|
77
|
+
>
|
|
78
|
+
{loading ? "Updating…" : "Save new password"}
|
|
79
|
+
</button>
|
|
80
|
+
</form>
|
|
81
|
+
|
|
82
|
+
<p className="mt-6 text-sm text-center text-muted-foreground">
|
|
83
|
+
Need another link?{" "}
|
|
84
|
+
<Link to="/reset-password" className="text-foreground font-semibold hover:text-gradient">
|
|
85
|
+
Send reset email again
|
|
86
|
+
</Link>
|
|
87
|
+
</p>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
}
|
package/src/server.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import "./lib/error-capture";
|
|
2
|
+
|
|
3
|
+
import { consumeLastCapturedError } from "./lib/error-capture";
|
|
4
|
+
import { renderErrorPage } from "./lib/error-page";
|
|
5
|
+
|
|
6
|
+
type ServerEntry = {
|
|
7
|
+
fetch: (request: Request, env: unknown, ctx: unknown) => Promise<Response> | Response;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
let serverEntryPromise: Promise<ServerEntry> | undefined;
|
|
11
|
+
|
|
12
|
+
async function getServerEntry(): Promise<ServerEntry> {
|
|
13
|
+
if (!serverEntryPromise) {
|
|
14
|
+
serverEntryPromise = import("@tanstack/react-start/server-entry").then(
|
|
15
|
+
(m) => (m as { default?: ServerEntry }).default ?? (m as unknown as ServerEntry),
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return serverEntryPromise;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function brandedErrorResponse(): Response {
|
|
22
|
+
return new Response(renderErrorPage(), {
|
|
23
|
+
status: 500,
|
|
24
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isCatastrophicSsrErrorBody(body: string, responseStatus: number): boolean {
|
|
29
|
+
let payload: unknown;
|
|
30
|
+
try {
|
|
31
|
+
payload = JSON.parse(body);
|
|
32
|
+
} catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!payload || Array.isArray(payload) || typeof payload !== "object") {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const fields = payload as Record<string, unknown>;
|
|
41
|
+
const expectedKeys = new Set(["message", "status", "unhandled"]);
|
|
42
|
+
if (!Object.keys(fields).every((key) => expectedKeys.has(key))) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
fields.unhandled === true &&
|
|
48
|
+
fields.message === "HTTPError" &&
|
|
49
|
+
(fields.status === undefined || fields.status === responseStatus)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// h3 swallows in-handler throws into a normal 500 Response with body
|
|
54
|
+
// {"unhandled":true,"message":"HTTPError"} — try/catch alone never fires for those.
|
|
55
|
+
async function normalizeCatastrophicSsrResponse(response: Response): Promise<Response> {
|
|
56
|
+
if (response.status < 500) return response;
|
|
57
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
58
|
+
if (!contentType.includes("application/json")) return response;
|
|
59
|
+
|
|
60
|
+
const body = await response.clone().text();
|
|
61
|
+
if (!isCatastrophicSsrErrorBody(body, response.status)) {
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
console.error(consumeLastCapturedError() ?? new Error(`h3 swallowed SSR error: ${body}`));
|
|
66
|
+
return brandedErrorResponse();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default {
|
|
70
|
+
async fetch(request: Request, env: unknown, ctx: unknown) {
|
|
71
|
+
try {
|
|
72
|
+
const handler = await getServerEntry();
|
|
73
|
+
const response = await handler.fetch(request, env, ctx);
|
|
74
|
+
return await normalizeCatastrophicSsrResponse(response);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error(error);
|
|
77
|
+
return brandedErrorResponse();
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
};
|
package/src/start.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createStart, createMiddleware } from "@tanstack/react-start";
|
|
2
|
+
|
|
3
|
+
import { renderErrorPage } from "./lib/error-page";
|
|
4
|
+
import { attachSupabaseAuth } from "@/integrations/supabase/auth-attacher";
|
|
5
|
+
|
|
6
|
+
const errorMiddleware = createMiddleware().server(async ({ next }) => {
|
|
7
|
+
try {
|
|
8
|
+
return await next();
|
|
9
|
+
} catch (error) {
|
|
10
|
+
if (error != null && typeof error === "object" && "statusCode" in error) {
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
console.error(error);
|
|
14
|
+
return new Response(renderErrorPage(), {
|
|
15
|
+
status: 500,
|
|
16
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const startInstance = createStart(() => ({
|
|
22
|
+
requestMiddleware: [errorMiddleware],
|
|
23
|
+
functionMiddleware: [attachSupabaseAuth],
|
|
24
|
+
}));
|