@phake/lanework 0.1.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 (370) hide show
  1. package/cli.mjs +58 -0
  2. package/dist-local/client/android-chrome-192x192.png +0 -0
  3. package/dist-local/client/android-chrome-512x512.png +0 -0
  4. package/dist-local/client/apple-touch-icon.png +0 -0
  5. package/dist-local/client/assets/Tag01Icon-DNgtGZ3r.js +1 -0
  6. package/dist-local/client/assets/abap-CLvhMVsD.js +1 -0
  7. package/dist-local/client/assets/actionscript-3--17pq3dv.js +1 -0
  8. package/dist-local/client/assets/ada-C5qYipkI.js +1 -0
  9. package/dist-local/client/assets/andromeeda-vGVdxbeo.js +1 -0
  10. package/dist-local/client/assets/angular-html-DrvEcI8G.js +1 -0
  11. package/dist-local/client/assets/angular-ts-D8CUV3s9.js +1 -0
  12. package/dist-local/client/assets/apache-U0d_L8uA.js +1 -0
  13. package/dist-local/client/assets/apex-VAyPSnFM.js +1 -0
  14. package/dist-local/client/assets/apl-PcM4Dp7k.js +1 -0
  15. package/dist-local/client/assets/app-DMYVKfjU.css +2 -0
  16. package/dist-local/client/assets/applescript-CCn79oCD.js +1 -0
  17. package/dist-local/client/assets/ara-4CJ0cIlV.js +1 -0
  18. package/dist-local/client/assets/asciidoc-DE70LPWp.js +1 -0
  19. package/dist-local/client/assets/asm-Cmm7eHzH.js +1 -0
  20. package/dist-local/client/assets/astro-DcteBnKj.js +1 -0
  21. package/dist-local/client/assets/aurora-x-CDeNXAV0.js +1 -0
  22. package/dist-local/client/assets/awk-BWXHIvNe.js +1 -0
  23. package/dist-local/client/assets/ayu-dark-DluEY0Gj.js +1 -0
  24. package/dist-local/client/assets/ayu-light-C3h-C4tm.js +1 -0
  25. package/dist-local/client/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  26. package/dist-local/client/assets/ballerina-B7ZEbQpA.js +1 -0
  27. package/dist-local/client/assets/bat-Bo4NYOV-.js +1 -0
  28. package/dist-local/client/assets/beancount-D-usSTwE.js +1 -0
  29. package/dist-local/client/assets/berry-DKpUyyne.js +1 -0
  30. package/dist-local/client/assets/bibtex-Ci_nEsc7.js +1 -0
  31. package/dist-local/client/assets/bicep-CUHmPFLl.js +1 -0
  32. package/dist-local/client/assets/bird2-C6vDhewU.js +1 -0
  33. package/dist-local/client/assets/blade-6YnoPBU8.js +1 -0
  34. package/dist-local/client/assets/board._owner._repo-DyrvTwhk.js +1 -0
  35. package/dist-local/client/assets/board._owner._repo-hvj6B94q.js +38 -0
  36. package/dist-local/client/assets/bsl-BkkzgIyY.js +1 -0
  37. package/dist-local/client/assets/c-PpPxyn8g.js +1 -0
  38. package/dist-local/client/assets/c3-BFHwR3_K.js +1 -0
  39. package/dist-local/client/assets/cadence-CQ2zXKGN.js +1 -0
  40. package/dist-local/client/assets/cairo-DLTphjLi.js +1 -0
  41. package/dist-local/client/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  42. package/dist-local/client/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  43. package/dist-local/client/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  44. package/dist-local/client/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  45. package/dist-local/client/assets/chunk-Cyuzqnbw.js +1 -0
  46. package/dist-local/client/assets/clarity-SemFz856.js +1 -0
  47. package/dist-local/client/assets/clojure-DqKBuwfJ.js +1 -0
  48. package/dist-local/client/assets/cmake-Bj61d0ZC.js +1 -0
  49. package/dist-local/client/assets/cobol-IOjEjPmG.js +1 -0
  50. package/dist-local/client/assets/codeowners-C8r90Shi.js +1 -0
  51. package/dist-local/client/assets/codeql-oeQT6MSM.js +1 -0
  52. package/dist-local/client/assets/coffee-B5TREocO.js +1 -0
  53. package/dist-local/client/assets/common-lisp-Cv5bFMCO.js +1 -0
  54. package/dist-local/client/assets/coq-BrsZFFmf.js +1 -0
  55. package/dist-local/client/assets/cpp-C4ceAJBi.js +1 -0
  56. package/dist-local/client/assets/crystal-CgtjlE18.js +1 -0
  57. package/dist-local/client/assets/csharp-oqKa8noW.js +1 -0
  58. package/dist-local/client/assets/css-Dflf0SUa.js +1 -0
  59. package/dist-local/client/assets/csv-Dx-8-gkx.js +1 -0
  60. package/dist-local/client/assets/cue-CE9AQfxI.js +1 -0
  61. package/dist-local/client/assets/cypher-ClKdZ_lG.js +1 -0
  62. package/dist-local/client/assets/d-qD-0Kul2.js +1 -0
  63. package/dist-local/client/assets/dark-plus-Cs2F2srj.js +1 -0
  64. package/dist-local/client/assets/dart-CnvKMtbv.js +1 -0
  65. package/dist-local/client/assets/dax-BkyTk9wS.js +1 -0
  66. package/dist-local/client/assets/desktop-Dlh5hvp9.js +1 -0
  67. package/dist-local/client/assets/diff-woXpYk--.js +1 -0
  68. package/dist-local/client/assets/dist-DZ2bn-Z6.js +153 -0
  69. package/dist-local/client/assets/docker-IyjqRm3v.js +1 -0
  70. package/dist-local/client/assets/dotenv-_5a1GRtc.js +1 -0
  71. package/dist-local/client/assets/dracula-BHWKrbxM.js +1 -0
  72. package/dist-local/client/assets/dracula-soft-5eyTD99u.js +1 -0
  73. package/dist-local/client/assets/dream-maker-DW3nJb8Q.js +1 -0
  74. package/dist-local/client/assets/edge-DoVTVjme.js +1 -0
  75. package/dist-local/client/assets/elixir-CzgPtVDf.js +1 -0
  76. package/dist-local/client/assets/elm-Cm7sFdI1.js +1 -0
  77. package/dist-local/client/assets/emacs-lisp-B4R74twV.js +1 -0
  78. package/dist-local/client/assets/erb-p0q977En.js +1 -0
  79. package/dist-local/client/assets/erlang-Cphh6RMH.js +1 -0
  80. package/dist-local/client/assets/everforest-dark-sB-x3p7T.js +1 -0
  81. package/dist-local/client/assets/everforest-light-Df2xbC6M.js +1 -0
  82. package/dist-local/client/assets/fennel-DQxkIbk2.js +1 -0
  83. package/dist-local/client/assets/fish-BJitypiv.js +1 -0
  84. package/dist-local/client/assets/fluent-C03EYrpw.js +1 -0
  85. package/dist-local/client/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  86. package/dist-local/client/assets/fortran-free-form-CYNrtFtB.js +1 -0
  87. package/dist-local/client/assets/fsharp-D13ZGOAj.js +1 -0
  88. package/dist-local/client/assets/gdresource-C0sCabJj.js +1 -0
  89. package/dist-local/client/assets/gdscript-Cp2uCuqX.js +1 -0
  90. package/dist-local/client/assets/gdshader-CBce3t8t.js +1 -0
  91. package/dist-local/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  92. package/dist-local/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  93. package/dist-local/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  94. package/dist-local/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  95. package/dist-local/client/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
  96. package/dist-local/client/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
  97. package/dist-local/client/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
  98. package/dist-local/client/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  99. package/dist-local/client/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
  100. package/dist-local/client/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
  101. package/dist-local/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  102. package/dist-local/client/assets/gemini-2_FJD5P-.js +1 -0
  103. package/dist-local/client/assets/genie-CV2tkWYe.js +1 -0
  104. package/dist-local/client/assets/gherkin-DExj1W_8.js +1 -0
  105. package/dist-local/client/assets/git-commit-BSykSTBG.js +1 -0
  106. package/dist-local/client/assets/git-rebase-D2tSwjJb.js +1 -0
  107. package/dist-local/client/assets/github-dark-C-LZuMrd.js +1 -0
  108. package/dist-local/client/assets/github-dark-default-DXG-b-1a.js +1 -0
  109. package/dist-local/client/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  110. package/dist-local/client/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  111. package/dist-local/client/assets/github-light-EUqPIrTm.js +1 -0
  112. package/dist-local/client/assets/github-light-default-BXViO-2h.js +1 -0
  113. package/dist-local/client/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  114. package/dist-local/client/assets/gleam-CSRkHgEL.js +1 -0
  115. package/dist-local/client/assets/glimmer-js-JMWzPMQ2.js +1 -0
  116. package/dist-local/client/assets/glimmer-ts-DG5GCT78.js +1 -0
  117. package/dist-local/client/assets/glsl-MPwHyiXQ.js +1 -0
  118. package/dist-local/client/assets/gn-ilITqXS6.js +1 -0
  119. package/dist-local/client/assets/gnuplot-7GGW24-e.js +1 -0
  120. package/dist-local/client/assets/go-rLFTqkRN.js +1 -0
  121. package/dist-local/client/assets/graphql-NW854Khs.js +1 -0
  122. package/dist-local/client/assets/groovy-CacY0gHj.js +1 -0
  123. package/dist-local/client/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  124. package/dist-local/client/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  125. package/dist-local/client/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  126. package/dist-local/client/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  127. package/dist-local/client/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  128. package/dist-local/client/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  129. package/dist-local/client/assets/guide-BXJBZbQA.js +115 -0
  130. package/dist-local/client/assets/hack-C4J_0T1S.js +1 -0
  131. package/dist-local/client/assets/haml-qGg_91I2.js +1 -0
  132. package/dist-local/client/assets/handlebars-BU7OV8YS.js +1 -0
  133. package/dist-local/client/assets/haskell-D8IpX4py.js +1 -0
  134. package/dist-local/client/assets/haxe-OTjmBuCE.js +1 -0
  135. package/dist-local/client/assets/hcl-Dh228itO.js +1 -0
  136. package/dist-local/client/assets/hjson-CxZEssPk.js +1 -0
  137. package/dist-local/client/assets/hlsl-Cvrh5tZx.js +1 -0
  138. package/dist-local/client/assets/horizon-CE9ld1lL.js +1 -0
  139. package/dist-local/client/assets/horizon-bright-DSNQnXHK.js +1 -0
  140. package/dist-local/client/assets/houston-CsvMBhTu.js +1 -0
  141. package/dist-local/client/assets/html-derivative-CWPAmHEG.js +1 -0
  142. package/dist-local/client/assets/html-x4KE3xEi.js +1 -0
  143. package/dist-local/client/assets/http-HvMG3K54.js +1 -0
  144. package/dist-local/client/assets/hurl-CLh1t2ES.js +1 -0
  145. package/dist-local/client/assets/hxml-B0Qn7Nwc.js +1 -0
  146. package/dist-local/client/assets/hy-CZbG8q4J.js +1 -0
  147. package/dist-local/client/assets/imba-DsUTQ-LC.js +1 -0
  148. package/dist-local/client/assets/index-TbIMjf2L.js +12 -0
  149. package/dist-local/client/assets/ini-B5eOa1yu.js +1 -0
  150. package/dist-local/client/assets/java-Cst_eZTE.js +1 -0
  151. package/dist-local/client/assets/javascript-i_rUTyCW.js +1 -0
  152. package/dist-local/client/assets/jinja-ISwn25cN.js +1 -0
  153. package/dist-local/client/assets/jison-D9Fg2JgN.js +1 -0
  154. package/dist-local/client/assets/json-DS5j4FfK.js +1 -0
  155. package/dist-local/client/assets/json5-BR5RXkoi.js +1 -0
  156. package/dist-local/client/assets/jsonc-CYpm1nAK.js +1 -0
  157. package/dist-local/client/assets/jsonl-CmCQp5Yx.js +1 -0
  158. package/dist-local/client/assets/jsonnet-CJTPZ8u_.js +1 -0
  159. package/dist-local/client/assets/jssm-DXw9l8Rf.js +1 -0
  160. package/dist-local/client/assets/jsx-CFyhNHav.js +1 -0
  161. package/dist-local/client/assets/julia-BRnC1exM.js +1 -0
  162. package/dist-local/client/assets/just-BWbKChh7.js +1 -0
  163. package/dist-local/client/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  164. package/dist-local/client/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  165. package/dist-local/client/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  166. package/dist-local/client/assets/kdl-CsD5j6eV.js +1 -0
  167. package/dist-local/client/assets/kotlin-DhhofPvG.js +1 -0
  168. package/dist-local/client/assets/kusto-C7mF5XQf.js +1 -0
  169. package/dist-local/client/assets/laserwave-C_8bwKvT.js +1 -0
  170. package/dist-local/client/assets/latex-DoFV6f5B.js +1 -0
  171. package/dist-local/client/assets/lean-CewbzKMR.js +1 -0
  172. package/dist-local/client/assets/less-DVTAwKKz.js +1 -0
  173. package/dist-local/client/assets/light-plus-DVQuIRkW.js +1 -0
  174. package/dist-local/client/assets/link-CUk1Z0N6.js +1 -0
  175. package/dist-local/client/assets/liquid-BGxpJKqJ.js +1 -0
  176. package/dist-local/client/assets/llvm-Cm23YOpf.js +1 -0
  177. package/dist-local/client/assets/log-BNLmms1o.js +1 -0
  178. package/dist-local/client/assets/logo-Cluzi2Zq.js +1 -0
  179. package/dist-local/client/assets/lua-VoGSg0xb.js +1 -0
  180. package/dist-local/client/assets/luau-FMPmPwt6.js +1 -0
  181. package/dist-local/client/assets/make-Dixweg8N.js +1 -0
  182. package/dist-local/client/assets/markdown-BYOwaDjH.js +1 -0
  183. package/dist-local/client/assets/marko-E8KxKzjy.js +1 -0
  184. package/dist-local/client/assets/material-theme-Bm3Qr25_.js +1 -0
  185. package/dist-local/client/assets/material-theme-darker-2IIEA8gg.js +1 -0
  186. package/dist-local/client/assets/material-theme-lighter-uhdI0v04.js +1 -0
  187. package/dist-local/client/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  188. package/dist-local/client/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  189. package/dist-local/client/assets/matlab-D7qyCx1q.js +1 -0
  190. package/dist-local/client/assets/mdc-ytrN0-8H.js +1 -0
  191. package/dist-local/client/assets/mdx-DQZ5AkYe.js +1 -0
  192. package/dist-local/client/assets/mermaid-Bk4SNUv9.js +1 -0
  193. package/dist-local/client/assets/min-dark-BSWPekZh.js +1 -0
  194. package/dist-local/client/assets/min-light-DDpmG2fV.js +1 -0
  195. package/dist-local/client/assets/mipsasm-BMqwQI7S.js +1 -0
  196. package/dist-local/client/assets/mojo-BgCJLMeH.js +1 -0
  197. package/dist-local/client/assets/monokai-CdkpiU2Y.js +1 -0
  198. package/dist-local/client/assets/moonbit-CaWjb8XO.js +1 -0
  199. package/dist-local/client/assets/move-B1IS1UjX.js +1 -0
  200. package/dist-local/client/assets/narrat-_X_XdTYD.js +1 -0
  201. package/dist-local/client/assets/nextflow-BJtWHP5T.js +1 -0
  202. package/dist-local/client/assets/nextflow-groovy-DJMQeKeT.js +1 -0
  203. package/dist-local/client/assets/nginx-CgHaWcsO.js +1 -0
  204. package/dist-local/client/assets/night-owl-DhmEMT88.js +1 -0
  205. package/dist-local/client/assets/night-owl-light-eJ-hLW7d.js +1 -0
  206. package/dist-local/client/assets/nim-xKCzf2o0.js +1 -0
  207. package/dist-local/client/assets/nix-IvuFDN5E.js +1 -0
  208. package/dist-local/client/assets/nord-Cb4Vim4T.js +1 -0
  209. package/dist-local/client/assets/nushell-DcLAeLz5.js +1 -0
  210. package/dist-local/client/assets/objective-c-D1A_Heim.js +1 -0
  211. package/dist-local/client/assets/objective-cpp-BsSzOQcm.js +1 -0
  212. package/dist-local/client/assets/ocaml-O90oeIOV.js +1 -0
  213. package/dist-local/client/assets/odin-B1RWQWA5.js +1 -0
  214. package/dist-local/client/assets/one-dark-pro-CLwyXe_n.js +1 -0
  215. package/dist-local/client/assets/one-light-D7Lr4KcI.js +1 -0
  216. package/dist-local/client/assets/openscad-BUDT5pXO.js +1 -0
  217. package/dist-local/client/assets/pascal-4ZHwLPI5.js +1 -0
  218. package/dist-local/client/assets/perl-CAUsHq6V.js +1 -0
  219. package/dist-local/client/assets/php-Cn4rjz2P.js +1 -0
  220. package/dist-local/client/assets/pkl-ot-7Btpt.js +1 -0
  221. package/dist-local/client/assets/plastic-DQwYfKfQ.js +1 -0
  222. package/dist-local/client/assets/plsql-DGHpHOYJ.js +1 -0
  223. package/dist-local/client/assets/po-BiJDBrnU.js +1 -0
  224. package/dist-local/client/assets/poimandres-DRFjx7u4.js +1 -0
  225. package/dist-local/client/assets/polar-C7UOKdEL.js +1 -0
  226. package/dist-local/client/assets/postcss-BXeXVLqQ.js +1 -0
  227. package/dist-local/client/assets/powerquery-DNMTfnFr.js +1 -0
  228. package/dist-local/client/assets/powershell-DshXNtvi.js +1 -0
  229. package/dist-local/client/assets/prisma-BsRQq5mF.js +1 -0
  230. package/dist-local/client/assets/prolog-iXnhIJG7.js +1 -0
  231. package/dist-local/client/assets/proto-DB4EqR-F.js +1 -0
  232. package/dist-local/client/assets/pug-DD9HHTGS.js +1 -0
  233. package/dist-local/client/assets/puppet-CDv2pdJW.js +1 -0
  234. package/dist-local/client/assets/purescript-9MfHhQsQ.js +1 -0
  235. package/dist-local/client/assets/python-gzcpVVnB.js +1 -0
  236. package/dist-local/client/assets/qml-DcW_sT3t.js +1 -0
  237. package/dist-local/client/assets/qmldir-DCQb3MpD.js +1 -0
  238. package/dist-local/client/assets/qss-Fe1Jh2GI.js +1 -0
  239. package/dist-local/client/assets/r-D2d3McyU.js +1 -0
  240. package/dist-local/client/assets/racket-DcIDlBhZ.js +1 -0
  241. package/dist-local/client/assets/raku-B3gFvitq.js +1 -0
  242. package/dist-local/client/assets/razor-30Cugjh2.js +1 -0
  243. package/dist-local/client/assets/red-CJ3rzSJv.js +1 -0
  244. package/dist-local/client/assets/reg-CRGYupPL.js +1 -0
  245. package/dist-local/client/assets/regexp-Bu0flJgP.js +1 -0
  246. package/dist-local/client/assets/rel-BtDbiS_P.js +1 -0
  247. package/dist-local/client/assets/review-status-RAnd_eAC.js +43 -0
  248. package/dist-local/client/assets/reviews-core-BKrjFeCa.js +1 -0
  249. package/dist-local/client/assets/riscv-Ckw8ddFX.js +1 -0
  250. package/dist-local/client/assets/ron-VUp2lXgN.js +1 -0
  251. package/dist-local/client/assets/rose-pine-BthvhNj6.js +1 -0
  252. package/dist-local/client/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  253. package/dist-local/client/assets/rose-pine-moon-hon4tzzS.js +1 -0
  254. package/dist-local/client/assets/rosmsg-CAekHB0j.js +1 -0
  255. package/dist-local/client/assets/routes-DhFdKFMi.js +12 -0
  256. package/dist-local/client/assets/rst-BIOjc2k6.js +1 -0
  257. package/dist-local/client/assets/ruby-BA7kcl5p.js +1 -0
  258. package/dist-local/client/assets/rust-Cfkwpbl8.js +1 -0
  259. package/dist-local/client/assets/sas-BHVT2N5I.js +1 -0
  260. package/dist-local/client/assets/sass-DXrisJhu.js +1 -0
  261. package/dist-local/client/assets/scala-DKOlJaKm.js +1 -0
  262. package/dist-local/client/assets/scheme-DQCgrYNe.js +1 -0
  263. package/dist-local/client/assets/scss-DdIrFDxD.js +1 -0
  264. package/dist-local/client/assets/sdbl-bTVj8UrX.js +1 -0
  265. package/dist-local/client/assets/shaderlab-TOUzSsQk.js +1 -0
  266. package/dist-local/client/assets/shellscript-BbTp1yjG.js +1 -0
  267. package/dist-local/client/assets/shellsession-BmAC8SMF.js +1 -0
  268. package/dist-local/client/assets/slack-dark-DnToyrRv.js +1 -0
  269. package/dist-local/client/assets/slack-ochin-B2OO5cIa.js +1 -0
  270. package/dist-local/client/assets/smalltalk-B16xEiuN.js +1 -0
  271. package/dist-local/client/assets/snazzy-light-4G7pJPwS.js +1 -0
  272. package/dist-local/client/assets/solarized-dark-DV17i1UV.js +1 -0
  273. package/dist-local/client/assets/solarized-light-DSh2HLQt.js +1 -0
  274. package/dist-local/client/assets/solidity-CKzVLygQ.js +1 -0
  275. package/dist-local/client/assets/soy-B5vCsGAN.js +1 -0
  276. package/dist-local/client/assets/sparql-D_iOobhT.js +1 -0
  277. package/dist-local/client/assets/splunk-BC2Px7Mm.js +1 -0
  278. package/dist-local/client/assets/sql-DCFvu5RM.js +1 -0
  279. package/dist-local/client/assets/ssh-config-BgfXC-Er.js +1 -0
  280. package/dist-local/client/assets/stata-h02h04e7.js +1 -0
  281. package/dist-local/client/assets/stylus-B6D30XZt.js +1 -0
  282. package/dist-local/client/assets/surrealql-DxccxuMd.js +1 -0
  283. package/dist-local/client/assets/svelte-CsxBlEum.js +1 -0
  284. package/dist-local/client/assets/swift-DonLKvLd.js +1 -0
  285. package/dist-local/client/assets/synthwave-84-nFMaYfgc.js +1 -0
  286. package/dist-local/client/assets/system-verilog-DJ5XKQeo.js +1 -0
  287. package/dist-local/client/assets/systemd-BxMlprV5.js +1 -0
  288. package/dist-local/client/assets/talonscript-CohzipZa.js +1 -0
  289. package/dist-local/client/assets/tasl-DMoTqEGO.js +1 -0
  290. package/dist-local/client/assets/tcl-CZd0xW_V.js +1 -0
  291. package/dist-local/client/assets/templ-DmkwoHql.js +1 -0
  292. package/dist-local/client/assets/terraform-DswuEJGm.js +1 -0
  293. package/dist-local/client/assets/tex-B0f_hYr8.js +1 -0
  294. package/dist-local/client/assets/tokyo-night-oM2G3aXe.js +1 -0
  295. package/dist-local/client/assets/toml-CcmNWLt0.js +1 -0
  296. package/dist-local/client/assets/ts-tags-CTs7_HT0.js +1 -0
  297. package/dist-local/client/assets/tsv-sltzmVWM.js +1 -0
  298. package/dist-local/client/assets/tsx-DFvk7AwW.js +1 -0
  299. package/dist-local/client/assets/turtle-ByJddavk.js +1 -0
  300. package/dist-local/client/assets/twig-DgtEA5Er.js +1 -0
  301. package/dist-local/client/assets/typescript-DHTLvXzV.js +1 -0
  302. package/dist-local/client/assets/typespec-BRdr0IET.js +1 -0
  303. package/dist-local/client/assets/typst-DI99ib-x.js +1 -0
  304. package/dist-local/client/assets/v-DETTlOr0.js +1 -0
  305. package/dist-local/client/assets/vala-zf12oZj6.js +1 -0
  306. package/dist-local/client/assets/vb-Djn5o6TS.js +1 -0
  307. package/dist-local/client/assets/verilog-CiiDBU1e.js +1 -0
  308. package/dist-local/client/assets/vesper-DdrHHSXu.js +1 -0
  309. package/dist-local/client/assets/vhdl-BroJfC0k.js +1 -0
  310. package/dist-local/client/assets/viml-DvXPmvsu.js +1 -0
  311. package/dist-local/client/assets/vitesse-black-fwtXNY1n.js +1 -0
  312. package/dist-local/client/assets/vitesse-dark-BZCL-v6S.js +1 -0
  313. package/dist-local/client/assets/vitesse-light-VbXTXTou.js +1 -0
  314. package/dist-local/client/assets/vue-CUpaeZ-j.js +1 -0
  315. package/dist-local/client/assets/vue-html-DQch_7VQ.js +1 -0
  316. package/dist-local/client/assets/vue-vine-BCPDker4.js +1 -0
  317. package/dist-local/client/assets/vyper-CgoNMtux.js +1 -0
  318. package/dist-local/client/assets/wasm-BnjxR4X6.js +1 -0
  319. package/dist-local/client/assets/wasm-ByWQv1Qj.js +1 -0
  320. package/dist-local/client/assets/wenyan-C8pVoKbM.js +1 -0
  321. package/dist-local/client/assets/wgsl-BsKzXJz4.js +1 -0
  322. package/dist-local/client/assets/wikitext-ClFFjSW2.js +1 -0
  323. package/dist-local/client/assets/wit-DdvCle-K.js +1 -0
  324. package/dist-local/client/assets/wolfram-DLL8P-h_.js +1 -0
  325. package/dist-local/client/assets/xml-C33zriiW.js +1 -0
  326. package/dist-local/client/assets/xsl-BFS2wyMt.js +1 -0
  327. package/dist-local/client/assets/yaml-w0rMsuN4.js +1 -0
  328. package/dist-local/client/assets/zenscript-BnlCZFoB.js +1 -0
  329. package/dist-local/client/assets/zig-CMLA9XwU.js +1 -0
  330. package/dist-local/client/favicon-16x16.png +0 -0
  331. package/dist-local/client/favicon-32x32.png +0 -0
  332. package/dist-local/client/favicon.ico +0 -0
  333. package/dist-local/client/logo.png +0 -0
  334. package/dist-local/client/og.png +0 -0
  335. package/dist-local/client/og.svg +46 -0
  336. package/dist-local/client/robots.txt +4 -0
  337. package/dist-local/client/site.webmanifest +11 -0
  338. package/dist-local/client/sitemap.xml +13 -0
  339. package/dist-local/server/assets/__root-DimVnCpV.js +17 -0
  340. package/dist-local/server/assets/_tanstack-start-manifest_v-CNDxZb5c.js +56 -0
  341. package/dist-local/server/assets/auth-CtuIV0ur.js +40490 -0
  342. package/dist-local/server/assets/board._owner._repo-BgLMPzjG.js +832 -0
  343. package/dist-local/server/assets/board._owner._repo-BxCYRjn3.js +25 -0
  344. package/dist-local/server/assets/board._owner._repo-WPs_mhzX.js +128 -0
  345. package/dist-local/server/assets/bun-sqlite-dialect-BW9W1_Ps-C3nGW4Q3.js +163 -0
  346. package/dist-local/server/assets/core-RrmWoKne.js +5 -0
  347. package/dist-local/server/assets/createServerRpc-CpE5MlHa.js +12 -0
  348. package/dist-local/server/assets/d1-sqlite-dialect-BLC8LXE6-DXI0R5Oj.js +112 -0
  349. package/dist-local/server/assets/default-query-compiler-PEcjLdrv.js +1719 -0
  350. package/dist-local/server/assets/dist-CMO4nMbf.js +342 -0
  351. package/dist-local/server/assets/empty-plugin-adapters-CrnNP3b2.js +5 -0
  352. package/dist-local/server/assets/env-impl-DoaQIVbP.js +297 -0
  353. package/dist-local/server/assets/gemini-DkmTawm4.js +514 -0
  354. package/dist-local/server/assets/github-cUIlMgs7.js +251 -0
  355. package/dist-local/server/assets/guide--QQ0qbuz.js +534 -0
  356. package/dist-local/server/assets/guide-DZLtOn4o.js +49 -0
  357. package/dist-local/server/assets/kysely-adapter-RaEPPBf_.js +2 -0
  358. package/dist-local/server/assets/kysely-migration-tables-JkVUjPF_-DAJvukps.js +19 -0
  359. package/dist-local/server/assets/local-fs-BDgGK9ve.js +61 -0
  360. package/dist-local/server/assets/node-sqlite-dialect-COyVl62m.js +163 -0
  361. package/dist-local/server/assets/review-status-CdlhgE_Y.js +1501 -0
  362. package/dist-local/server/assets/reviews-BOK_eOYa.js +194 -0
  363. package/dist-local/server/assets/router-CaG3M3Zu.js +188 -0
  364. package/dist-local/server/assets/routes-BBbg2JyL.js +1036 -0
  365. package/dist-local/server/assets/routes-BlJSk7OV.js +27 -0
  366. package/dist-local/server/assets/skeleton-Cpl83ip3.js +93 -0
  367. package/dist-local/server/assets/start-BJllm2D8.js +4 -0
  368. package/dist-local/server/server.js +5778 -0
  369. package/package.json +62 -0
  370. package/server.mjs +160 -0
