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,893 @@
1
+ import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-DvBrY0qp.js";
2
+ import { c as composeEventHandlers } from "./vendor-radix-ui-primitive-B-mNdDrH.js";
3
+ import { c as createCollection } from "./vendor-radix-ui-react-collection-BZ2srfgU.js";
4
+ import { c as composeRefs, u as useComposedRefs } from "./vendor-radix-ui-react-compose-refs-D3qsKVk1.js";
5
+ import { a as createContextScope } from "./vendor-radix-ui-react-context-BVoNDLue.js";
6
+ import { u as useDirection } from "./vendor-radix-ui-react-direction-Dt_WDL1t.js";
7
+ import { D as DismissableLayer } from "./vendor-radix-ui-react-dismissable-layer-CjsuPohV.js";
8
+ import { u as useFocusGuards } from "./vendor-radix-ui-react-focus-guards-D_6NoePE.js";
9
+ import { F as FocusScope } from "./vendor-radix-ui-react-focus-scope-DEIhTJJH.js";
10
+ import { R as Root2, A as Anchor, c as createPopperScope, C as Content, a as Arrow } from "./vendor-radix-ui-react-popper-23Ye2Vyc.js";
11
+ import { P as Portal$1 } from "./vendor-radix-ui-react-portal-CZCH5uPk.js";
12
+ import { P as Presence } from "./vendor-radix-ui-react-presence-CaAULlDU.js";
13
+ import { P as Primitive, d as dispatchDiscreteCustomEvent } from "./vendor-radix-ui-react-primitive-BeOk3UYa.js";
14
+ import { c as createRovingFocusGroupScope, I as Item, R as Root } from "./vendor-radix-ui-react-roving-focus-DES9GR8l.js";
15
+ import { u as useCallbackRef } from "./vendor-radix-ui-react-use-callback-ref-BynBgohw.js";
16
+ import { h as hideOthers } from "./vendor-aria-hidden-DPa16MWu.js";
17
+ import { R as ReactRemoveScroll } from "./vendor-react-remove-scroll-BNtiEvVN.js";
18
+ // @__NO_SIDE_EFFECTS__
19
+ function createSlot(ownerName) {
20
+ const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);
21
+ const Slot2 = reactExports.forwardRef((props, forwardedRef) => {
22
+ const { children, ...slotProps } = props;
23
+ const childrenArray = reactExports.Children.toArray(children);
24
+ const slottable = childrenArray.find(isSlottable);
25
+ if (slottable) {
26
+ const newElement = slottable.props.children;
27
+ const newChildren = childrenArray.map((child) => {
28
+ if (child === slottable) {
29
+ if (reactExports.Children.count(newElement) > 1) return reactExports.Children.only(null);
30
+ return reactExports.isValidElement(newElement) ? newElement.props.children : null;
31
+ } else {
32
+ return child;
33
+ }
34
+ });
35
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: reactExports.isValidElement(newElement) ? reactExports.cloneElement(newElement, void 0, newChildren) : null });
36
+ }
37
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });
38
+ });
39
+ Slot2.displayName = `${ownerName}.Slot`;
40
+ return Slot2;
41
+ }
42
+ // @__NO_SIDE_EFFECTS__
43
+ function createSlotClone(ownerName) {
44
+ const SlotClone = reactExports.forwardRef((props, forwardedRef) => {
45
+ const { children, ...slotProps } = props;
46
+ if (reactExports.isValidElement(children)) {
47
+ const childrenRef = getElementRef(children);
48
+ const props2 = mergeProps(slotProps, children.props);
49
+ if (children.type !== reactExports.Fragment) {
50
+ props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
51
+ }
52
+ return reactExports.cloneElement(children, props2);
53
+ }
54
+ return reactExports.Children.count(children) > 1 ? reactExports.Children.only(null) : null;
55
+ });
56
+ SlotClone.displayName = `${ownerName}.SlotClone`;
57
+ return SlotClone;
58
+ }
59
+ var SLOTTABLE_IDENTIFIER = /* @__PURE__ */ Symbol("radix.slottable");
60
+ function isSlottable(child) {
61
+ return reactExports.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
62
+ }
63
+ function mergeProps(slotProps, childProps) {
64
+ const overrideProps = { ...childProps };
65
+ for (const propName in childProps) {
66
+ const slotPropValue = slotProps[propName];
67
+ const childPropValue = childProps[propName];
68
+ const isHandler = /^on[A-Z]/.test(propName);
69
+ if (isHandler) {
70
+ if (slotPropValue && childPropValue) {
71
+ overrideProps[propName] = (...args) => {
72
+ const result = childPropValue(...args);
73
+ slotPropValue(...args);
74
+ return result;
75
+ };
76
+ } else if (slotPropValue) {
77
+ overrideProps[propName] = slotPropValue;
78
+ }
79
+ } else if (propName === "style") {
80
+ overrideProps[propName] = { ...slotPropValue, ...childPropValue };
81
+ } else if (propName === "className") {
82
+ overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
83
+ }
84
+ }
85
+ return { ...slotProps, ...overrideProps };
86
+ }
87
+ function getElementRef(element) {
88
+ let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
89
+ let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
90
+ if (mayWarn) {
91
+ return element.ref;
92
+ }
93
+ getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
94
+ mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
95
+ if (mayWarn) {
96
+ return element.props.ref;
97
+ }
98
+ return element.props.ref || element.ref;
99
+ }
100
+ var SELECTION_KEYS = ["Enter", " "];
101
+ var FIRST_KEYS = ["ArrowDown", "PageUp", "Home"];
102
+ var LAST_KEYS = ["ArrowUp", "PageDown", "End"];
103
+ var FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
104
+ var SUB_OPEN_KEYS = {
105
+ ltr: [...SELECTION_KEYS, "ArrowRight"],
106
+ rtl: [...SELECTION_KEYS, "ArrowLeft"]
107
+ };
108
+ var SUB_CLOSE_KEYS = {
109
+ ltr: ["ArrowLeft"],
110
+ rtl: ["ArrowRight"]
111
+ };
112
+ var MENU_NAME = "Menu";
113
+ var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
114
+ var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
115
+ createCollectionScope,
116
+ createPopperScope,
117
+ createRovingFocusGroupScope
118
+ ]);
119
+ var usePopperScope = createPopperScope();
120
+ var useRovingFocusGroupScope = createRovingFocusGroupScope();
121
+ var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
122
+ var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
123
+ var Menu = (props) => {
124
+ const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
125
+ const popperScope = usePopperScope(__scopeMenu);
126
+ const [content, setContent] = reactExports.useState(null);
127
+ const isUsingKeyboardRef = reactExports.useRef(false);
128
+ const handleOpenChange = useCallbackRef(onOpenChange);
129
+ const direction = useDirection(dir);
130
+ reactExports.useEffect(() => {
131
+ const handleKeyDown = () => {
132
+ isUsingKeyboardRef.current = true;
133
+ document.addEventListener("pointerdown", handlePointer, { capture: true, once: true });
134
+ document.addEventListener("pointermove", handlePointer, { capture: true, once: true });
135
+ };
136
+ const handlePointer = () => isUsingKeyboardRef.current = false;
137
+ document.addEventListener("keydown", handleKeyDown, { capture: true });
138
+ return () => {
139
+ document.removeEventListener("keydown", handleKeyDown, { capture: true });
140
+ document.removeEventListener("pointerdown", handlePointer, { capture: true });
141
+ document.removeEventListener("pointermove", handlePointer, { capture: true });
142
+ };
143
+ }, []);
144
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2, { ...popperScope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
145
+ MenuProvider,
146
+ {
147
+ scope: __scopeMenu,
148
+ open,
149
+ onOpenChange: handleOpenChange,
150
+ content,
151
+ onContentChange: setContent,
152
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
153
+ MenuRootProvider,
154
+ {
155
+ scope: __scopeMenu,
156
+ onClose: reactExports.useCallback(() => handleOpenChange(false), [handleOpenChange]),
157
+ isUsingKeyboardRef,
158
+ dir: direction,
159
+ modal,
160
+ children
161
+ }
162
+ )
163
+ }
164
+ ) });
165
+ };
166
+ Menu.displayName = MENU_NAME;
167
+ var ANCHOR_NAME = "MenuAnchor";
168
+ var MenuAnchor = reactExports.forwardRef(
169
+ (props, forwardedRef) => {
170
+ const { __scopeMenu, ...anchorProps } = props;
171
+ const popperScope = usePopperScope(__scopeMenu);
172
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
173
+ }
174
+ );
175
+ MenuAnchor.displayName = ANCHOR_NAME;
176
+ var PORTAL_NAME = "MenuPortal";
177
+ var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {
178
+ forceMount: void 0
179
+ });
180
+ var MenuPortal = (props) => {
181
+ const { __scopeMenu, forceMount, children, container } = props;
182
+ const context = useMenuContext(PORTAL_NAME, __scopeMenu);
183
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { asChild: true, container, children }) }) });
184
+ };
185
+ MenuPortal.displayName = PORTAL_NAME;
186
+ var CONTENT_NAME = "MenuContent";
187
+ var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);
188
+ var MenuContent = reactExports.forwardRef(
189
+ (props, forwardedRef) => {
190
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
191
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
192
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
193
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
194
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
195
+ }
196
+ );
197
+ var MenuRootContentModal = reactExports.forwardRef(
198
+ (props, forwardedRef) => {
199
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
200
+ const ref = reactExports.useRef(null);
201
+ const composedRefs = useComposedRefs(forwardedRef, ref);
202
+ reactExports.useEffect(() => {
203
+ const content = ref.current;
204
+ if (content) return hideOthers(content);
205
+ }, []);
206
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
207
+ MenuContentImpl,
208
+ {
209
+ ...props,
210
+ ref: composedRefs,
211
+ trapFocus: context.open,
212
+ disableOutsidePointerEvents: context.open,
213
+ disableOutsideScroll: true,
214
+ onFocusOutside: composeEventHandlers(
215
+ props.onFocusOutside,
216
+ (event) => event.preventDefault(),
217
+ { checkForDefaultPrevented: false }
218
+ ),
219
+ onDismiss: () => context.onOpenChange(false)
220
+ }
221
+ );
222
+ }
223
+ );
224
+ var MenuRootContentNonModal = reactExports.forwardRef((props, forwardedRef) => {
225
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
226
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
227
+ MenuContentImpl,
228
+ {
229
+ ...props,
230
+ ref: forwardedRef,
231
+ trapFocus: false,
232
+ disableOutsidePointerEvents: false,
233
+ disableOutsideScroll: false,
234
+ onDismiss: () => context.onOpenChange(false)
235
+ }
236
+ );
237
+ });
238
+ var Slot = /* @__PURE__ */ createSlot("MenuContent.ScrollLock");
239
+ var MenuContentImpl = reactExports.forwardRef(
240
+ (props, forwardedRef) => {
241
+ const {
242
+ __scopeMenu,
243
+ loop = false,
244
+ trapFocus,
245
+ onOpenAutoFocus,
246
+ onCloseAutoFocus,
247
+ disableOutsidePointerEvents,
248
+ onEntryFocus,
249
+ onEscapeKeyDown,
250
+ onPointerDownOutside,
251
+ onFocusOutside,
252
+ onInteractOutside,
253
+ onDismiss,
254
+ disableOutsideScroll,
255
+ ...contentProps
256
+ } = props;
257
+ const context = useMenuContext(CONTENT_NAME, __scopeMenu);
258
+ const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);
259
+ const popperScope = usePopperScope(__scopeMenu);
260
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
261
+ const getItems = useCollection(__scopeMenu);
262
+ const [currentItemId, setCurrentItemId] = reactExports.useState(null);
263
+ const contentRef = reactExports.useRef(null);
264
+ const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
265
+ const timerRef = reactExports.useRef(0);
266
+ const searchRef = reactExports.useRef("");
267
+ const pointerGraceTimerRef = reactExports.useRef(0);
268
+ const pointerGraceIntentRef = reactExports.useRef(null);
269
+ const pointerDirRef = reactExports.useRef("right");
270
+ const lastPointerXRef = reactExports.useRef(0);
271
+ const ScrollLockWrapper = disableOutsideScroll ? ReactRemoveScroll : reactExports.Fragment;
272
+ const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;
273
+ const handleTypeaheadSearch = (key) => {
274
+ const search = searchRef.current + key;
275
+ const items = getItems().filter((item) => !item.disabled);
276
+ const currentItem = document.activeElement;
277
+ const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;
278
+ const values = items.map((item) => item.textValue);
279
+ const nextMatch = getNextMatch(values, search, currentMatch);
280
+ const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;
281
+ (function updateSearch(value) {
282
+ searchRef.current = value;
283
+ window.clearTimeout(timerRef.current);
284
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
285
+ })(search);
286
+ if (newItem) {
287
+ setTimeout(() => newItem.focus());
288
+ }
289
+ };
290
+ reactExports.useEffect(() => {
291
+ return () => window.clearTimeout(timerRef.current);
292
+ }, []);
293
+ useFocusGuards();
294
+ const isPointerMovingToSubmenu = reactExports.useCallback((event) => {
295
+ const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;
296
+ return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);
297
+ }, []);
298
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
299
+ MenuContentProvider,
300
+ {
301
+ scope: __scopeMenu,
302
+ searchRef,
303
+ onItemEnter: reactExports.useCallback(
304
+ (event) => {
305
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
306
+ },
307
+ [isPointerMovingToSubmenu]
308
+ ),
309
+ onItemLeave: reactExports.useCallback(
310
+ (event) => {
311
+ if (isPointerMovingToSubmenu(event)) return;
312
+ contentRef.current?.focus();
313
+ setCurrentItemId(null);
314
+ },
315
+ [isPointerMovingToSubmenu]
316
+ ),
317
+ onTriggerLeave: reactExports.useCallback(
318
+ (event) => {
319
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
320
+ },
321
+ [isPointerMovingToSubmenu]
322
+ ),
323
+ pointerGraceTimerRef,
324
+ onPointerGraceIntentChange: reactExports.useCallback((intent) => {
325
+ pointerGraceIntentRef.current = intent;
326
+ }, []),
327
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
328
+ FocusScope,
329
+ {
330
+ asChild: true,
331
+ trapped: trapFocus,
332
+ onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {
333
+ event.preventDefault();
334
+ contentRef.current?.focus({ preventScroll: true });
335
+ }),
336
+ onUnmountAutoFocus: onCloseAutoFocus,
337
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
338
+ DismissableLayer,
339
+ {
340
+ asChild: true,
341
+ disableOutsidePointerEvents,
342
+ onEscapeKeyDown,
343
+ onPointerDownOutside,
344
+ onFocusOutside,
345
+ onInteractOutside,
346
+ onDismiss,
347
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
348
+ Root,
349
+ {
350
+ asChild: true,
351
+ ...rovingFocusGroupScope,
352
+ dir: rootContext.dir,
353
+ orientation: "vertical",
354
+ loop,
355
+ currentTabStopId: currentItemId,
356
+ onCurrentTabStopIdChange: setCurrentItemId,
357
+ onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {
358
+ if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
359
+ }),
360
+ preventScrollOnEntryFocus: true,
361
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
362
+ Content,
363
+ {
364
+ role: "menu",
365
+ "aria-orientation": "vertical",
366
+ "data-state": getOpenState(context.open),
367
+ "data-radix-menu-content": "",
368
+ dir: rootContext.dir,
369
+ ...popperScope,
370
+ ...contentProps,
371
+ ref: composedRefs,
372
+ style: { outline: "none", ...contentProps.style },
373
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
374
+ const target = event.target;
375
+ const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
376
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
377
+ const isCharacterKey = event.key.length === 1;
378
+ if (isKeyDownInside) {
379
+ if (event.key === "Tab") event.preventDefault();
380
+ if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
381
+ }
382
+ const content = contentRef.current;
383
+ if (event.target !== content) return;
384
+ if (!FIRST_LAST_KEYS.includes(event.key)) return;
385
+ event.preventDefault();
386
+ const items = getItems().filter((item) => !item.disabled);
387
+ const candidateNodes = items.map((item) => item.ref.current);
388
+ if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
389
+ focusFirst(candidateNodes);
390
+ }),
391
+ onBlur: composeEventHandlers(props.onBlur, (event) => {
392
+ if (!event.currentTarget.contains(event.target)) {
393
+ window.clearTimeout(timerRef.current);
394
+ searchRef.current = "";
395
+ }
396
+ }),
397
+ onPointerMove: composeEventHandlers(
398
+ props.onPointerMove,
399
+ whenMouse((event) => {
400
+ const target = event.target;
401
+ const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
402
+ if (event.currentTarget.contains(target) && pointerXHasChanged) {
403
+ const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
404
+ pointerDirRef.current = newDir;
405
+ lastPointerXRef.current = event.clientX;
406
+ }
407
+ })
408
+ )
409
+ }
410
+ )
411
+ }
412
+ )
413
+ }
414
+ )
415
+ }
416
+ ) })
417
+ }
418
+ );
419
+ }
420
+ );
421
+ MenuContent.displayName = CONTENT_NAME;
422
+ var GROUP_NAME = "MenuGroup";
423
+ var MenuGroup = reactExports.forwardRef(
424
+ (props, forwardedRef) => {
425
+ const { __scopeMenu, ...groupProps } = props;
426
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { role: "group", ...groupProps, ref: forwardedRef });
427
+ }
428
+ );
429
+ MenuGroup.displayName = GROUP_NAME;
430
+ var LABEL_NAME = "MenuLabel";
431
+ var MenuLabel = reactExports.forwardRef(
432
+ (props, forwardedRef) => {
433
+ const { __scopeMenu, ...labelProps } = props;
434
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { ...labelProps, ref: forwardedRef });
435
+ }
436
+ );
437
+ MenuLabel.displayName = LABEL_NAME;
438
+ var ITEM_NAME = "MenuItem";
439
+ var ITEM_SELECT = "menu.itemSelect";
440
+ var MenuItem = reactExports.forwardRef(
441
+ (props, forwardedRef) => {
442
+ const { disabled = false, onSelect, ...itemProps } = props;
443
+ const ref = reactExports.useRef(null);
444
+ const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);
445
+ const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);
446
+ const composedRefs = useComposedRefs(forwardedRef, ref);
447
+ const isPointerDownRef = reactExports.useRef(false);
448
+ const handleSelect = () => {
449
+ const menuItem = ref.current;
450
+ if (!disabled && menuItem) {
451
+ const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });
452
+ menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });
453
+ dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
454
+ if (itemSelectEvent.defaultPrevented) {
455
+ isPointerDownRef.current = false;
456
+ } else {
457
+ rootContext.onClose();
458
+ }
459
+ }
460
+ };
461
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
462
+ MenuItemImpl,
463
+ {
464
+ ...itemProps,
465
+ ref: composedRefs,
466
+ disabled,
467
+ onClick: composeEventHandlers(props.onClick, handleSelect),
468
+ onPointerDown: (event) => {
469
+ props.onPointerDown?.(event);
470
+ isPointerDownRef.current = true;
471
+ },
472
+ onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {
473
+ if (!isPointerDownRef.current) event.currentTarget?.click();
474
+ }),
475
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
476
+ const isTypingAhead = contentContext.searchRef.current !== "";
477
+ if (disabled || isTypingAhead && event.key === " ") return;
478
+ if (SELECTION_KEYS.includes(event.key)) {
479
+ event.currentTarget.click();
480
+ event.preventDefault();
481
+ }
482
+ })
483
+ }
484
+ );
485
+ }
486
+ );
487
+ MenuItem.displayName = ITEM_NAME;
488
+ var MenuItemImpl = reactExports.forwardRef(
489
+ (props, forwardedRef) => {
490
+ const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
491
+ const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);
492
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
493
+ const ref = reactExports.useRef(null);
494
+ const composedRefs = useComposedRefs(forwardedRef, ref);
495
+ const [isFocused, setIsFocused] = reactExports.useState(false);
496
+ const [textContent, setTextContent] = reactExports.useState("");
497
+ reactExports.useEffect(() => {
498
+ const menuItem = ref.current;
499
+ if (menuItem) {
500
+ setTextContent((menuItem.textContent ?? "").trim());
501
+ }
502
+ }, [itemProps.children]);
503
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
504
+ Collection.ItemSlot,
505
+ {
506
+ scope: __scopeMenu,
507
+ disabled,
508
+ textValue: textValue ?? textContent,
509
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
510
+ Primitive.div,
511
+ {
512
+ role: "menuitem",
513
+ "data-highlighted": isFocused ? "" : void 0,
514
+ "aria-disabled": disabled || void 0,
515
+ "data-disabled": disabled ? "" : void 0,
516
+ ...itemProps,
517
+ ref: composedRefs,
518
+ onPointerMove: composeEventHandlers(
519
+ props.onPointerMove,
520
+ whenMouse((event) => {
521
+ if (disabled) {
522
+ contentContext.onItemLeave(event);
523
+ } else {
524
+ contentContext.onItemEnter(event);
525
+ if (!event.defaultPrevented) {
526
+ const item = event.currentTarget;
527
+ item.focus({ preventScroll: true });
528
+ }
529
+ }
530
+ })
531
+ ),
532
+ onPointerLeave: composeEventHandlers(
533
+ props.onPointerLeave,
534
+ whenMouse((event) => contentContext.onItemLeave(event))
535
+ ),
536
+ onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),
537
+ onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))
538
+ }
539
+ ) })
540
+ }
541
+ );
542
+ }
543
+ );
544
+ var CHECKBOX_ITEM_NAME = "MenuCheckboxItem";
545
+ var MenuCheckboxItem = reactExports.forwardRef(
546
+ (props, forwardedRef) => {
547
+ const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
548
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
549
+ MenuItem,
550
+ {
551
+ role: "menuitemcheckbox",
552
+ "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
553
+ ...checkboxItemProps,
554
+ ref: forwardedRef,
555
+ "data-state": getCheckedState(checked),
556
+ onSelect: composeEventHandlers(
557
+ checkboxItemProps.onSelect,
558
+ () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),
559
+ { checkForDefaultPrevented: false }
560
+ )
561
+ }
562
+ ) });
563
+ }
564
+ );
565
+ MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
566
+ var RADIO_GROUP_NAME = "MenuRadioGroup";
567
+ var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(
568
+ RADIO_GROUP_NAME,
569
+ { value: void 0, onValueChange: () => {
570
+ } }
571
+ );
572
+ var MenuRadioGroup = reactExports.forwardRef(
573
+ (props, forwardedRef) => {
574
+ const { value, onValueChange, ...groupProps } = props;
575
+ const handleValueChange = useCallbackRef(onValueChange);
576
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });
577
+ }
578
+ );
579
+ MenuRadioGroup.displayName = RADIO_GROUP_NAME;
580
+ var RADIO_ITEM_NAME = "MenuRadioItem";
581
+ var MenuRadioItem = reactExports.forwardRef(
582
+ (props, forwardedRef) => {
583
+ const { value, ...radioItemProps } = props;
584
+ const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);
585
+ const checked = value === context.value;
586
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
587
+ MenuItem,
588
+ {
589
+ role: "menuitemradio",
590
+ "aria-checked": checked,
591
+ ...radioItemProps,
592
+ ref: forwardedRef,
593
+ "data-state": getCheckedState(checked),
594
+ onSelect: composeEventHandlers(
595
+ radioItemProps.onSelect,
596
+ () => context.onValueChange?.(value),
597
+ { checkForDefaultPrevented: false }
598
+ )
599
+ }
600
+ ) });
601
+ }
602
+ );
603
+ MenuRadioItem.displayName = RADIO_ITEM_NAME;
604
+ var ITEM_INDICATOR_NAME = "MenuItemIndicator";
605
+ var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(
606
+ ITEM_INDICATOR_NAME,
607
+ { checked: false }
608
+ );
609
+ var MenuItemIndicator = reactExports.forwardRef(
610
+ (props, forwardedRef) => {
611
+ const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
612
+ const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
613
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
614
+ Presence,
615
+ {
616
+ present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
617
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
618
+ Primitive.span,
619
+ {
620
+ ...itemIndicatorProps,
621
+ ref: forwardedRef,
622
+ "data-state": getCheckedState(indicatorContext.checked)
623
+ }
624
+ )
625
+ }
626
+ );
627
+ }
628
+ );
629
+ MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
630
+ var SEPARATOR_NAME = "MenuSeparator";
631
+ var MenuSeparator = reactExports.forwardRef(
632
+ (props, forwardedRef) => {
633
+ const { __scopeMenu, ...separatorProps } = props;
634
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
635
+ Primitive.div,
636
+ {
637
+ role: "separator",
638
+ "aria-orientation": "horizontal",
639
+ ...separatorProps,
640
+ ref: forwardedRef
641
+ }
642
+ );
643
+ }
644
+ );
645
+ MenuSeparator.displayName = SEPARATOR_NAME;
646
+ var ARROW_NAME = "MenuArrow";
647
+ var MenuArrow = reactExports.forwardRef(
648
+ (props, forwardedRef) => {
649
+ const { __scopeMenu, ...arrowProps } = props;
650
+ const popperScope = usePopperScope(__scopeMenu);
651
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });
652
+ }
653
+ );
654
+ MenuArrow.displayName = ARROW_NAME;
655
+ var SUB_NAME = "MenuSub";
656
+ var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
657
+ var SUB_TRIGGER_NAME = "MenuSubTrigger";
658
+ var MenuSubTrigger = reactExports.forwardRef(
659
+ (props, forwardedRef) => {
660
+ const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);
661
+ const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);
662
+ const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);
663
+ const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);
664
+ const openTimerRef = reactExports.useRef(null);
665
+ const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
666
+ const scope = { __scopeMenu: props.__scopeMenu };
667
+ const clearOpenTimer = reactExports.useCallback(() => {
668
+ if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
669
+ openTimerRef.current = null;
670
+ }, []);
671
+ reactExports.useEffect(() => clearOpenTimer, [clearOpenTimer]);
672
+ reactExports.useEffect(() => {
673
+ const pointerGraceTimer = pointerGraceTimerRef.current;
674
+ return () => {
675
+ window.clearTimeout(pointerGraceTimer);
676
+ onPointerGraceIntentChange(null);
677
+ };
678
+ }, [pointerGraceTimerRef, onPointerGraceIntentChange]);
679
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
680
+ MenuItemImpl,
681
+ {
682
+ id: subContext.triggerId,
683
+ "aria-haspopup": "menu",
684
+ "aria-expanded": context.open,
685
+ "aria-controls": subContext.contentId,
686
+ "data-state": getOpenState(context.open),
687
+ ...props,
688
+ ref: composeRefs(forwardedRef, subContext.onTriggerChange),
689
+ onClick: (event) => {
690
+ props.onClick?.(event);
691
+ if (props.disabled || event.defaultPrevented) return;
692
+ event.currentTarget.focus();
693
+ if (!context.open) context.onOpenChange(true);
694
+ },
695
+ onPointerMove: composeEventHandlers(
696
+ props.onPointerMove,
697
+ whenMouse((event) => {
698
+ contentContext.onItemEnter(event);
699
+ if (event.defaultPrevented) return;
700
+ if (!props.disabled && !context.open && !openTimerRef.current) {
701
+ contentContext.onPointerGraceIntentChange(null);
702
+ openTimerRef.current = window.setTimeout(() => {
703
+ context.onOpenChange(true);
704
+ clearOpenTimer();
705
+ }, 100);
706
+ }
707
+ })
708
+ ),
709
+ onPointerLeave: composeEventHandlers(
710
+ props.onPointerLeave,
711
+ whenMouse((event) => {
712
+ clearOpenTimer();
713
+ const contentRect = context.content?.getBoundingClientRect();
714
+ if (contentRect) {
715
+ const side = context.content?.dataset.side;
716
+ const rightSide = side === "right";
717
+ const bleed = rightSide ? -5 : 5;
718
+ const contentNearEdge = contentRect[rightSide ? "left" : "right"];
719
+ const contentFarEdge = contentRect[rightSide ? "right" : "left"];
720
+ contentContext.onPointerGraceIntentChange({
721
+ area: [
722
+ // Apply a bleed on clientX to ensure that our exit point is
723
+ // consistently within polygon bounds
724
+ { x: event.clientX + bleed, y: event.clientY },
725
+ { x: contentNearEdge, y: contentRect.top },
726
+ { x: contentFarEdge, y: contentRect.top },
727
+ { x: contentFarEdge, y: contentRect.bottom },
728
+ { x: contentNearEdge, y: contentRect.bottom }
729
+ ],
730
+ side
731
+ });
732
+ window.clearTimeout(pointerGraceTimerRef.current);
733
+ pointerGraceTimerRef.current = window.setTimeout(
734
+ () => contentContext.onPointerGraceIntentChange(null),
735
+ 300
736
+ );
737
+ } else {
738
+ contentContext.onTriggerLeave(event);
739
+ if (event.defaultPrevented) return;
740
+ contentContext.onPointerGraceIntentChange(null);
741
+ }
742
+ })
743
+ ),
744
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
745
+ const isTypingAhead = contentContext.searchRef.current !== "";
746
+ if (props.disabled || isTypingAhead && event.key === " ") return;
747
+ if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
748
+ context.onOpenChange(true);
749
+ context.content?.focus();
750
+ event.preventDefault();
751
+ }
752
+ })
753
+ }
754
+ ) });
755
+ }
756
+ );
757
+ MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
758
+ var SUB_CONTENT_NAME = "MenuSubContent";
759
+ var MenuSubContent = reactExports.forwardRef(
760
+ (props, forwardedRef) => {
761
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
762
+ const { forceMount = portalContext.forceMount, ...subContentProps } = props;
763
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
764
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
765
+ const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);
766
+ const ref = reactExports.useRef(null);
767
+ const composedRefs = useComposedRefs(forwardedRef, ref);
768
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
769
+ MenuContentImpl,
770
+ {
771
+ id: subContext.contentId,
772
+ "aria-labelledby": subContext.triggerId,
773
+ ...subContentProps,
774
+ ref: composedRefs,
775
+ align: "start",
776
+ side: rootContext.dir === "rtl" ? "left" : "right",
777
+ disableOutsidePointerEvents: false,
778
+ disableOutsideScroll: false,
779
+ trapFocus: false,
780
+ onOpenAutoFocus: (event) => {
781
+ if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();
782
+ event.preventDefault();
783
+ },
784
+ onCloseAutoFocus: (event) => event.preventDefault(),
785
+ onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {
786
+ if (event.target !== subContext.trigger) context.onOpenChange(false);
787
+ }),
788
+ onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {
789
+ rootContext.onClose();
790
+ event.preventDefault();
791
+ }),
792
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
793
+ const isKeyDownInside = event.currentTarget.contains(event.target);
794
+ const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
795
+ if (isKeyDownInside && isCloseKey) {
796
+ context.onOpenChange(false);
797
+ subContext.trigger?.focus();
798
+ event.preventDefault();
799
+ }
800
+ })
801
+ }
802
+ ) }) }) });
803
+ }
804
+ );
805
+ MenuSubContent.displayName = SUB_CONTENT_NAME;
806
+ function getOpenState(open) {
807
+ return open ? "open" : "closed";
808
+ }
809
+ function isIndeterminate(checked) {
810
+ return checked === "indeterminate";
811
+ }
812
+ function getCheckedState(checked) {
813
+ return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
814
+ }
815
+ function focusFirst(candidates) {
816
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
817
+ for (const candidate of candidates) {
818
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
819
+ candidate.focus();
820
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
821
+ }
822
+ }
823
+ function wrapArray(array, startIndex) {
824
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
825
+ }
826
+ function getNextMatch(values, search, currentMatch) {
827
+ const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
828
+ const normalizedSearch = isRepeated ? search[0] : search;
829
+ const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
830
+ let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
831
+ const excludeCurrentMatch = normalizedSearch.length === 1;
832
+ if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);
833
+ const nextMatch = wrappedValues.find(
834
+ (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
835
+ );
836
+ return nextMatch !== currentMatch ? nextMatch : void 0;
837
+ }
838
+ function isPointInPolygon(point, polygon) {
839
+ const { x, y } = point;
840
+ let inside = false;
841
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
842
+ const ii = polygon[i];
843
+ const jj = polygon[j];
844
+ const xi = ii.x;
845
+ const yi = ii.y;
846
+ const xj = jj.x;
847
+ const yj = jj.y;
848
+ const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
849
+ if (intersect) inside = !inside;
850
+ }
851
+ return inside;
852
+ }
853
+ function isPointerInGraceArea(event, area) {
854
+ if (!area) return false;
855
+ const cursorPos = { x: event.clientX, y: event.clientY };
856
+ return isPointInPolygon(cursorPos, area);
857
+ }
858
+ function whenMouse(handler) {
859
+ return (event) => event.pointerType === "mouse" ? handler(event) : void 0;
860
+ }
861
+ var Root3 = Menu;
862
+ var Anchor2 = MenuAnchor;
863
+ var Portal = MenuPortal;
864
+ var Content2 = MenuContent;
865
+ var Group = MenuGroup;
866
+ var Label = MenuLabel;
867
+ var Item2 = MenuItem;
868
+ var CheckboxItem = MenuCheckboxItem;
869
+ var RadioGroup = MenuRadioGroup;
870
+ var RadioItem = MenuRadioItem;
871
+ var ItemIndicator = MenuItemIndicator;
872
+ var Separator = MenuSeparator;
873
+ var Arrow2 = MenuArrow;
874
+ var SubTrigger = MenuSubTrigger;
875
+ var SubContent = MenuSubContent;
876
+ export {
877
+ Anchor2 as A,
878
+ CheckboxItem as C,
879
+ Group as G,
880
+ Item2 as I,
881
+ Label as L,
882
+ Portal as P,
883
+ RadioGroup as R,
884
+ Separator as S,
885
+ Arrow2 as a,
886
+ Content2 as b,
887
+ ItemIndicator as c,
888
+ RadioItem as d,
889
+ Root3 as e,
890
+ SubContent as f,
891
+ SubTrigger as g,
892
+ createMenuScope as h
893
+ };