@@ -0,0 +1,1501 @@
1
+ import { a as isSafeUrlScheme, d as toKebabCase, i as defu, o as getBaseURL, r as createFetch, u as capitalizeFirstLetter } from "./auth-CtuIV0ur.js";
2
+ import { a as getGithubManageUrl, n as getAllRepos, s as cn } from "./skeleton-Cpl83ip3.js";
3
+ import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
4
+ import { Link, useNavigate } from "@tanstack/react-router";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { HugeiconsIcon } from "@hugeicons/react";
7
+ import { Cancel01Icon, CancelCircleIcon, CheckmarkCircle02Icon, DashboardSquare01Icon, DashedLineCircleIcon, HelpCircleIcon, MoreHorizontalIcon, Progress03Icon, SearchIcon, Tick02Icon, UserIcon } from "@hugeicons/core-free-icons";
8
+ import { Avatar } from "@base-ui/react/avatar";
9
+ import { Popover } from "@base-ui/react/popover";
10
+ import { Command } from "cmdk";
11
+ import { Dialog } from "@base-ui/react/dialog";
12
+ import { Button } from "@base-ui/react/button";
13
+ import { cva } from "class-variance-authority";
14
+ import { create } from "zustand";
15
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/parser.mjs
16
+ var PROTO_POLLUTION_PATTERNS = {
17
+ proto: /"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,
18
+ constructor: /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,
19
+ protoShort: /"__proto__"\s*:/,
20
+ constructorShort: /"constructor"\s*:/
21
+ };
22
+ var JSON_SIGNATURE = /^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;
23
+ var SPECIAL_VALUES = {
24
+ true: true,
25
+ false: false,
26
+ null: null,
27
+ undefined: void 0,
28
+ nan: NaN,
29
+ infinity: Number.POSITIVE_INFINITY,
30
+ "-infinity": Number.NEGATIVE_INFINITY
31
+ };
32
+ var ISO_DATE_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,7}))?(?:Z|([+-])(\d{2}):(\d{2}))$/;
33
+ function isValidDate(date) {
34
+ return date instanceof Date && !isNaN(date.getTime());
35
+ }
36
+ function parseISODate(value) {
37
+ const match = ISO_DATE_REGEX.exec(value);
38
+ if (!match) return null;
39
+ const [, year, month, day, hour, minute, second, ms, offsetSign, offsetHour, offsetMinute] = match;
40
+ const date = new Date(Date.UTC(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10), parseInt(hour, 10), parseInt(minute, 10), parseInt(second, 10), ms ? parseInt(ms.padEnd(3, "0"), 10) : 0));
41
+ if (offsetSign) {
42
+ const offset = (parseInt(offsetHour, 10) * 60 + parseInt(offsetMinute, 10)) * (offsetSign === "+" ? -1 : 1);
43
+ date.setUTCMinutes(date.getUTCMinutes() + offset);
44
+ }
45
+ return isValidDate(date) ? date : null;
46
+ }
47
+ function betterJSONParse(value, options = {}) {
48
+ const { strict = false, warnings = false, reviver, parseDates = true } = options;
49
+ if (typeof value !== "string") return value;
50
+ const trimmed = value.trim();
51
+ const lowerValue = trimmed.toLowerCase();
52
+ if (lowerValue.length <= 9 && lowerValue in SPECIAL_VALUES) return SPECIAL_VALUES[lowerValue];
53
+ if (!JSON_SIGNATURE.test(trimmed)) {
54
+ if (strict) throw new SyntaxError("[better-json] Invalid JSON");
55
+ return value;
56
+ }
57
+ if (Object.entries(PROTO_POLLUTION_PATTERNS).some(([key, pattern]) => {
58
+ const matches = pattern.test(trimmed);
59
+ if (matches && warnings) console.warn(`[better-json] Detected potential prototype pollution attempt using ${key} pattern`);
60
+ return matches;
61
+ }) && strict) throw new Error("[better-json] Potential prototype pollution attempt detected");
62
+ try {
63
+ const secureReviver = (key, value) => {
64
+ if (key === "__proto__" || key === "constructor" && value && typeof value === "object" && "prototype" in value) {
65
+ if (warnings) console.warn(`[better-json] Dropping "${key}" key to prevent prototype pollution`);
66
+ return;
67
+ }
68
+ if (parseDates && typeof value === "string") {
69
+ const date = parseISODate(value);
70
+ if (date) return date;
71
+ }
72
+ return reviver ? reviver(key, value) : value;
73
+ };
74
+ return JSON.parse(trimmed, secureReviver);
75
+ } catch (error) {
76
+ if (strict) throw error;
77
+ return value;
78
+ }
79
+ }
80
+ function parseJSON(value, options = { strict: true }) {
81
+ return betterJSONParse(value, options);
82
+ }
83
+ //#endregion
84
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/fetch-plugins.mjs
85
+ var redirectPlugin = {
86
+ id: "redirect",
87
+ name: "Redirect",
88
+ hooks: { onSuccess(context) {
89
+ if (context.data?.url && context.data?.redirect && isSafeUrlScheme(context.data.url)) {
90
+ if (typeof window !== "undefined" && window.location) {
91
+ if (window.location) try {
92
+ window.location.href = context.data.url;
93
+ } catch {}
94
+ }
95
+ }
96
+ } }
97
+ };
98
+ //#endregion
99
+ //#region ../../node_modules/.bun/nanostores@1.3.0/node_modules/nanostores/atom/index.js
100
+ var listenerQueue = [];
101
+ var lqIndex = 0;
102
+ var QUEUE_ITEMS_PER_LISTENER = 4;
103
+ var nanostoresGlobal = globalThis.nanostoresGlobal ||= { epoch: 0 };
104
+ var atom = /* @__NO_SIDE_EFFECTS__ */ (initialValue) => {
105
+ let listeners = [];
106
+ let $atom = {
107
+ get() {
108
+ if (!$atom.lc) $atom.listen(() => {})();
109
+ return $atom.value;
110
+ },
111
+ init: initialValue,
112
+ lc: 0,
113
+ listen(listener) {
114
+ $atom.lc = listeners.push(listener);
115
+ return () => {
116
+ for (let i = lqIndex + QUEUE_ITEMS_PER_LISTENER; i < listenerQueue.length;) if (listenerQueue[i] === listener) listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER);
117
+ else i += QUEUE_ITEMS_PER_LISTENER;
118
+ let index = listeners.indexOf(listener);
119
+ if (~index) {
120
+ listeners.splice(index, 1);
121
+ if (!--$atom.lc) $atom.off();
122
+ }
123
+ };
124
+ },
125
+ notify(oldValue, changedKey) {
126
+ nanostoresGlobal.epoch++;
127
+ let runListenerQueue = !listenerQueue.length;
128
+ for (let listener of listeners) listenerQueue.push(listener, $atom.value, oldValue, changedKey);
129
+ if (runListenerQueue) {
130
+ for (lqIndex = 0; lqIndex < listenerQueue.length; lqIndex += QUEUE_ITEMS_PER_LISTENER) listenerQueue[lqIndex](listenerQueue[lqIndex + 1], listenerQueue[lqIndex + 2], listenerQueue[lqIndex + 3]);
131
+ listenerQueue.length = 0;
132
+ }
133
+ },
134
+ off() {},
135
+ set(newValue) {
136
+ let oldValue = $atom.value;
137
+ if (oldValue !== newValue) {
138
+ $atom.value = newValue;
139
+ $atom.notify(oldValue);
140
+ }
141
+ },
142
+ subscribe(listener) {
143
+ let unbind = $atom.listen(listener);
144
+ listener($atom.value);
145
+ return unbind;
146
+ },
147
+ value: initialValue
148
+ };
149
+ return $atom;
150
+ };
151
+ //#endregion
152
+ //#region ../../node_modules/.bun/nanostores@1.3.0/node_modules/nanostores/lifecycle/index.js
153
+ var SET = 2;
154
+ var MOUNT = 5;
155
+ var UNMOUNT = 6;
156
+ var REVERT_MUTATION = 10;
157
+ var on = (object, listener, eventKey, mutateStore) => {
158
+ object.events = object.events || {};
159
+ if (!object.events[eventKey + REVERT_MUTATION]) object.events[eventKey + REVERT_MUTATION] = mutateStore((eventProps) => {
160
+ object.events[eventKey].reduceRight((event, l) => (l(event), event), {
161
+ shared: {},
162
+ ...eventProps
163
+ });
164
+ });
165
+ object.events[eventKey] = object.events[eventKey] || [];
166
+ object.events[eventKey].push(listener);
167
+ return () => {
168
+ let currentListeners = object.events[eventKey];
169
+ let index = currentListeners.indexOf(listener);
170
+ currentListeners.splice(index, 1);
171
+ if (!currentListeners.length) {
172
+ delete object.events[eventKey];
173
+ object.events[eventKey + REVERT_MUTATION]();
174
+ delete object.events[eventKey + REVERT_MUTATION];
175
+ }
176
+ };
177
+ };
178
+ var onSet = ($store, listener) => on($store, listener, SET, (runListeners) => {
179
+ let originSet = $store.set;
180
+ let originSetKey = $store.setKey;
181
+ if ($store.setKey) $store.setKey = (changed, changedValue) => {
182
+ let isAborted;
183
+ let abort = () => {
184
+ isAborted = true;
185
+ };
186
+ runListeners({
187
+ abort,
188
+ changed,
189
+ newValue: {
190
+ ...$store.value,
191
+ [changed]: changedValue
192
+ }
193
+ });
194
+ if (!isAborted) return originSetKey(changed, changedValue);
195
+ };
196
+ $store.set = (newValue) => {
197
+ let isAborted;
198
+ let abort = () => {
199
+ isAborted = true;
200
+ };
201
+ runListeners({
202
+ abort,
203
+ newValue
204
+ });
205
+ if (!isAborted) return originSet(newValue);
206
+ };
207
+ return () => {
208
+ $store.set = originSet;
209
+ $store.setKey = originSetKey;
210
+ };
211
+ });
212
+ var STORE_UNMOUNT_DELAY = 1e3;
213
+ var onMount = ($store, initialize) => {
214
+ let listener = (payload) => {
215
+ let destroy = initialize(payload);
216
+ if (destroy) $store.events[UNMOUNT].push(destroy);
217
+ };
218
+ return on($store, listener, MOUNT, (runListeners) => {
219
+ let originListen = $store.listen;
220
+ $store.listen = (...args) => {
221
+ if (!$store.lc && !$store.active) {
222
+ $store.active = true;
223
+ runListeners();
224
+ }
225
+ return originListen(...args);
226
+ };
227
+ let originOff = $store.off;
228
+ $store.events[UNMOUNT] = [];
229
+ $store.off = () => {
230
+ originOff();
231
+ setTimeout(() => {
232
+ if ($store.active && !$store.lc) {
233
+ $store.active = false;
234
+ for (let destroy of $store.events[UNMOUNT]) destroy();
235
+ $store.events[UNMOUNT] = [];
236
+ }
237
+ }, STORE_UNMOUNT_DELAY);
238
+ };
239
+ return () => {
240
+ $store.listen = originListen;
241
+ $store.off = originOff;
242
+ };
243
+ });
244
+ };
245
+ //#endregion
246
+ //#region ../../node_modules/.bun/nanostores@1.3.0/node_modules/nanostores/listen-keys/index.js
247
+ function listenKeys($store, keys, listener) {
248
+ let keysSet = new Set(keys).add(void 0);
249
+ return $store.listen((value, oldValue, changed) => {
250
+ if (keysSet.has(changed)) listener(value, oldValue, changed);
251
+ });
252
+ }
253
+ //#endregion
254
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/equality.mjs
255
+ function isPlainObject(value) {
256
+ if (typeof value !== "object" || value === null) return false;
257
+ const prototype = Object.getPrototypeOf(value);
258
+ return prototype === Object.prototype || prototype === null;
259
+ }
260
+ /**
261
+ * Deep structural equality for JSON-serializable values.
262
+ * Handles: primitives, null, arrays, and plain objects.
263
+ * Short-circuits on referential equality at every recursion level.
264
+ */
265
+ function isJsonEqual(a, b) {
266
+ if (a === b) return true;
267
+ if (Array.isArray(a) && Array.isArray(b)) {
268
+ if (a.length !== b.length) return false;
269
+ for (let i = 0; i < a.length; i++) if (!isJsonEqual(a[i], b[i])) return false;
270
+ return true;
271
+ }
272
+ if (isPlainObject(a) && isPlainObject(b)) {
273
+ const keysA = Object.keys(a);
274
+ const keysB = Object.keys(b);
275
+ if (keysA.length !== keysB.length) return false;
276
+ for (const key of keysA) if (!(key in b) || !isJsonEqual(a[key], b[key])) return false;
277
+ return true;
278
+ }
279
+ return false;
280
+ }
281
+ /**
282
+ * Attach an equality gate to a nanostores atom via `onSet`.
283
+ * When `isEqual(currentValue, newValue)` returns true, the `set()` call
284
+ * is aborted: no listeners fire, no framework re-renders occur.
285
+ *
286
+ * Returns the unsubscribe function from `onSet`.
287
+ */
288
+ function withEquality(store, isEqual) {
289
+ return onSet(store, ({ newValue, abort }) => {
290
+ if (isEqual(store.value, newValue)) abort();
291
+ });
292
+ }
293
+ //#endregion
294
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/broadcast-channel.mjs
295
+ var kBroadcastChannel = Symbol.for("better-auth:broadcast-channel");
296
+ var now$1 = () => Math.floor(Date.now() / 1e3);
297
+ var WindowBroadcastChannel = class {
298
+ listeners = /* @__PURE__ */ new Set();
299
+ name;
300
+ constructor(name = "better-auth.message") {
301
+ this.name = name;
302
+ }
303
+ subscribe(listener) {
304
+ this.listeners.add(listener);
305
+ return () => {
306
+ this.listeners.delete(listener);
307
+ };
308
+ }
309
+ post(message) {
310
+ if (typeof window === "undefined") return;
311
+ try {
312
+ localStorage.setItem(this.name, JSON.stringify({
313
+ ...message,
314
+ timestamp: now$1()
315
+ }));
316
+ } catch {}
317
+ }
318
+ setup() {
319
+ if (typeof window === "undefined" || typeof window.addEventListener === "undefined") return () => {};
320
+ const handler = (event) => {
321
+ if (event.key !== this.name) return;
322
+ const message = JSON.parse(event.newValue ?? "{}");
323
+ if (message?.event !== "session" || !message?.data) return;
324
+ this.listeners.forEach((listener) => listener(message));
325
+ };
326
+ window.addEventListener("storage", handler);
327
+ return () => {
328
+ window.removeEventListener("storage", handler);
329
+ };
330
+ }
331
+ };
332
+ function getGlobalBroadcastChannel(name = "better-auth.message") {
333
+ if (!globalThis[kBroadcastChannel]) globalThis[kBroadcastChannel] = new WindowBroadcastChannel(name);
334
+ return globalThis[kBroadcastChannel];
335
+ }
336
+ //#endregion
337
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/focus-manager.mjs
338
+ var kFocusManager = Symbol.for("better-auth:focus-manager");
339
+ var WindowFocusManager = class {
340
+ listeners = /* @__PURE__ */ new Set();
341
+ subscribe(listener) {
342
+ this.listeners.add(listener);
343
+ return () => {
344
+ this.listeners.delete(listener);
345
+ };
346
+ }
347
+ setFocused(focused) {
348
+ this.listeners.forEach((listener) => listener(focused));
349
+ }
350
+ setup() {
351
+ if (typeof window === "undefined" || typeof document === "undefined" || typeof window.addEventListener === "undefined") return () => {};
352
+ const visibilityHandler = () => {
353
+ if (document.visibilityState === "visible") this.setFocused(true);
354
+ };
355
+ document.addEventListener("visibilitychange", visibilityHandler, false);
356
+ return () => {
357
+ document.removeEventListener("visibilitychange", visibilityHandler, false);
358
+ };
359
+ }
360
+ };
361
+ function getGlobalFocusManager() {
362
+ if (!globalThis[kFocusManager]) globalThis[kFocusManager] = new WindowFocusManager();
363
+ return globalThis[kFocusManager];
364
+ }
365
+ //#endregion
366
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/online-manager.mjs
367
+ var kOnlineManager = Symbol.for("better-auth:online-manager");
368
+ var WindowOnlineManager = class {
369
+ listeners = /* @__PURE__ */ new Set();
370
+ isOnline = typeof navigator !== "undefined" ? navigator.onLine : true;
371
+ subscribe(listener) {
372
+ this.listeners.add(listener);
373
+ return () => {
374
+ this.listeners.delete(listener);
375
+ };
376
+ }
377
+ setOnline(online) {
378
+ this.isOnline = online;
379
+ this.listeners.forEach((listener) => listener(online));
380
+ }
381
+ setup() {
382
+ if (typeof window === "undefined" || typeof window.addEventListener === "undefined") return () => {};
383
+ const onOnline = () => this.setOnline(true);
384
+ const onOffline = () => this.setOnline(false);
385
+ window.addEventListener("online", onOnline, false);
386
+ window.addEventListener("offline", onOffline, false);
387
+ return () => {
388
+ window.removeEventListener("online", onOnline, false);
389
+ window.removeEventListener("offline", onOffline, false);
390
+ };
391
+ }
392
+ };
393
+ function getGlobalOnlineManager() {
394
+ if (!globalThis[kOnlineManager]) globalThis[kOnlineManager] = new WindowOnlineManager();
395
+ return globalThis[kOnlineManager];
396
+ }
397
+ //#endregion
398
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/session-refresh.mjs
399
+ var now = () => Math.floor(Date.now() / 1e3);
400
+ /**
401
+ * Rate limit: don't refetch on focus if a session request was made within this many seconds
402
+ */
403
+ var FOCUS_REFETCH_RATE_LIMIT_SECONDS = 5;
404
+ function createSessionRefreshManager(opts) {
405
+ const { fetchSession, shouldPollSession = () => true, sessionSignal, options = {} } = opts;
406
+ const refetchInterval = options.sessionOptions?.refetchInterval ?? 0;
407
+ const refetchOnWindowFocus = options.sessionOptions?.refetchOnWindowFocus ?? true;
408
+ const refetchWhenOffline = options.sessionOptions?.refetchWhenOffline ?? false;
409
+ const state = {
410
+ isInitialized: false,
411
+ lastSessionRequest: 0
412
+ };
413
+ const shouldRefetch = () => {
414
+ return refetchWhenOffline || getGlobalOnlineManager().isOnline;
415
+ };
416
+ const triggerRefetch = (event) => {
417
+ if (!shouldRefetch()) return;
418
+ if (event?.event === "storage") {
419
+ fetchSession();
420
+ return;
421
+ }
422
+ if (event?.event === "poll") {
423
+ state.lastSessionRequest = now();
424
+ fetchSession();
425
+ return;
426
+ }
427
+ if (event?.event === "visibilitychange") {
428
+ if (now() - state.lastSessionRequest < FOCUS_REFETCH_RATE_LIMIT_SECONDS) return;
429
+ state.lastSessionRequest = now();
430
+ fetchSession();
431
+ return;
432
+ }
433
+ fetchSession();
434
+ };
435
+ const broadcastSessionUpdate = (trigger) => {
436
+ getGlobalBroadcastChannel().post({
437
+ event: "session",
438
+ data: { trigger },
439
+ clientId: Math.random().toString(36).substring(7)
440
+ });
441
+ };
442
+ const setupPolling = () => {
443
+ if (refetchInterval && refetchInterval > 0) state.pollInterval = setInterval(() => {
444
+ if (shouldPollSession()) triggerRefetch({ event: "poll" });
445
+ }, refetchInterval * 1e3);
446
+ };
447
+ const setupBroadcast = () => {
448
+ state.unsubscribeBroadcast = getGlobalBroadcastChannel().subscribe(() => {
449
+ triggerRefetch({ event: "storage" });
450
+ });
451
+ };
452
+ const setupFocusRefetch = () => {
453
+ if (!refetchOnWindowFocus) return;
454
+ state.unsubscribeFocus = getGlobalFocusManager().subscribe(() => {
455
+ triggerRefetch({ event: "visibilitychange" });
456
+ });
457
+ };
458
+ const setupOnlineRefetch = () => {
459
+ state.unsubscribeOnline = getGlobalOnlineManager().subscribe((online) => {
460
+ if (online) triggerRefetch({ event: "visibilitychange" });
461
+ });
462
+ };
463
+ const setupSignalSubscription = () => {
464
+ state.unsubscribeSignal = sessionSignal.listen(() => {
465
+ fetchSession();
466
+ });
467
+ };
468
+ const init = () => {
469
+ if (state.isInitialized) return;
470
+ state.isInitialized = true;
471
+ setupPolling();
472
+ setupBroadcast();
473
+ setupFocusRefetch();
474
+ setupOnlineRefetch();
475
+ setupSignalSubscription();
476
+ state.cleanupBroadcastSetup = getGlobalBroadcastChannel().setup();
477
+ state.cleanupFocusSetup = getGlobalFocusManager().setup();
478
+ state.cleanupOnlineSetup = getGlobalOnlineManager().setup();
479
+ };
480
+ const cleanup = () => {
481
+ if (!state.isInitialized) return;
482
+ if (state.pollInterval) {
483
+ clearInterval(state.pollInterval);
484
+ state.pollInterval = void 0;
485
+ }
486
+ if (state.unsubscribeBroadcast) {
487
+ state.unsubscribeBroadcast();
488
+ state.unsubscribeBroadcast = void 0;
489
+ }
490
+ if (state.unsubscribeFocus) {
491
+ state.unsubscribeFocus();
492
+ state.unsubscribeFocus = void 0;
493
+ }
494
+ if (state.unsubscribeOnline) {
495
+ state.unsubscribeOnline();
496
+ state.unsubscribeOnline = void 0;
497
+ }
498
+ if (state.unsubscribeSignal) {
499
+ state.unsubscribeSignal();
500
+ state.unsubscribeSignal = void 0;
501
+ }
502
+ if (state.cleanupBroadcastSetup) {
503
+ state.cleanupBroadcastSetup();
504
+ state.cleanupBroadcastSetup = void 0;
505
+ }
506
+ if (state.cleanupFocusSetup) {
507
+ state.cleanupFocusSetup();
508
+ state.cleanupFocusSetup = void 0;
509
+ }
510
+ if (state.cleanupOnlineSetup) {
511
+ state.cleanupOnlineSetup();
512
+ state.cleanupOnlineSetup = void 0;
513
+ }
514
+ state.isInitialized = false;
515
+ state.lastSessionRequest = 0;
516
+ };
517
+ return {
518
+ init,
519
+ cleanup,
520
+ triggerRefetch,
521
+ broadcastSessionUpdate
522
+ };
523
+ }
524
+ //#endregion
525
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/session-atom.mjs
526
+ var isServer = () => typeof window === "undefined";
527
+ /**
528
+ * Normalize $fetch response: `throw: true` returns data directly,
529
+ * otherwise `{ data, error }`.
530
+ */
531
+ function normalizeSessionResponse(res) {
532
+ if (typeof res === "object" && res !== null && "data" in res && "error" in res) return res;
533
+ return {
534
+ data: res,
535
+ error: null
536
+ };
537
+ }
538
+ function normalizeSessionData(data) {
539
+ if (!data) return null;
540
+ if (data.session === null && data.user === null) return null;
541
+ return data;
542
+ }
543
+ function isSessionAtomEqual(a, b) {
544
+ return isJsonEqual(a.data, b.data) && a.error === b.error && a.isPending === b.isPending && a.isRefetching === b.isRefetching && a.refetch === b.refetch;
545
+ }
546
+ function getSessionAtom($fetch, options) {
547
+ const $signal = /* @__PURE__ */ atom(false);
548
+ let abortController;
549
+ const refetch = (queryParams) => fetchSession(queryParams);
550
+ const session = /* @__PURE__ */ atom({
551
+ data: null,
552
+ error: null,
553
+ isPending: true,
554
+ isRefetching: false,
555
+ refetch
556
+ });
557
+ withEquality(session, isSessionAtomEqual);
558
+ const settleAbortedFetch = (controller) => {
559
+ if (abortController !== controller) return;
560
+ const current = session.get();
561
+ abortController = void 0;
562
+ if (!current.isPending && !current.isRefetching) return;
563
+ session.set({
564
+ ...current,
565
+ isPending: false,
566
+ isRefetching: false,
567
+ refetch
568
+ });
569
+ };
570
+ const fetchSession = async (queryParams) => {
571
+ abortController?.abort();
572
+ const controller = new AbortController();
573
+ abortController = controller;
574
+ const current = session.get();
575
+ session.set({
576
+ ...current,
577
+ isPending: current.data === null,
578
+ isRefetching: true,
579
+ error: null,
580
+ refetch
581
+ });
582
+ try {
583
+ const res = await $fetch("/get-session", {
584
+ method: "GET",
585
+ query: queryParams?.query,
586
+ signal: controller.signal
587
+ });
588
+ if (controller.signal.aborted) {
589
+ settleAbortedFetch(controller);
590
+ return;
591
+ }
592
+ let { data, error } = normalizeSessionResponse(res);
593
+ if (data?.needsRefresh) try {
594
+ const refreshRes = await $fetch("/get-session", {
595
+ method: "POST",
596
+ signal: controller.signal
597
+ });
598
+ if (controller.signal.aborted) {
599
+ settleAbortedFetch(controller);
600
+ return;
601
+ }
602
+ ({data, error} = normalizeSessionResponse(refreshRes));
603
+ } catch {
604
+ if (controller.signal.aborted) {
605
+ settleAbortedFetch(controller);
606
+ return;
607
+ }
608
+ }
609
+ if (error) {
610
+ const latest = session.get();
611
+ const isUnauthorized = error?.status === 401;
612
+ session.set({
613
+ data: isUnauthorized ? null : latest.data,
614
+ error,
615
+ isPending: false,
616
+ isRefetching: false,
617
+ refetch
618
+ });
619
+ return;
620
+ }
621
+ const sessionData = normalizeSessionData(data);
622
+ const current = session.get();
623
+ const stableData = current.data != null && sessionData != null && isJsonEqual(current.data, sessionData) ? current.data : sessionData;
624
+ session.set({
625
+ data: stableData,
626
+ error: null,
627
+ isPending: false,
628
+ isRefetching: false,
629
+ refetch
630
+ });
631
+ } catch (fetchError) {
632
+ if (controller.signal.aborted) {
633
+ settleAbortedFetch(controller);
634
+ return;
635
+ }
636
+ const latest = session.get();
637
+ session.set({
638
+ data: latest.data,
639
+ error: fetchError,
640
+ isPending: false,
641
+ isRefetching: false,
642
+ refetch
643
+ });
644
+ }
645
+ };
646
+ let broadcastSessionUpdate = () => {};
647
+ onMount(session, () => {
648
+ let timeoutId;
649
+ if (!isServer()) timeoutId = setTimeout(() => {
650
+ fetchSession();
651
+ }, 0);
652
+ const refreshManager = createSessionRefreshManager({
653
+ fetchSession,
654
+ shouldPollSession: () => session.get().data != null,
655
+ sessionSignal: $signal,
656
+ options
657
+ });
658
+ refreshManager.init();
659
+ broadcastSessionUpdate = refreshManager.broadcastSessionUpdate;
660
+ return () => {
661
+ if (timeoutId) clearTimeout(timeoutId);
662
+ const controller = abortController;
663
+ controller?.abort();
664
+ if (controller) settleAbortedFetch(controller);
665
+ refreshManager.cleanup();
666
+ };
667
+ });
668
+ return {
669
+ session,
670
+ $sessionSignal: $signal,
671
+ broadcastSessionUpdate: (trigger) => broadcastSessionUpdate(trigger)
672
+ };
673
+ }
674
+ //#endregion
675
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/config.mjs
676
+ var resolvePublicAuthUrl = (basePath) => {
677
+ if (typeof process === "undefined") return void 0;
678
+ const path = basePath ?? "/api/auth";
679
+ if (process.env.NEXT_PUBLIC_AUTH_URL) return process.env.NEXT_PUBLIC_AUTH_URL;
680
+ if (typeof window === "undefined") {
681
+ if (process.env.NEXTAUTH_URL) try {
682
+ return process.env.NEXTAUTH_URL;
683
+ } catch {}
684
+ if (process.env.VERCEL_URL) try {
685
+ const protocol = process.env.VERCEL_URL.startsWith("http") ? "" : "https://";
686
+ return `${new URL(`${protocol}${process.env.VERCEL_URL}`).origin}${path}`;
687
+ } catch {}
688
+ }
689
+ };
690
+ var getClientConfig = (options, loadEnv) => {
691
+ const isCredentialsSupported = "credentials" in Request.prototype;
692
+ const baseURL = getBaseURL(options?.baseURL, options?.basePath, void 0, loadEnv) ?? resolvePublicAuthUrl(options?.basePath) ?? "/api/auth";
693
+ const pluginsFetchPlugins = options?.plugins?.flatMap((plugin) => plugin.fetchPlugins).filter((pl) => pl !== void 0) || [];
694
+ const lifeCyclePlugin = {
695
+ id: "lifecycle-hooks",
696
+ name: "lifecycle-hooks",
697
+ hooks: {
698
+ onSuccess: options?.fetchOptions?.onSuccess,
699
+ onError: options?.fetchOptions?.onError,
700
+ onRequest: options?.fetchOptions?.onRequest,
701
+ onResponse: options?.fetchOptions?.onResponse
702
+ }
703
+ };
704
+ const { onSuccess: _onSuccess, onError: _onError, onRequest: _onRequest, onResponse: _onResponse, ...restOfFetchOptions } = options?.fetchOptions || {};
705
+ const $fetch = createFetch({
706
+ baseURL,
707
+ ...isCredentialsSupported ? { credentials: "include" } : {},
708
+ method: "GET",
709
+ jsonParser(text) {
710
+ if (!text) return null;
711
+ return parseJSON(text, { strict: false });
712
+ },
713
+ customFetchImpl: fetch,
714
+ ...restOfFetchOptions,
715
+ plugins: [
716
+ lifeCyclePlugin,
717
+ ...restOfFetchOptions.plugins || [],
718
+ ...options?.disableDefaultFetchPlugins ? [] : [redirectPlugin],
719
+ ...pluginsFetchPlugins
720
+ ]
721
+ });
722
+ const { $sessionSignal, session, broadcastSessionUpdate } = getSessionAtom($fetch, options);
723
+ const plugins = options?.plugins || [];
724
+ let pluginsActions = {};
725
+ const pluginsAtoms = {
726
+ $sessionSignal,
727
+ session
728
+ };
729
+ const pluginPathMethods = {
730
+ "/sign-out": "POST",
731
+ "/revoke-sessions": "POST",
732
+ "/revoke-other-sessions": "POST",
733
+ "/delete-user": "POST"
734
+ };
735
+ const atomListeners = [{
736
+ signal: "$sessionSignal",
737
+ matcher(path) {
738
+ return path === "/sign-out" || path === "/update-user" || path === "/update-session" || path === "/sign-up/email" || path === "/sign-in/email" || path === "/delete-user" || path === "/verify-email" || path === "/revoke-sessions" || path === "/revoke-session" || path === "/revoke-other-sessions" || path === "/change-email" || path === "/change-password";
739
+ },
740
+ callback(path) {
741
+ if (path === "/sign-out") broadcastSessionUpdate("signout");
742
+ else if (path === "/update-user" || path === "/update-session") broadcastSessionUpdate("updateUser");
743
+ }
744
+ }];
745
+ for (const plugin of plugins) {
746
+ if (plugin.getAtoms) Object.assign(pluginsAtoms, plugin.getAtoms?.($fetch));
747
+ if (plugin.pathMethods) Object.assign(pluginPathMethods, plugin.pathMethods);
748
+ if (plugin.atomListeners) atomListeners.push(...plugin.atomListeners);
749
+ }
750
+ const $store = {
751
+ notify: (signal) => {
752
+ pluginsAtoms[signal].set(!pluginsAtoms[signal].get());
753
+ },
754
+ listen: (signal, listener) => {
755
+ pluginsAtoms[signal].subscribe(listener);
756
+ },
757
+ atoms: pluginsAtoms
758
+ };
759
+ for (const plugin of plugins) if (plugin.getActions) pluginsActions = defu(plugin.getActions?.($fetch, $store, options) ?? {}, pluginsActions);
760
+ return {
761
+ get baseURL() {
762
+ return baseURL;
763
+ },
764
+ pluginsActions,
765
+ pluginsAtoms,
766
+ pluginPathMethods,
767
+ atomListeners,
768
+ $fetch,
769
+ $store
770
+ };
771
+ };
772
+ //#endregion
773
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/utils/is-atom.mjs
774
+ function isAtom(value) {
775
+ return typeof value === "object" && value !== null && "get" in value && typeof value.get === "function" && "lc" in value && typeof value.lc === "number";
776
+ }
777
+ //#endregion
778
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/proxy.mjs
779
+ function getMethod(path, knownPathMethods, args) {
780
+ const method = knownPathMethods[path];
781
+ const { fetchOptions, query: _query, ...body } = args || {};
782
+ if (method) return method;
783
+ if (fetchOptions?.method) return fetchOptions.method;
784
+ if (body && Object.keys(body).length > 0) return "POST";
785
+ return "GET";
786
+ }
787
+ function createDynamicPathProxy(routes, client, knownPathMethods, atoms, atomListeners) {
788
+ function createProxy(path = []) {
789
+ return new Proxy(function() {}, {
790
+ get(_, prop) {
791
+ if (typeof prop !== "string") return;
792
+ if (prop === "then" || prop === "catch" || prop === "finally") return;
793
+ const fullPath = [...path, prop];
794
+ let current = routes;
795
+ for (const segment of fullPath) if (current && typeof current === "object" && segment in current) current = current[segment];
796
+ else {
797
+ current = void 0;
798
+ break;
799
+ }
800
+ if (typeof current === "function") return current;
801
+ if (isAtom(current)) return current;
802
+ return createProxy(fullPath);
803
+ },
804
+ apply: async (_, __, args) => {
805
+ const routePath = "/" + path.map(toKebabCase).join("/");
806
+ const arg = args[0] || {};
807
+ const fetchOptions = args[1] || {};
808
+ const { query, fetchOptions: argFetchOptions, ...body } = arg;
809
+ const options = {
810
+ ...fetchOptions,
811
+ ...argFetchOptions
812
+ };
813
+ const method = getMethod(routePath, knownPathMethods, arg);
814
+ return await client(routePath, {
815
+ ...options,
816
+ body: method === "GET" ? void 0 : {
817
+ ...body,
818
+ ...options?.body || {}
819
+ },
820
+ query: query || options?.query,
821
+ method,
822
+ async onSuccess(context) {
823
+ await options?.onSuccess?.(context);
824
+ if (!atomListeners || options.disableSignal) return;
825
+ /**
826
+ * We trigger listeners
827
+ */
828
+ const matches = atomListeners.filter((s) => s.matcher(routePath));
829
+ if (!matches.length) return;
830
+ const visited = /* @__PURE__ */ new Set();
831
+ for (const match of matches) {
832
+ const signal = atoms[match.signal];
833
+ if (!signal) return;
834
+ if (visited.has(match.signal)) continue;
835
+ visited.add(match.signal);
836
+ /**
837
+ * To avoid race conditions we set the signal in a setTimeout
838
+ */
839
+ const val = signal.get();
840
+ setTimeout(() => {
841
+ signal.set(!val);
842
+ }, 10);
843
+ match.callback?.(routePath);
844
+ }
845
+ }
846
+ });
847
+ }
848
+ });
849
+ }
850
+ return createProxy();
851
+ }
852
+ //#endregion
853
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/react/react-store.mjs
854
+ /**
855
+ * Subscribe to store changes and get store's value.
856
+ *
857
+ * Can be used with store builder too.
858
+ *
859
+ * ```js
860
+ * import { useStore } from 'nanostores/react'
861
+ *
862
+ * import { router } from '../store/router'
863
+ *
864
+ * export const Layout = () => {
865
+ * let page = useStore(router)
866
+ * if (page.route === 'home') {
867
+ * return <HomePage />
868
+ * } else {
869
+ * return <Error404 />
870
+ * }
871
+ * }
872
+ * ```
873
+ *
874
+ * @param store Store instance.
875
+ * @returns Store value.
876
+ */
877
+ function useStore(store, options = {}) {
878
+ const snapshotRef = useRef(store.get());
879
+ const { keys, deps = [store, keys] } = options;
880
+ const subscribe = useCallback((onChange) => {
881
+ const emitChange = (value) => {
882
+ if (snapshotRef.current === value) return;
883
+ snapshotRef.current = value;
884
+ onChange();
885
+ };
886
+ emitChange(store.value);
887
+ if (keys?.length) return listenKeys(store, keys, emitChange);
888
+ return store.listen(emitChange);
889
+ }, deps);
890
+ const get = () => snapshotRef.current;
891
+ return useSyncExternalStore(subscribe, get, get);
892
+ }
893
+ //#endregion
894
+ //#region ../../node_modules/.bun/better-auth@1.6.20+db6c6fda9fb5e20e/node_modules/better-auth/dist/client/react/index.mjs
895
+ function getAtomKey(str) {
896
+ return `use${capitalizeFirstLetter(str)}`;
897
+ }
898
+ function createAuthClient(options) {
899
+ const { pluginPathMethods, pluginsActions, pluginsAtoms, $fetch, $store, atomListeners } = getClientConfig(options);
900
+ const resolvedHooks = {};
901
+ for (const [key, value] of Object.entries(pluginsAtoms)) resolvedHooks[getAtomKey(key)] = () => useStore(value);
902
+ return createDynamicPathProxy({
903
+ ...pluginsActions,
904
+ ...resolvedHooks,
905
+ $fetch,
906
+ $store
907
+ }, $fetch, pluginPathMethods, pluginsAtoms, atomListeners);
908
+ }
909
+ var { signIn, signOut, useSession } = createAuthClient();
910
+ //#endregion
911
+ //#region ../../packages/shared/src/components/ui/avatar.tsx
912
+ function Avatar$1({ className, size = "default", ...props }) {
913
+ return /* @__PURE__ */ jsx(Avatar.Root, {
914
+ "data-slot": "avatar",
915
+ "data-size": size,
916
+ className: cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten", className),
917
+ ...props
918
+ });
919
+ }
920
+ function AvatarImage({ className, ...props }) {
921
+ return /* @__PURE__ */ jsx(Avatar.Image, {
922
+ "data-slot": "avatar-image",
923
+ className: cn("aspect-square size-full rounded-full object-cover", className),
924
+ ...props
925
+ });
926
+ }
927
+ function AvatarFallback({ className, ...props }) {
928
+ return /* @__PURE__ */ jsx(Avatar.Fallback, {
929
+ "data-slot": "avatar-fallback",
930
+ className: cn("flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs", className),
931
+ ...props
932
+ });
933
+ }
934
+ //#endregion
935
+ //#region ../../packages/shared/src/components/ui/popover.tsx
936
+ function Popover$1({ ...props }) {
937
+ return /* @__PURE__ */ jsx(Popover.Root, {
938
+ "data-slot": "popover",
939
+ ...props
940
+ });
941
+ }
942
+ function PopoverTrigger({ ...props }) {
943
+ return /* @__PURE__ */ jsx(Popover.Trigger, {
944
+ "data-slot": "popover-trigger",
945
+ ...props
946
+ });
947
+ }
948
+ function PopoverContent({ className, align = "center", alignOffset = 0, side = "bottom", sideOffset = 4, ...props }) {
949
+ return /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Positioner, {
950
+ align,
951
+ alignOffset,
952
+ side,
953
+ sideOffset,
954
+ className: "isolate z-50",
955
+ children: /* @__PURE__ */ jsx(Popover.Popup, {
956
+ "data-slot": "popover-content",
957
+ className: cn("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-3xl bg-popover p-4 text-sm text-popover-foreground shadow-lg ring-1 ring-foreground/5 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
958
+ ...props
959
+ })
960
+ }) });
961
+ }
962
+ //#endregion
963
+ //#region ../../packages/shared/src/components/ui/button.tsx
964
+ var buttonVariants = cva("group/button inline-flex shrink-0 items-center justify-center rounded-2xl border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
965
+ variants: {
966
+ variant: {
967
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
968
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:bg-transparent dark:hover:bg-input/30",
969
+ secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
970
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
971
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
972
+ link: "text-primary underline-offset-4 hover:underline"
973
+ },
974
+ size: {
975
+ default: "h-8 gap-1.5 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5",
976
+ xs: "h-6 gap-1 px-2.5 text-xs has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3",
977
+ sm: "h-7 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
978
+ lg: "h-9 gap-1.5 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
979
+ icon: "size-8",
980
+ "icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3",
981
+ "icon-sm": "size-7",
982
+ "icon-lg": "size-9"
983
+ }
984
+ },
985
+ defaultVariants: {
986
+ variant: "default",
987
+ size: "default"
988
+ }
989
+ });
990
+ function Button$1({ className, variant = "default", size = "default", ...props }) {
991
+ return /* @__PURE__ */ jsx(Button, {
992
+ "data-slot": "button",
993
+ className: cn(buttonVariants({
994
+ variant,
995
+ size,
996
+ className
997
+ })),
998
+ ...props
999
+ });
1000
+ }
1001
+ //#endregion
1002
+ //#region ../../packages/shared/src/components/ui/dialog.tsx
1003
+ function Dialog$1({ ...props }) {
1004
+ return /* @__PURE__ */ jsx(Dialog.Root, {
1005
+ "data-slot": "dialog",
1006
+ ...props
1007
+ });
1008
+ }
1009
+ function DialogPortal({ ...props }) {
1010
+ return /* @__PURE__ */ jsx(Dialog.Portal, {
1011
+ "data-slot": "dialog-portal",
1012
+ ...props
1013
+ });
1014
+ }
1015
+ function DialogOverlay({ className, ...props }) {
1016
+ return /* @__PURE__ */ jsx(Dialog.Backdrop, {
1017
+ "data-slot": "dialog-overlay",
1018
+ className: cn("fixed inset-0 isolate z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", className),
1019
+ ...props
1020
+ });
1021
+ }
1022
+ function DialogContent({ className, children, showCloseButton = true, ...props }) {
1023
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(Dialog.Popup, {
1024
+ "data-slot": "dialog-content",
1025
+ className: cn("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-[min(var(--radius-4xl),24px)] bg-popover p-6 text-sm text-popover-foreground shadow-xl ring-1 ring-foreground/5 duration-100 outline-none sm:max-w-md dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
1026
+ ...props,
1027
+ children: [children, showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, {
1028
+ "data-slot": "dialog-close",
1029
+ render: /* @__PURE__ */ jsx(Button$1, {
1030
+ variant: "ghost",
1031
+ className: "absolute top-4 right-4 bg-secondary",
1032
+ size: "icon-sm"
1033
+ }),
1034
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
1035
+ icon: Cancel01Icon,
1036
+ strokeWidth: 2
1037
+ }), /* @__PURE__ */ jsx("span", {
1038
+ className: "sr-only",
1039
+ children: "Close"
1040
+ })]
1041
+ })]
1042
+ })] });
1043
+ }
1044
+ function DialogHeader({ className, ...props }) {
1045
+ return /* @__PURE__ */ jsx("div", {
1046
+ "data-slot": "dialog-header",
1047
+ className: cn("flex flex-col gap-1.5", className),
1048
+ ...props
1049
+ });
1050
+ }
1051
+ function DialogTitle({ className, ...props }) {
1052
+ return /* @__PURE__ */ jsx(Dialog.Title, {
1053
+ "data-slot": "dialog-title",
1054
+ className: cn("font-heading text-base leading-none font-medium", className),
1055
+ ...props
1056
+ });
1057
+ }
1058
+ function DialogDescription({ className, ...props }) {
1059
+ return /* @__PURE__ */ jsx(Dialog.Description, {
1060
+ "data-slot": "dialog-description",
1061
+ className: cn("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className),
1062
+ ...props
1063
+ });
1064
+ }
1065
+ //#endregion
1066
+ //#region ../../packages/shared/src/components/ui/input-group.tsx
1067
+ function InputGroup({ className, ...props }) {
1068
+ return /* @__PURE__ */ jsx("div", {
1069
+ "data-slot": "input-group",
1070
+ role: "group",
1071
+ className: cn("group/input-group relative flex h-8 w-full min-w-0 items-center rounded-2xl border border-transparent bg-input/50 transition-[color,box-shadow] duration-200 outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/30 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", className),
1072
+ ...props
1073
+ });
1074
+ }
1075
+ var inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 **:data-[slot=kbd]:rounded-2xl **:data-[slot=kbd]:bg-muted-foreground/10 **:data-[slot=kbd]:px-1.5 [&>svg:not([class*='size-'])]:size-4", {
1076
+ variants: { align: {
1077
+ "inline-start": "order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]",
1078
+ "inline-end": "order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]",
1079
+ "block-start": "order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2",
1080
+ "block-end": "order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"
1081
+ } },
1082
+ defaultVariants: { align: "inline-start" }
1083
+ });
1084
+ function InputGroupAddon({ className, align = "inline-start", ...props }) {
1085
+ return /* @__PURE__ */ jsx("div", {
1086
+ role: "group",
1087
+ "data-slot": "input-group-addon",
1088
+ "data-align": align,
1089
+ className: cn(inputGroupAddonVariants({ align }), className),
1090
+ onClick: (e) => {
1091
+ if (e.target.closest("button")) return;
1092
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
1093
+ },
1094
+ ...props
1095
+ });
1096
+ }
1097
+ cva("flex items-center gap-2 rounded-2xl text-sm shadow-none", {
1098
+ variants: { size: {
1099
+ xs: "h-6 gap-1 rounded-xl px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
1100
+ sm: "",
1101
+ "icon-xs": "size-6 rounded-xl p-0 has-[>svg]:p-0",
1102
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0"
1103
+ } },
1104
+ defaultVariants: { size: "xs" }
1105
+ });
1106
+ //#endregion
1107
+ //#region ../../packages/shared/src/components/ui/command.tsx
1108
+ function Command$1({ className, ...props }) {
1109
+ return /* @__PURE__ */ jsx(Command, {
1110
+ "data-slot": "command",
1111
+ className: cn("flex size-full flex-col overflow-hidden rounded-3xl bg-popover p-1 text-popover-foreground", className),
1112
+ ...props
1113
+ });
1114
+ }
1115
+ function CommandInput({ className, ...props }) {
1116
+ return /* @__PURE__ */ jsx("div", {
1117
+ "data-slot": "command-input-wrapper",
1118
+ className: "p-1 pb-0",
1119
+ children: /* @__PURE__ */ jsxs(InputGroup, {
1120
+ className: "h-8! bg-input/50",
1121
+ children: [/* @__PURE__ */ jsx(Command.Input, {
1122
+ "data-slot": "command-input",
1123
+ className: cn("w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className),
1124
+ ...props
1125
+ }), /* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx(HugeiconsIcon, {
1126
+ icon: SearchIcon,
1127
+ strokeWidth: 2,
1128
+ className: "size-4 shrink-0 opacity-50"
1129
+ }) })]
1130
+ })
1131
+ });
1132
+ }
1133
+ function CommandList({ className, ...props }) {
1134
+ return /* @__PURE__ */ jsx(Command.List, {
1135
+ "data-slot": "command-list",
1136
+ className: cn("no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none", className),
1137
+ ...props
1138
+ });
1139
+ }
1140
+ function CommandEmpty({ className, ...props }) {
1141
+ return /* @__PURE__ */ jsx(Command.Empty, {
1142
+ "data-slot": "command-empty",
1143
+ className: cn("py-6 text-center text-sm", className),
1144
+ ...props
1145
+ });
1146
+ }
1147
+ function CommandGroup({ className, ...props }) {
1148
+ return /* @__PURE__ */ jsx(Command.Group, {
1149
+ "data-slot": "command-group",
1150
+ className: cn("overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground", className),
1151
+ ...props
1152
+ });
1153
+ }
1154
+ function CommandItem({ className, children, ...props }) {
1155
+ return /* @__PURE__ */ jsxs(Command.Item, {
1156
+ "data-slot": "command-item",
1157
+ className: cn("group/command-item relative flex min-h-7 cursor-default items-center gap-2 rounded-xl px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-2xl data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground", className),
1158
+ ...props,
1159
+ children: [children, /* @__PURE__ */ jsx(HugeiconsIcon, {
1160
+ icon: Tick02Icon,
1161
+ strokeWidth: 2,
1162
+ className: "ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100"
1163
+ })]
1164
+ });
1165
+ }
1166
+ //#endregion
1167
+ //#region ../../packages/shared/src/stores/repo-store.ts
1168
+ var useRepoStore = create((set, get) => ({
1169
+ repos: null,
1170
+ loading: false,
1171
+ ensureLoaded: () => {
1172
+ if (get().repos || get().loading) return;
1173
+ set({ loading: true });
1174
+ getAllRepos().then((repos) => set({
1175
+ repos,
1176
+ loading: false
1177
+ })).catch(() => set({ loading: false }));
1178
+ }
1179
+ }));
1180
+ //#endregion
1181
+ //#region ../../packages/shared/src/components/repo-switcher.tsx
1182
+ var FALLBACK_MANAGE_URL = "https://github.com/settings/applications";
1183
+ /** How many repos to show in the switcher before the user searches. */
1184
+ var SWITCHER_PREVIEW = 10;
1185
+ function RepoSwitcher({ active, className }) {
1186
+ useNavigate();
1187
+ const [open, setOpen] = useState(false);
1188
+ const [manageUrl, setManageUrl] = useState(null);
1189
+ const [query, setQuery] = useState("");
1190
+ const { repos: allRepos, loading, ensureLoaded } = useRepoStore();
1191
+ const trimmed = query.trim().toLowerCase();
1192
+ useMemo(() => {
1193
+ if (!allRepos) return [];
1194
+ if (!trimmed) return allRepos.slice(0, SWITCHER_PREVIEW);
1195
+ return allRepos.filter((r) => r.fullName.toLowerCase().includes(trimmed) || (r.description?.toLowerCase().includes(trimmed) ?? false));
1196
+ }, [trimmed, allRepos]);
1197
+ useEffect(() => {
1198
+ if (!open) return;
1199
+ ensureLoaded();
1200
+ if (!manageUrl) getGithubManageUrl().then((url) => setManageUrl(url ?? FALLBACK_MANAGE_URL)).catch(() => setManageUrl(FALLBACK_MANAGE_URL));
1201
+ }, [
1202
+ open,
1203
+ manageUrl,
1204
+ ensureLoaded
1205
+ ]);
1206
+ useEffect(() => {
1207
+ if (!open) setQuery("");
1208
+ }, [open]);
1209
+ useEffect(() => {
1210
+ function onKey(e) {
1211
+ const tag = document.activeElement?.tagName;
1212
+ if (e.key === "/" && tag !== "INPUT" && tag !== "TEXTAREA") {
1213
+ e.preventDefault();
1214
+ setOpen(true);
1215
+ }
1216
+ }
1217
+ window.addEventListener("keydown", onKey);
1218
+ return () => window.removeEventListener("keydown", onKey);
1219
+ }, []);
1220
+ return /* @__PURE__ */ jsxs("div", {
1221
+ className: cn("flex items-center gap-2 rounded-lg px-1.5 py-1.5 text-left", className),
1222
+ children: [/* @__PURE__ */ jsx("img", {
1223
+ src: "/logo.png",
1224
+ alt: "Lanework",
1225
+ className: "size-7 shrink-0 rounded-lg"
1226
+ }), /* @__PURE__ */ jsxs("span", {
1227
+ className: "min-w-0 flex-1",
1228
+ children: [/* @__PURE__ */ jsx("span", {
1229
+ className: "block truncate text-[15px] font-semibold leading-tight",
1230
+ children: active?.repo ?? "Local"
1231
+ }), /* @__PURE__ */ jsx("span", {
1232
+ className: "block truncate text-xs text-muted-foreground",
1233
+ children: active?.owner ?? "local"
1234
+ })]
1235
+ })]
1236
+ });
1237
+ }
1238
+ //#endregion
1239
+ //#region ../../packages/shared/src/lib/tag-color.ts
1240
+ var DOT = [
1241
+ "bg-rose-500",
1242
+ "bg-orange-500",
1243
+ "bg-amber-500",
1244
+ "bg-emerald-500",
1245
+ "bg-teal-500",
1246
+ "bg-sky-500",
1247
+ "bg-blue-500",
1248
+ "bg-violet-500",
1249
+ "bg-fuchsia-500",
1250
+ "bg-pink-500"
1251
+ ];
1252
+ var PILL = [
1253
+ "bg-rose-100 text-rose-700 dark:bg-rose-950/60 dark:text-rose-300",
1254
+ "bg-orange-100 text-orange-700 dark:bg-orange-950/60 dark:text-orange-300",
1255
+ "bg-amber-100 text-amber-700 dark:bg-amber-950/60 dark:text-amber-300",
1256
+ "bg-emerald-100 text-emerald-700 dark:bg-emerald-950/60 dark:text-emerald-300",
1257
+ "bg-teal-100 text-teal-700 dark:bg-teal-950/60 dark:text-teal-300",
1258
+ "bg-sky-100 text-sky-700 dark:bg-sky-950/60 dark:text-sky-300",
1259
+ "bg-blue-100 text-blue-700 dark:bg-blue-950/60 dark:text-blue-300",
1260
+ "bg-violet-100 text-violet-700 dark:bg-violet-950/60 dark:text-violet-300",
1261
+ "bg-fuchsia-100 text-fuchsia-700 dark:bg-fuchsia-950/60 dark:text-fuchsia-300",
1262
+ "bg-pink-100 text-pink-700 dark:bg-pink-950/60 dark:text-pink-300"
1263
+ ];
1264
+ function indexOf(name) {
1265
+ let hash = 0;
1266
+ for (let i = 0; i < name.length; i++) hash = hash * 31 + name.charCodeAt(i) >>> 0;
1267
+ return hash % DOT.length;
1268
+ }
1269
+ /** Solid dot color (sidebar / lists). */
1270
+ function tagColor(name) {
1271
+ return DOT[indexOf(name)];
1272
+ }
1273
+ /** Soft filled pill (bg + text) for tag badges. */
1274
+ function tagPill(name) {
1275
+ return PILL[indexOf(name)];
1276
+ }
1277
+ //#endregion
1278
+ //#region ../../packages/shared/src/components/tag-more.tsx
1279
+ function TagMore({ owner, repo, tags, activeTag }) {
1280
+ const navigate = useNavigate();
1281
+ const [open, setOpen] = useState(false);
1282
+ function choose(name) {
1283
+ setOpen(false);
1284
+ navigate({
1285
+ to: "/board/$owner/$repo",
1286
+ params: {
1287
+ owner,
1288
+ repo
1289
+ },
1290
+ search: { tag: name }
1291
+ });
1292
+ }
1293
+ return /* @__PURE__ */ jsxs(Popover$1, {
1294
+ open,
1295
+ onOpenChange: setOpen,
1296
+ children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
1297
+ className: "flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm text-sidebar-foreground/75 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground data-[popup-open]:bg-sidebar-accent",
1298
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
1299
+ icon: MoreHorizontalIcon,
1300
+ className: "size-4 text-muted-foreground"
1301
+ }), "More"]
1302
+ }), /* @__PURE__ */ jsx(PopoverContent, {
1303
+ align: "start",
1304
+ sideOffset: 6,
1305
+ className: "w-64 gap-0 overflow-hidden rounded-xl p-0",
1306
+ children: /* @__PURE__ */ jsxs(Command$1, { children: [/* @__PURE__ */ jsx(CommandInput, { placeholder: "Search tags…" }), /* @__PURE__ */ jsxs(CommandList, { children: [/* @__PURE__ */ jsx(CommandEmpty, { children: "No tags found." }), /* @__PURE__ */ jsx(CommandGroup, { children: tags.map((t) => /* @__PURE__ */ jsxs(CommandItem, {
1307
+ value: t.name,
1308
+ "data-checked": activeTag === t.name ? "true" : "false",
1309
+ onSelect: () => choose(t.name),
1310
+ children: [
1311
+ /* @__PURE__ */ jsx("span", { className: cn("size-2 shrink-0 rounded-full", tagColor(t.name)) }),
1312
+ /* @__PURE__ */ jsx("span", {
1313
+ className: "min-w-0 flex-1 truncate",
1314
+ children: t.name
1315
+ }),
1316
+ /* @__PURE__ */ jsx("span", {
1317
+ className: "text-[11px] text-muted-foreground",
1318
+ children: t.count
1319
+ })
1320
+ ]
1321
+ }, t.name)) })] })] })
1322
+ })]
1323
+ });
1324
+ }
1325
+ //#endregion
1326
+ //#region ../../packages/shared/src/components/app-sidebar.tsx
1327
+ var TOP_TAGS = 5;
1328
+ function AppSidebar({ user, active, nav }) {
1329
+ const topTags = nav?.tags.slice(0, TOP_TAGS) ?? [];
1330
+ return /* @__PURE__ */ jsxs("aside", {
1331
+ className: "flex w-64 shrink-0 flex-col gap-3 border-r bg-sidebar p-3 text-sidebar-foreground",
1332
+ children: [
1333
+ /* @__PURE__ */ jsx("div", {
1334
+ className: "pt-1",
1335
+ children: /* @__PURE__ */ jsx(RepoSwitcher, {
1336
+ active,
1337
+ className: "w-full"
1338
+ })
1339
+ }),
1340
+ /* @__PURE__ */ jsx("div", {
1341
+ className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto",
1342
+ children: nav ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Section, {
1343
+ title: "Main",
1344
+ children: [/* @__PURE__ */ jsx(NavItem, {
1345
+ owner: nav.owner,
1346
+ repo: nav.repo,
1347
+ search: {},
1348
+ active: !nav.mine && !nav.tag,
1349
+ icon: DashboardSquare01Icon,
1350
+ label: "Tasks",
1351
+ count: nav.totalCount
1352
+ }), /* @__PURE__ */ jsx(NavItem, {
1353
+ owner: nav.owner,
1354
+ repo: nav.repo,
1355
+ search: { mine: true },
1356
+ active: nav.mine,
1357
+ icon: UserIcon,
1358
+ label: "My tasks",
1359
+ count: nav.myCount
1360
+ })]
1361
+ }), nav.tags.length > 0 ? /* @__PURE__ */ jsxs(Section, {
1362
+ title: "Tags",
1363
+ children: [topTags.map((t) => /* @__PURE__ */ jsxs(Link, {
1364
+ to: "/board/$owner/$repo",
1365
+ params: {
1366
+ owner: nav.owner,
1367
+ repo: nav.repo
1368
+ },
1369
+ search: { tag: t.name },
1370
+ className: cn(rowClass, nav.tag === t.name ? rowActive : rowIdle),
1371
+ children: [
1372
+ /* @__PURE__ */ jsx("span", { className: cn("size-2 shrink-0 rounded-full", tagColor(t.name)) }),
1373
+ /* @__PURE__ */ jsx("span", {
1374
+ className: "min-w-0 flex-1 truncate",
1375
+ children: t.name
1376
+ }),
1377
+ /* @__PURE__ */ jsx(CountBadge, { n: t.count })
1378
+ ]
1379
+ }, t.name)), nav.tags.length > TOP_TAGS ? /* @__PURE__ */ jsx(TagMore, {
1380
+ owner: nav.owner,
1381
+ repo: nav.repo,
1382
+ tags: nav.tags,
1383
+ activeTag: nav.tag
1384
+ }) : null]
1385
+ }) : null] }) : /* @__PURE__ */ jsx("p", {
1386
+ className: "px-2 pt-2 text-xs text-muted-foreground",
1387
+ children: "Select a project to see its tasks and tags."
1388
+ })
1389
+ }),
1390
+ /* @__PURE__ */ jsxs(Link, {
1391
+ to: "/guide",
1392
+ className: rowClass,
1393
+ activeProps: { className: rowActive },
1394
+ inactiveProps: { className: rowIdle },
1395
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
1396
+ icon: HelpCircleIcon,
1397
+ className: "size-4 shrink-0 text-muted-foreground"
1398
+ }), "How to use?"]
1399
+ }),
1400
+ /* @__PURE__ */ jsxs("div", {
1401
+ className: "flex items-center gap-2.5 rounded-lg px-2 py-2 text-left",
1402
+ children: [/* @__PURE__ */ jsxs(Avatar$1, {
1403
+ size: "sm",
1404
+ children: [user.image ? /* @__PURE__ */ jsx(AvatarImage, {
1405
+ src: user.image,
1406
+ alt: user.name
1407
+ }) : null, /* @__PURE__ */ jsx(AvatarFallback, { children: user.name.slice(0, 2).toUpperCase() })]
1408
+ }), /* @__PURE__ */ jsx("span", {
1409
+ className: "min-w-0 flex-1 truncate text-sm font-medium",
1410
+ children: user.name
1411
+ })]
1412
+ })
1413
+ ]
1414
+ });
1415
+ }
1416
+ var rowClass = "flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm transition-colors";
1417
+ var rowActive = "bg-background font-medium text-foreground shadow-sm ring-1 ring-border";
1418
+ var rowIdle = "text-sidebar-foreground/75 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground";
1419
+ function Section({ title, children }) {
1420
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
1421
+ className: "px-2 pb-1 text-xs font-medium text-muted-foreground",
1422
+ children: title
1423
+ }), /* @__PURE__ */ jsx("div", {
1424
+ className: "flex flex-col gap-0.5 p-0.5",
1425
+ children
1426
+ })] });
1427
+ }
1428
+ function NavItem({ owner, repo, search, active, icon, label, count }) {
1429
+ return /* @__PURE__ */ jsxs(Link, {
1430
+ to: "/board/$owner/$repo",
1431
+ params: {
1432
+ owner,
1433
+ repo
1434
+ },
1435
+ search,
1436
+ className: cn(rowClass, active ? rowActive : rowIdle),
1437
+ children: [
1438
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
1439
+ icon,
1440
+ className: cn("size-4 shrink-0", active ? "text-primary" : "text-muted-foreground")
1441
+ }),
1442
+ /* @__PURE__ */ jsx("span", {
1443
+ className: "flex-1",
1444
+ children: label
1445
+ }),
1446
+ /* @__PURE__ */ jsx(CountBadge, { n: count })
1447
+ ]
1448
+ });
1449
+ }
1450
+ function CountBadge({ n }) {
1451
+ return /* @__PURE__ */ jsx("span", {
1452
+ className: "ml-auto rounded-md bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground",
1453
+ children: n
1454
+ });
1455
+ }
1456
+ //#endregion
1457
+ //#region ../../packages/shared/src/components/app-shell.tsx
1458
+ /** Desktop app frame: a rounded panel on a soft background, sidebar + main. */
1459
+ function AppShell({ user, active, nav, children }) {
1460
+ return /* @__PURE__ */ jsx("div", {
1461
+ className: "h-screen w-screen overflow-hidden bg-neutral-200/60 p-2 dark:bg-neutral-900 sm:p-3",
1462
+ children: /* @__PURE__ */ jsxs("div", {
1463
+ className: "flex h-full overflow-hidden rounded-2xl border bg-background shadow-sm",
1464
+ children: [/* @__PURE__ */ jsx(AppSidebar, {
1465
+ user,
1466
+ active,
1467
+ nav
1468
+ }), /* @__PURE__ */ jsx("main", {
1469
+ className: "flex min-w-0 flex-1 flex-col",
1470
+ children
1471
+ })]
1472
+ })
1473
+ });
1474
+ }
1475
+ //#endregion
1476
+ //#region ../../packages/shared/src/lib/review-status.ts
1477
+ /** Single source of truth for how each review status looks (label + icon + color). */
1478
+ var STATUS_META = {
1479
+ todo: {
1480
+ label: "To-Do",
1481
+ icon: DashedLineCircleIcon,
1482
+ color: "text-amber-500"
1483
+ },
1484
+ processing: {
1485
+ label: "In Progress",
1486
+ icon: Progress03Icon,
1487
+ color: "text-blue-500"
1488
+ },
1489
+ done: {
1490
+ label: "Done",
1491
+ icon: CheckmarkCircle02Icon,
1492
+ color: "text-emerald-500"
1493
+ },
1494
+ dropped: {
1495
+ label: "Dropped",
1496
+ icon: CancelCircleIcon,
1497
+ color: "text-rose-500"
1498
+ }
1499
+ };
1500
+ //#endregion
1501
+ export { Dialog$1 as a, DialogHeader as c, signIn as d, useRepoStore as i, DialogTitle as l, AppShell as n, DialogContent as o, tagPill as r, DialogDescription as s, STATUS_META as t, Button$1 as u };