@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,1036 @@
1
+ import { s as cn, t as Skeleton } from "./skeleton-Cpl83ip3.js";
2
+ import { t as Route } from "./routes-BlJSk7OV.js";
3
+ import { i as useRepoStore, n as AppShell, r as tagPill, t as STATUS_META, u as Button } from "./review-status-CdlhgE_Y.js";
4
+ import { a as CodexLight, c as CardAction, d as CardFooter, f as CardHeader, g as Wordmark, h as SiteHeader, i as CodexDark, l as CardContent, m as GitHubLoginButton, n as CursorDark, o as ClaudeAiIcon, p as CardTitle, r as CursorLight, s as Card, t as Gemini, u as CardDescription } from "./gemini-DkmTawm4.js";
5
+ import { useEffect, useState } from "react";
6
+ import { Link } from "@tanstack/react-router";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { motion } from "motion/react";
9
+ import { HugeiconsIcon } from "@hugeicons/react";
10
+ import { ArrowDown01Icon, ArrowLeft01Icon, ArrowRight01Icon, CheckmarkSquare02Icon, DashboardSquare01Icon, FileEditIcon, Flag02Icon, Folder01Icon, GitBranchIcon, Github01Icon, Rocket01Icon, SparklesIcon, SquareLock01Icon, Tag01Icon } from "@hugeicons/core-free-icons";
11
+ import { cva } from "class-variance-authority";
12
+ import { mergeProps } from "@base-ui/react/merge-props";
13
+ import { useRender } from "@base-ui/react/use-render";
14
+ //#region ../../packages/shared/src/components/marketing/landing.tsx
15
+ function MarketingLanding() {
16
+ return /* @__PURE__ */ jsxs("div", {
17
+ className: "relative min-h-screen overflow-x-hidden bg-background text-foreground",
18
+ children: [
19
+ /* @__PURE__ */ jsx(LaneLines, {}),
20
+ /* @__PURE__ */ jsx(Nav, {}),
21
+ /* @__PURE__ */ jsx(Hero, {}),
22
+ /* @__PURE__ */ jsx(Trusted, {}),
23
+ /* @__PURE__ */ jsx(HowItWorks, {}),
24
+ /* @__PURE__ */ jsx(Features, {}),
25
+ /* @__PURE__ */ jsx(Convention, {}),
26
+ /* @__PURE__ */ jsx(CallToAction, {}),
27
+ /* @__PURE__ */ jsx(Footer, {})
28
+ ]
29
+ });
30
+ }
31
+ function LaneLines() {
32
+ return /* @__PURE__ */ jsxs("div", {
33
+ className: "pointer-events-none absolute inset-0 -z-10 overflow-hidden",
34
+ children: [/* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 top-0 h-[900px] bg-[linear-gradient(90deg,var(--border)_1px,transparent_1px)] bg-[size:140px_100%] opacity-50 [mask-image:linear-gradient(to_bottom,black,transparent_85%)]" }), /* @__PURE__ */ jsx("div", { className: "absolute -top-44 left-1/2 h-[28rem] w-[46rem] -translate-x-1/2 rounded-full bg-primary/15 blur-[130px]" })]
35
+ });
36
+ }
37
+ function Nav() {
38
+ return /* @__PURE__ */ jsx(SiteHeader, {
39
+ center: /* @__PURE__ */ jsxs("nav", {
40
+ className: "hidden items-center gap-8 font-mono text-xs tracking-wide text-muted-foreground md:flex",
41
+ children: [
42
+ /* @__PURE__ */ jsx("a", {
43
+ href: "#how",
44
+ className: "transition-colors hover:text-foreground",
45
+ children: "how it works"
46
+ }),
47
+ /* @__PURE__ */ jsx("a", {
48
+ href: "#features",
49
+ className: "transition-colors hover:text-foreground",
50
+ children: "features"
51
+ }),
52
+ /* @__PURE__ */ jsx(Link, {
53
+ to: "/guide",
54
+ className: "transition-colors hover:text-foreground",
55
+ children: "guide"
56
+ })
57
+ ]
58
+ }),
59
+ actions: /* @__PURE__ */ jsx(GitHubLoginButton, {
60
+ size: "sm",
61
+ children: "Sign in"
62
+ })
63
+ });
64
+ }
65
+ function Hero() {
66
+ return /* @__PURE__ */ jsxs("section", {
67
+ className: "mx-auto max-w-6xl px-6 pb-10 pt-20 sm:pt-28",
68
+ children: [/* @__PURE__ */ jsxs("div", {
69
+ className: "mx-auto max-w-3xl text-center",
70
+ children: [
71
+ /* @__PURE__ */ jsxs(motion.p, {
72
+ initial: {
73
+ opacity: 0,
74
+ y: 10
75
+ },
76
+ animate: {
77
+ opacity: 1,
78
+ y: 0
79
+ },
80
+ transition: { duration: .4 },
81
+ className: "inline-flex items-center gap-2 rounded-full border border-border/70 bg-muted/40 px-3 py-1 font-mono text-xs tracking-wide text-muted-foreground",
82
+ children: [
83
+ /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-primary" }),
84
+ ".agents/reviews",
85
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
86
+ icon: ArrowRight01Icon,
87
+ className: "size-3.5"
88
+ }),
89
+ "kanban"
90
+ ]
91
+ }),
92
+ /* @__PURE__ */ jsxs(motion.h1, {
93
+ initial: {
94
+ opacity: 0,
95
+ y: 16
96
+ },
97
+ animate: {
98
+ opacity: 1,
99
+ y: 0
100
+ },
101
+ transition: {
102
+ duration: .5,
103
+ delay: .05,
104
+ ease: [
105
+ .22,
106
+ 1,
107
+ .36,
108
+ 1
109
+ ]
110
+ },
111
+ className: "mt-6 font-heading text-5xl font-semibold leading-[1.05] tracking-tight sm:text-6xl",
112
+ children: [
113
+ "Every agent review,",
114
+ /* @__PURE__ */ jsx("br", {}),
115
+ /* @__PURE__ */ jsxs("span", {
116
+ className: "relative whitespace-nowrap",
117
+ children: [
118
+ "in its",
119
+ /* @__PURE__ */ jsx("span", {
120
+ className: "text-primary",
121
+ children: " lane"
122
+ }),
123
+ ".",
124
+ /* @__PURE__ */ jsx(Underline, {})
125
+ ]
126
+ })
127
+ ]
128
+ }),
129
+ /* @__PURE__ */ jsxs(motion.p, {
130
+ initial: {
131
+ opacity: 0,
132
+ y: 16
133
+ },
134
+ animate: {
135
+ opacity: 1,
136
+ y: 0
137
+ },
138
+ transition: {
139
+ duration: .5,
140
+ delay: .12
141
+ },
142
+ className: "mx-auto mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground",
143
+ children: [
144
+ "Your AI coding agent writes review checklists before it ships. Lanework turns that ",
145
+ /* @__PURE__ */ jsx("code", {
146
+ className: "rounded bg-muted px-1.5 py-0.5 font-mono text-sm",
147
+ children: ".agents/reviews"
148
+ }),
149
+ " folder into a live Kanban board — so you can see, approve, and track every change across a repo."
150
+ ]
151
+ }),
152
+ /* @__PURE__ */ jsxs(motion.div, {
153
+ initial: {
154
+ opacity: 0,
155
+ y: 16
156
+ },
157
+ animate: {
158
+ opacity: 1,
159
+ y: 0
160
+ },
161
+ transition: {
162
+ duration: .5,
163
+ delay: .18
164
+ },
165
+ className: "mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row",
166
+ children: [/* @__PURE__ */ jsx(GitHubLoginButton, {
167
+ size: "lg",
168
+ children: "Continue with GitHub"
169
+ }), /* @__PURE__ */ jsxs("a", {
170
+ href: "#how",
171
+ className: "inline-flex h-12 items-center gap-1.5 rounded-xl px-4 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
172
+ children: ["See how it works", /* @__PURE__ */ jsx(HugeiconsIcon, {
173
+ icon: ArrowDown01Icon,
174
+ className: "size-4"
175
+ })]
176
+ })]
177
+ }),
178
+ /* @__PURE__ */ jsx("p", {
179
+ className: "mt-4 font-mono text-xs text-muted-foreground",
180
+ children: "read-only · never writes to your repos"
181
+ })
182
+ ]
183
+ }), /* @__PURE__ */ jsx(motion.div, {
184
+ initial: {
185
+ opacity: 0,
186
+ y: 40
187
+ },
188
+ animate: {
189
+ opacity: 1,
190
+ y: 0
191
+ },
192
+ transition: {
193
+ duration: .7,
194
+ delay: .25,
195
+ ease: [
196
+ .22,
197
+ 1,
198
+ .36,
199
+ 1
200
+ ]
201
+ },
202
+ className: "mt-16",
203
+ children: /* @__PURE__ */ jsx(BoardMock, {})
204
+ })]
205
+ });
206
+ }
207
+ function Underline() {
208
+ return /* @__PURE__ */ jsx("svg", {
209
+ className: "absolute -bottom-2 left-0 w-full text-primary/40",
210
+ viewBox: "0 0 300 12",
211
+ fill: "none",
212
+ preserveAspectRatio: "none",
213
+ "aria-hidden": true,
214
+ children: /* @__PURE__ */ jsx("path", {
215
+ d: "M2 9C60 3 120 3 180 6c40 2 80 2 118 -2",
216
+ stroke: "currentColor",
217
+ strokeWidth: "3",
218
+ strokeLinecap: "round"
219
+ })
220
+ });
221
+ }
222
+ var MOCK = [
223
+ {
224
+ col: "todo",
225
+ cards: [{
226
+ title: "Add dark mode toggle",
227
+ priority: "medium",
228
+ tags: ["ui"],
229
+ done: 0,
230
+ total: 8,
231
+ people: ["A", "M"]
232
+ }, {
233
+ title: "Paginate the search API",
234
+ priority: "low",
235
+ tags: ["api"],
236
+ done: 0,
237
+ total: 5,
238
+ people: ["P"]
239
+ }]
240
+ },
241
+ {
242
+ col: "processing",
243
+ cards: [{
244
+ title: "Refactor auth middleware",
245
+ priority: "high",
246
+ tags: ["auth", "api"],
247
+ done: 4,
248
+ total: 9,
249
+ people: [
250
+ "A",
251
+ "J",
252
+ "M"
253
+ ]
254
+ }]
255
+ },
256
+ {
257
+ col: "done",
258
+ cards: [{
259
+ title: "Cache homepage queries",
260
+ priority: "medium",
261
+ tags: ["perf"],
262
+ done: 14,
263
+ total: 14,
264
+ people: ["P"]
265
+ }, {
266
+ title: "Fix flaky checkout test",
267
+ priority: "low",
268
+ tags: ["tests"],
269
+ done: 6,
270
+ total: 6,
271
+ people: ["A", "M"]
272
+ }]
273
+ }
274
+ ];
275
+ function BoardMock() {
276
+ return /* @__PURE__ */ jsxs("div", {
277
+ className: "relative mx-auto max-w-5xl rounded-2xl border border-border/70 bg-card/80 p-3 shadow-2xl shadow-black/5 backdrop-blur sm:p-4",
278
+ children: [/* @__PURE__ */ jsxs("div", {
279
+ className: "mb-3 flex items-center gap-1.5 px-2",
280
+ children: [
281
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-muted-foreground/25" }),
282
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-muted-foreground/25" }),
283
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-muted-foreground/25" }),
284
+ /* @__PURE__ */ jsx("span", {
285
+ className: "ml-3 font-mono text-[11px] text-muted-foreground",
286
+ children: "lanework — acme/web"
287
+ })
288
+ ]
289
+ }), /* @__PURE__ */ jsx("div", {
290
+ className: "grid grid-cols-1 gap-3 sm:grid-cols-3",
291
+ children: MOCK.map((column, ci) => {
292
+ const meta = STATUS_META[column.col];
293
+ return /* @__PURE__ */ jsxs(motion.div, {
294
+ initial: {
295
+ opacity: 0,
296
+ y: 16
297
+ },
298
+ animate: {
299
+ opacity: 1,
300
+ y: 0
301
+ },
302
+ transition: {
303
+ duration: .45,
304
+ delay: .35 + ci * .1
305
+ },
306
+ className: "rounded-xl bg-muted/40 p-2.5",
307
+ children: [/* @__PURE__ */ jsxs("div", {
308
+ className: "mb-2 flex items-center gap-2 px-1",
309
+ children: [
310
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
311
+ icon: meta.icon,
312
+ className: cn("size-4", meta.color)
313
+ }),
314
+ /* @__PURE__ */ jsx("span", {
315
+ className: "text-sm font-medium",
316
+ children: meta.label
317
+ }),
318
+ /* @__PURE__ */ jsx("span", {
319
+ className: "text-sm text-muted-foreground",
320
+ children: column.cards.length
321
+ })
322
+ ]
323
+ }), /* @__PURE__ */ jsx("div", {
324
+ className: "flex flex-col gap-2",
325
+ children: column.cards.map((card) => /* @__PURE__ */ jsx(MockCardView, { card }, card.title))
326
+ })]
327
+ }, column.col);
328
+ })
329
+ })]
330
+ });
331
+ }
332
+ var PRIORITY = {
333
+ high: "bg-rose-100 text-rose-700 dark:bg-rose-950/60 dark:text-rose-300",
334
+ medium: "bg-amber-100 text-amber-700 dark:bg-amber-950/60 dark:text-amber-300",
335
+ low: "bg-muted text-muted-foreground"
336
+ };
337
+ var AVATAR = [
338
+ "bg-emerald-500",
339
+ "bg-sky-500",
340
+ "bg-violet-500"
341
+ ];
342
+ function MockCardView({ card }) {
343
+ const pct = card.total ? Math.round(card.done / card.total * 100) : 0;
344
+ return /* @__PURE__ */ jsxs("div", {
345
+ className: "rounded-lg border bg-card p-3 shadow-xs",
346
+ children: [
347
+ /* @__PURE__ */ jsx("p", {
348
+ className: "text-[13px] font-medium leading-snug",
349
+ children: card.title
350
+ }),
351
+ /* @__PURE__ */ jsxs("div", {
352
+ className: "mt-2 flex flex-wrap items-center gap-1.5",
353
+ children: [card.tags.map((t) => /* @__PURE__ */ jsx("span", {
354
+ className: cn("rounded-full px-1.5 py-0.5 text-[10px] font-medium", tagPill(t)),
355
+ children: t
356
+ }, t)), card.priority ? /* @__PURE__ */ jsx("span", {
357
+ className: cn("ml-auto rounded-full px-1.5 py-0.5 text-[10px] font-medium capitalize", PRIORITY[card.priority]),
358
+ children: card.priority
359
+ }) : null]
360
+ }),
361
+ /* @__PURE__ */ jsxs("div", {
362
+ className: "mt-2.5 flex items-center gap-2 border-t pt-2 text-[11px] text-muted-foreground",
363
+ children: [
364
+ /* @__PURE__ */ jsxs("span", {
365
+ className: "inline-flex items-center gap-1",
366
+ children: [
367
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
368
+ icon: CheckmarkSquare02Icon,
369
+ className: "size-3"
370
+ }),
371
+ card.done,
372
+ "/",
373
+ card.total
374
+ ]
375
+ }),
376
+ /* @__PURE__ */ jsx("div", {
377
+ className: "flex -space-x-1.5",
378
+ children: card.people.map((p, i) => /* @__PURE__ */ jsx("span", {
379
+ className: cn("grid size-4 place-items-center rounded-full text-[8px] font-semibold text-white ring-2 ring-card", AVATAR[i % AVATAR.length]),
380
+ children: p
381
+ }, i))
382
+ }),
383
+ /* @__PURE__ */ jsxs("span", {
384
+ className: "ml-auto font-mono",
385
+ children: [pct, "%"]
386
+ })
387
+ ]
388
+ })
389
+ ]
390
+ });
391
+ }
392
+ function Trusted() {
393
+ return /* @__PURE__ */ jsx("section", {
394
+ className: "mx-auto max-w-6xl px-6 py-14",
395
+ children: /* @__PURE__ */ jsxs(Reveal, {
396
+ className: "flex flex-col items-center gap-6",
397
+ children: [/* @__PURE__ */ jsx("p", {
398
+ className: "font-mono text-xs uppercase tracking-[0.2em] text-muted-foreground",
399
+ children: "Works with your coding agent"
400
+ }), /* @__PURE__ */ jsxs("div", {
401
+ className: "flex flex-wrap items-center justify-center gap-x-10 gap-y-6 text-foreground/80",
402
+ children: [
403
+ /* @__PURE__ */ jsx(Brand, {
404
+ label: "Claude Code",
405
+ children: /* @__PURE__ */ jsx(ClaudeAiIcon, { className: "size-6" })
406
+ }),
407
+ /* @__PURE__ */ jsxs(Brand, {
408
+ label: "Codex",
409
+ children: [/* @__PURE__ */ jsx(CodexLight, { className: "size-6 dark:hidden" }), /* @__PURE__ */ jsx(CodexDark, { className: "hidden size-6 dark:block" })]
410
+ }),
411
+ /* @__PURE__ */ jsxs(Brand, {
412
+ label: "Cursor",
413
+ children: [/* @__PURE__ */ jsx(CursorLight, { className: "size-6 dark:hidden" }), /* @__PURE__ */ jsx(CursorDark, { className: "hidden size-6 dark:block" })]
414
+ }),
415
+ /* @__PURE__ */ jsx(Brand, {
416
+ label: "Gemini",
417
+ children: /* @__PURE__ */ jsx(Gemini, { className: "size-6" })
418
+ })
419
+ ]
420
+ })]
421
+ })
422
+ });
423
+ }
424
+ function Brand({ children, label }) {
425
+ return /* @__PURE__ */ jsxs("div", {
426
+ className: "flex items-center gap-2.5",
427
+ children: [children, /* @__PURE__ */ jsx("span", {
428
+ className: "text-sm font-medium",
429
+ children: label
430
+ })]
431
+ });
432
+ }
433
+ function HowItWorks() {
434
+ return /* @__PURE__ */ jsxs("section", {
435
+ id: "how",
436
+ className: "mx-auto max-w-6xl scroll-mt-20 px-6 py-20",
437
+ children: [/* @__PURE__ */ jsx(SectionHeading, {
438
+ eyebrow: "how it works",
439
+ title: "From folder to flow in three steps"
440
+ }), /* @__PURE__ */ jsxs("div", {
441
+ className: "mt-12 grid gap-10 lg:grid-cols-[1.2fr_1fr] lg:items-center",
442
+ children: [/* @__PURE__ */ jsx("div", {
443
+ className: "flex flex-col gap-8",
444
+ children: [
445
+ {
446
+ n: "01",
447
+ title: "Add AGENTS.md",
448
+ body: "Drop the convention into your repo — one file, works with Claude Code, Codex, Cursor and more. Copy the template from the guide."
449
+ },
450
+ {
451
+ n: "02",
452
+ title: "Your agent writes reviews",
453
+ body: "Before changing behavior, it writes a checklist to .agents/reviews/todo/ and waits for you to flip every box to [x]."
454
+ },
455
+ {
456
+ n: "03",
457
+ title: "Watch the board",
458
+ body: "Open the repo in Lanework. Cards flow todo → processing → done as work gets approved and ships."
459
+ }
460
+ ].map((s, i) => /* @__PURE__ */ jsx(Reveal, {
461
+ delay: i * .08,
462
+ children: /* @__PURE__ */ jsxs("div", {
463
+ className: "flex gap-5",
464
+ children: [/* @__PURE__ */ jsx("span", {
465
+ className: "font-mono text-sm text-primary",
466
+ children: s.n
467
+ }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
468
+ className: "text-lg font-semibold tracking-tight",
469
+ children: s.title
470
+ }), /* @__PURE__ */ jsx("p", {
471
+ className: "mt-1.5 max-w-md text-sm leading-relaxed text-muted-foreground",
472
+ children: s.body
473
+ })] })]
474
+ })
475
+ }, s.n))
476
+ }), /* @__PURE__ */ jsx(Reveal, {
477
+ delay: .1,
478
+ children: /* @__PURE__ */ jsx(MappingCard, {})
479
+ })]
480
+ })]
481
+ });
482
+ }
483
+ function MappingCard() {
484
+ return /* @__PURE__ */ jsxs("div", {
485
+ className: "rounded-2xl border border-border/70 bg-card p-5 shadow-sm",
486
+ children: [
487
+ /* @__PURE__ */ jsx("p", {
488
+ className: "mb-4 font-mono text-xs text-muted-foreground",
489
+ children: ".agents/reviews/"
490
+ }),
491
+ /* @__PURE__ */ jsx("div", {
492
+ className: "flex flex-col gap-2",
493
+ children: [
494
+ {
495
+ folder: "todo/",
496
+ col: "todo"
497
+ },
498
+ {
499
+ folder: "processing/",
500
+ col: "processing"
501
+ },
502
+ {
503
+ folder: "done/",
504
+ col: "done"
505
+ },
506
+ {
507
+ folder: "dropped/",
508
+ col: "dropped"
509
+ }
510
+ ].map((r) => {
511
+ const meta = STATUS_META[r.col];
512
+ return /* @__PURE__ */ jsxs("div", {
513
+ className: "flex items-center gap-3",
514
+ children: [
515
+ /* @__PURE__ */ jsx("code", {
516
+ className: "w-28 font-mono text-sm text-foreground",
517
+ children: r.folder
518
+ }),
519
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
520
+ icon: ArrowRight01Icon,
521
+ className: "size-4 text-muted-foreground"
522
+ }),
523
+ /* @__PURE__ */ jsxs("span", {
524
+ className: "inline-flex items-center gap-2 rounded-full bg-muted px-2.5 py-1 text-xs font-medium",
525
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
526
+ icon: meta.icon,
527
+ className: cn("size-3.5", meta.color)
528
+ }), meta.label]
529
+ })
530
+ ]
531
+ }, r.folder);
532
+ })
533
+ }),
534
+ /* @__PURE__ */ jsxs("p", {
535
+ className: "mt-4 inline-flex flex-wrap items-center gap-x-1.5 gap-y-1 border-t pt-4 font-mono text-[11px] leading-relaxed text-muted-foreground",
536
+ children: [
537
+ "frontmatter",
538
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
539
+ icon: ArrowRight01Icon,
540
+ className: "size-3"
541
+ }),
542
+ "priority · assignees · tags",
543
+ /* @__PURE__ */ jsx("span", { className: "w-full" }),
544
+ "checkboxes",
545
+ /* @__PURE__ */ jsx(HugeiconsIcon, {
546
+ icon: ArrowRight01Icon,
547
+ className: "size-3"
548
+ }),
549
+ "progress"
550
+ ]
551
+ })
552
+ ]
553
+ });
554
+ }
555
+ function Features() {
556
+ return /* @__PURE__ */ jsxs("section", {
557
+ id: "features",
558
+ className: "mx-auto max-w-6xl scroll-mt-20 px-6 py-20",
559
+ children: [/* @__PURE__ */ jsx(SectionHeading, {
560
+ eyebrow: "features",
561
+ title: "Everything you need to triage agent work"
562
+ }), /* @__PURE__ */ jsx("div", {
563
+ className: "mt-12 grid gap-px overflow-hidden rounded-2xl border border-border/70 bg-border/70 sm:grid-cols-2 lg:grid-cols-3",
564
+ children: [
565
+ {
566
+ icon: DashboardSquare01Icon,
567
+ title: "Board & List",
568
+ body: "Four columns from your folders, or a dense list view. Your reviews, organized the way you think."
569
+ },
570
+ {
571
+ icon: Tag01Icon,
572
+ title: "Filter by tag & owner",
573
+ body: "Slice to My tasks or any tag. The top tags surface right in the sidebar."
574
+ },
575
+ {
576
+ icon: FileEditIcon,
577
+ title: "Full-screen review",
578
+ body: "Open a card for the rendered markdown plus a clean metadata panel — status, priority, progress."
579
+ },
580
+ {
581
+ icon: Github01Icon,
582
+ title: "GitHub-native, read-only",
583
+ body: "Sign in, pick a repo. Lanework reads your reviews and never writes back — your files stay yours."
584
+ },
585
+ {
586
+ icon: Rocket01Icon,
587
+ title: "Fast by design",
588
+ body: "File contents batch over GraphQL with an instant skeleton, so big boards open quick."
589
+ },
590
+ {
591
+ icon: SparklesIcon,
592
+ title: "Built to feel good",
593
+ body: "Fluid motion, dark-mode tokens, and a “/” to jump between repos. A tool you’ll want to open."
594
+ }
595
+ ].map((f, i) => /* @__PURE__ */ jsx(Reveal, {
596
+ delay: i % 3 * .06,
597
+ className: "bg-card",
598
+ children: /* @__PURE__ */ jsxs("div", {
599
+ className: "group h-full p-6 transition-colors hover:bg-muted/30",
600
+ children: [
601
+ /* @__PURE__ */ jsx("span", {
602
+ className: "grid size-10 place-items-center rounded-xl bg-primary/10 text-primary transition-transform group-hover:scale-105",
603
+ children: /* @__PURE__ */ jsx(HugeiconsIcon, {
604
+ icon: f.icon,
605
+ className: "size-5"
606
+ })
607
+ }),
608
+ /* @__PURE__ */ jsx("h3", {
609
+ className: "mt-4 font-semibold tracking-tight",
610
+ children: f.title
611
+ }),
612
+ /* @__PURE__ */ jsx("p", {
613
+ className: "mt-1.5 text-sm leading-relaxed text-muted-foreground",
614
+ children: f.body
615
+ })
616
+ ]
617
+ })
618
+ }, f.title))
619
+ })]
620
+ });
621
+ }
622
+ var EXAMPLE = `---
623
+ assignees: ["you"]
624
+ created_at: 2026-06-21
625
+ priority: high
626
+ tags: ["auth", "api"]
627
+ ---
628
+
629
+ # Review: Refactor auth middleware
630
+
631
+ - [x] Extract token verification into a helper
632
+ - [ ] Add rate-limit headers to 401s
633
+ - [ ] Cover the refresh-token path with tests`;
634
+ function Convention() {
635
+ return /* @__PURE__ */ jsx("section", {
636
+ className: "mx-auto max-w-6xl px-6 py-20",
637
+ children: /* @__PURE__ */ jsxs("div", {
638
+ className: "grid gap-10 lg:grid-cols-2 lg:items-center",
639
+ children: [/* @__PURE__ */ jsxs(Reveal, { children: [
640
+ /* @__PURE__ */ jsx(SectionHeading, {
641
+ align: "left",
642
+ eyebrow: "the convention",
643
+ title: "A markdown file your agent already knows how to write"
644
+ }),
645
+ /* @__PURE__ */ jsx("p", {
646
+ className: "mt-5 max-w-md text-sm leading-relaxed text-muted-foreground",
647
+ children: "No new format to learn. A review is a checklist with a little frontmatter. Lanework reads the folder for the column, the frontmatter for the metadata, and the checkboxes for progress. That’s it."
648
+ }),
649
+ /* @__PURE__ */ jsxs("div", {
650
+ className: "mt-7 flex flex-wrap gap-3",
651
+ children: [/* @__PURE__ */ jsx(GitHubLoginButton, {
652
+ size: "lg",
653
+ children: "Continue with GitHub"
654
+ }), /* @__PURE__ */ jsxs(Link, {
655
+ to: "/guide",
656
+ className: "inline-flex h-12 items-center gap-1.5 rounded-xl border px-5 text-sm font-medium transition-colors hover:bg-muted",
657
+ children: ["Read the guide", /* @__PURE__ */ jsx(HugeiconsIcon, {
658
+ icon: ArrowRight01Icon,
659
+ className: "size-4"
660
+ })]
661
+ })]
662
+ })
663
+ ] }), /* @__PURE__ */ jsx(Reveal, {
664
+ delay: .1,
665
+ children: /* @__PURE__ */ jsxs("div", {
666
+ className: "overflow-hidden rounded-2xl border border-border/70 bg-[#0c0f0d] shadow-xl",
667
+ children: [/* @__PURE__ */ jsxs("div", {
668
+ className: "flex items-center gap-2 border-b border-white/10 px-4 py-2.5",
669
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
670
+ icon: Flag02Icon,
671
+ className: "size-3.5 text-emerald-400"
672
+ }), /* @__PURE__ */ jsx("span", {
673
+ className: "font-mono text-[11px] text-white/50",
674
+ children: ".agents/reviews/processing/2026-06-21-refactor-auth-middleware.md"
675
+ })]
676
+ }), /* @__PURE__ */ jsx("pre", {
677
+ className: "overflow-x-auto p-5 font-mono text-[12.5px] leading-relaxed text-emerald-50/90",
678
+ children: EXAMPLE
679
+ })]
680
+ })
681
+ })]
682
+ })
683
+ });
684
+ }
685
+ function CallToAction() {
686
+ return /* @__PURE__ */ jsx("section", {
687
+ className: "mx-auto max-w-6xl px-6 py-20",
688
+ children: /* @__PURE__ */ jsx(Reveal, { children: /* @__PURE__ */ jsxs("div", {
689
+ className: "relative overflow-hidden rounded-[2rem] bg-gradient-to-br from-emerald-600 via-emerald-700 to-emerald-800 px-8 py-20 text-center shadow-2xl shadow-emerald-900/30 ring-1 ring-inset ring-white/10",
690
+ children: [
691
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-[linear-gradient(90deg,rgba(255,255,255,0.07)_1px,transparent_1px)] bg-[size:120px_100%] [mask-image:radial-gradient(ellipse_at_center,black,transparent_75%)]" }),
692
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute -top-24 left-1/2 h-72 w-[40rem] -translate-x-1/2 rounded-full bg-emerald-300/30 blur-[120px]" }),
693
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute -bottom-28 -right-12 size-72 rounded-full bg-teal-300/20 blur-[110px]" }),
694
+ /* @__PURE__ */ jsxs("div", {
695
+ className: "relative mx-auto max-w-xl",
696
+ children: [
697
+ /* @__PURE__ */ jsx("img", {
698
+ src: "/logo.png",
699
+ alt: "",
700
+ className: "mx-auto mb-6 size-16 rounded-2xl shadow-lg shadow-emerald-950/30 ring-1 ring-white/20"
701
+ }),
702
+ /* @__PURE__ */ jsx("h2", {
703
+ className: "font-heading text-3xl font-semibold tracking-tight text-white sm:text-[2.5rem] sm:leading-tight",
704
+ children: "Bring your agent’s reviews to life."
705
+ }),
706
+ /* @__PURE__ */ jsx("p", {
707
+ className: "mx-auto mt-4 max-w-md text-emerald-50/80",
708
+ children: "Sign in with GitHub and open your first board in under a minute. Free and open source."
709
+ }),
710
+ /* @__PURE__ */ jsx("div", {
711
+ className: "mt-8 flex justify-center",
712
+ children: /* @__PURE__ */ jsx(GitHubLoginButton, {
713
+ variant: "invert",
714
+ size: "lg",
715
+ children: "Continue with GitHub"
716
+ })
717
+ })
718
+ ]
719
+ })
720
+ ]
721
+ }) })
722
+ });
723
+ }
724
+ function Footer() {
725
+ return /* @__PURE__ */ jsx("footer", {
726
+ className: "border-t border-border/60",
727
+ children: /* @__PURE__ */ jsxs("div", {
728
+ className: "mx-auto max-w-6xl px-6 py-10",
729
+ children: [/* @__PURE__ */ jsxs("div", {
730
+ className: "flex flex-col items-center justify-between gap-6 sm:flex-row",
731
+ children: [/* @__PURE__ */ jsx(Wordmark, {}), /* @__PURE__ */ jsxs("nav", {
732
+ className: "flex flex-wrap items-center gap-x-7 gap-y-2 font-mono text-xs text-muted-foreground",
733
+ children: [
734
+ /* @__PURE__ */ jsx(Link, {
735
+ to: "/guide",
736
+ className: "hover:text-foreground",
737
+ children: "guide"
738
+ }),
739
+ /* @__PURE__ */ jsx("a", {
740
+ href: "https://github.com/fuongz/lanework",
741
+ className: "hover:text-foreground",
742
+ children: "github"
743
+ }),
744
+ /* @__PURE__ */ jsx("a", {
745
+ href: "https://github.com/fuongz/lanework#readme",
746
+ className: "hover:text-foreground",
747
+ children: "docs"
748
+ }),
749
+ /* @__PURE__ */ jsx("span", { children: "MIT" })
750
+ ]
751
+ })]
752
+ }), /* @__PURE__ */ jsxs("div", {
753
+ className: "mt-8 border-t border-border/60 pt-6 text-center text-xs text-muted-foreground",
754
+ children: [
755
+ "Made with",
756
+ " ",
757
+ /* @__PURE__ */ jsx("span", {
758
+ className: "text-rose-500",
759
+ "aria-label": "love",
760
+ children: "♥"
761
+ }),
762
+ " ",
763
+ "by",
764
+ " ",
765
+ /* @__PURE__ */ jsx("a", {
766
+ href: "https://phuongphung.com",
767
+ target: "_blank",
768
+ rel: "noreferrer",
769
+ className: "font-medium text-foreground underline-offset-2 hover:underline",
770
+ children: "fuongz"
771
+ })
772
+ ]
773
+ })]
774
+ })
775
+ });
776
+ }
777
+ function Reveal({ children, delay = 0, className }) {
778
+ return /* @__PURE__ */ jsx(motion.div, {
779
+ initial: {
780
+ opacity: 0,
781
+ y: 18
782
+ },
783
+ whileInView: {
784
+ opacity: 1,
785
+ y: 0
786
+ },
787
+ viewport: {
788
+ once: true,
789
+ margin: "-80px"
790
+ },
791
+ transition: {
792
+ duration: .5,
793
+ delay,
794
+ ease: [
795
+ .22,
796
+ 1,
797
+ .36,
798
+ 1
799
+ ]
800
+ },
801
+ className,
802
+ children
803
+ });
804
+ }
805
+ function SectionHeading({ eyebrow, title, align = "center" }) {
806
+ return /* @__PURE__ */ jsxs("div", {
807
+ className: cn(align === "center" && "mx-auto max-w-2xl text-center"),
808
+ children: [/* @__PURE__ */ jsx("p", {
809
+ className: "font-mono text-xs uppercase tracking-[0.2em] text-primary",
810
+ children: eyebrow
811
+ }), /* @__PURE__ */ jsx("h2", {
812
+ className: "mt-3 font-heading text-3xl font-semibold tracking-tight sm:text-4xl",
813
+ children: title
814
+ })]
815
+ });
816
+ }
817
+ //#endregion
818
+ //#region ../../packages/shared/src/components/ui/badge.tsx
819
+ var badgeVariants = cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-2xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", {
820
+ variants: { variant: {
821
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
822
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
823
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
824
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
825
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
826
+ link: "text-primary underline-offset-4 hover:underline"
827
+ } },
828
+ defaultVariants: { variant: "default" }
829
+ });
830
+ function Badge({ className, variant = "default", render, ...props }) {
831
+ return useRender({
832
+ defaultTagName: "span",
833
+ props: mergeProps({ className: cn(badgeVariants({ variant }), className) }, props),
834
+ render,
835
+ state: {
836
+ slot: "badge",
837
+ variant
838
+ }
839
+ });
840
+ }
841
+ //#endregion
842
+ //#region ../../packages/shared/src/routes/index.tsx?tsr-split=component
843
+ var PAGE_SIZE = 12;
844
+ function Home() {
845
+ const { user } = Route.useLoaderData();
846
+ if (!user) return /* @__PURE__ */ jsx(MarketingLanding, {});
847
+ return /* @__PURE__ */ jsx(AppShell, {
848
+ user,
849
+ children: /* @__PURE__ */ jsx(ProjectsHome, {})
850
+ });
851
+ }
852
+ function ProjectsHome() {
853
+ const { repos, loading, ensureLoaded } = useRepoStore();
854
+ const [page, setPage] = useState(0);
855
+ useEffect(() => ensureLoaded(), [ensureLoaded]);
856
+ const all = repos ?? [];
857
+ const pageCount = Math.ceil(all.length / PAGE_SIZE);
858
+ const start = page * PAGE_SIZE;
859
+ const visible = all.slice(start, start + PAGE_SIZE);
860
+ return /* @__PURE__ */ jsxs("div", {
861
+ className: "flex h-full animate-in flex-col overflow-y-auto px-6 py-6 fade-in duration-500 motion-reduce:animate-none",
862
+ children: [/* @__PURE__ */ jsxs("div", {
863
+ className: "mb-6",
864
+ children: [/* @__PURE__ */ jsx("h1", {
865
+ className: "font-heading text-2xl font-semibold tracking-tight",
866
+ children: "Projects"
867
+ }), /* @__PURE__ */ jsxs("p", {
868
+ className: "mt-1 text-sm text-muted-foreground",
869
+ children: [
870
+ "Pick a repository to open its review board. Repos without a",
871
+ " ",
872
+ /* @__PURE__ */ jsx("code", {
873
+ className: "rounded bg-muted px-1 py-0.5 text-xs",
874
+ children: ".agents/reviews"
875
+ }),
876
+ " folder show an empty board."
877
+ ]
878
+ })]
879
+ }), loading && !repos ? /* @__PURE__ */ jsx("div", {
880
+ className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
881
+ children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: "h-40 rounded-xl" }, i))
882
+ }) : all.length === 0 ? /* @__PURE__ */ jsxs("div", {
883
+ className: "flex flex-col items-center gap-2 rounded-none p-10 text-center ring-1 ring-foreground/10",
884
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
885
+ icon: Folder01Icon,
886
+ className: "size-6 text-muted-foreground"
887
+ }), /* @__PURE__ */ jsx("p", {
888
+ className: "text-sm text-muted-foreground",
889
+ children: "No repositories found."
890
+ })]
891
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
892
+ className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
893
+ children: visible.map((repo, i) => /* @__PURE__ */ jsx(motion.div, {
894
+ initial: {
895
+ opacity: 0,
896
+ y: 10
897
+ },
898
+ animate: {
899
+ opacity: 1,
900
+ y: 0
901
+ },
902
+ transition: {
903
+ duration: .35,
904
+ delay: Math.min(i, 12) * .04,
905
+ ease: "easeOut"
906
+ },
907
+ whileHover: { y: -4 },
908
+ children: /* @__PURE__ */ jsx(Link, {
909
+ to: "/board/$owner/$repo",
910
+ params: {
911
+ owner: repo.owner,
912
+ repo: repo.name
913
+ },
914
+ className: "group block h-full",
915
+ children: /* @__PURE__ */ jsxs(Card, {
916
+ className: "h-full transition-[box-shadow,--tw-ring-color] duration-200 group-hover:shadow-md group-hover:ring-foreground/25",
917
+ children: [
918
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
919
+ /* @__PURE__ */ jsxs(CardTitle, {
920
+ className: "flex min-w-0 items-center gap-2",
921
+ children: [/* @__PURE__ */ jsx(RepoIcon, { homepage: repo.homepage }), /* @__PURE__ */ jsx("span", {
922
+ className: "truncate",
923
+ children: repo.name
924
+ })]
925
+ }),
926
+ /* @__PURE__ */ jsx(CardDescription, {
927
+ className: "truncate",
928
+ children: repo.owner
929
+ }),
930
+ /* @__PURE__ */ jsx(CardAction, { children: repo.private ? /* @__PURE__ */ jsxs(Badge, {
931
+ variant: "secondary",
932
+ className: "gap-1",
933
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
934
+ icon: SquareLock01Icon,
935
+ className: "size-3"
936
+ }), "Private"]
937
+ }) : /* @__PURE__ */ jsx(Badge, {
938
+ variant: "outline",
939
+ children: "Public"
940
+ }) })
941
+ ] }),
942
+ repo.description ? /* @__PURE__ */ jsx(CardContent, {
943
+ className: "line-clamp-2 text-muted-foreground",
944
+ children: repo.description
945
+ }) : null,
946
+ /* @__PURE__ */ jsxs(CardFooter, {
947
+ className: "justify-between",
948
+ children: [/* @__PURE__ */ jsxs(Badge, {
949
+ variant: "outline",
950
+ className: "gap-1",
951
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
952
+ icon: GitBranchIcon,
953
+ className: "size-3"
954
+ }), repo.defaultBranch]
955
+ }), /* @__PURE__ */ jsxs("span", {
956
+ className: "inline-flex items-center gap-1 text-xs font-medium text-muted-foreground transition-colors group-hover:text-foreground",
957
+ children: ["Open board", /* @__PURE__ */ jsx(HugeiconsIcon, {
958
+ icon: ArrowRight01Icon,
959
+ className: "size-3.5 transition-transform group-hover:translate-x-0.5"
960
+ })]
961
+ })]
962
+ })
963
+ ]
964
+ })
965
+ })
966
+ }, repo.id))
967
+ }), pageCount > 1 && /* @__PURE__ */ jsxs("div", {
968
+ className: "mt-6 flex items-center justify-between",
969
+ children: [/* @__PURE__ */ jsxs("p", {
970
+ className: "text-sm text-muted-foreground",
971
+ children: [
972
+ start + 1,
973
+ "–",
974
+ Math.min(start + PAGE_SIZE, all.length),
975
+ " of ",
976
+ all.length
977
+ ]
978
+ }), /* @__PURE__ */ jsxs("div", {
979
+ className: "flex items-center gap-2",
980
+ children: [/* @__PURE__ */ jsxs(Button, {
981
+ variant: "outline",
982
+ size: "sm",
983
+ disabled: page === 0,
984
+ onClick: () => setPage((p) => Math.max(0, p - 1)),
985
+ children: [/* @__PURE__ */ jsx(HugeiconsIcon, {
986
+ icon: ArrowLeft01Icon,
987
+ "data-icon": "inline-start"
988
+ }), "Previous"]
989
+ }), /* @__PURE__ */ jsxs(Button, {
990
+ variant: "outline",
991
+ size: "sm",
992
+ disabled: page >= pageCount - 1,
993
+ onClick: () => setPage((p) => Math.min(pageCount - 1, p + 1)),
994
+ children: ["Next", /* @__PURE__ */ jsx(HugeiconsIcon, {
995
+ icon: ArrowRight01Icon,
996
+ "data-icon": "inline-end"
997
+ })]
998
+ })]
999
+ })]
1000
+ })] })]
1001
+ });
1002
+ }
1003
+ /**
1004
+ * Repo icon: the folder icon shows immediately as a placeholder, and the website's
1005
+ * favicon (if any) silently replaces it once loaded — so there's no blank gap while
1006
+ * the remote image fetches, and the folder stays if there's no site or it errors.
1007
+ */
1008
+ function RepoIcon({ homepage }) {
1009
+ const host = faviconHost(homepage);
1010
+ const [loaded, setLoaded] = useState(false);
1011
+ return /* @__PURE__ */ jsxs("span", {
1012
+ className: "relative grid size-4 shrink-0 place-items-center",
1013
+ children: [!loaded && /* @__PURE__ */ jsx(HugeiconsIcon, {
1014
+ icon: Folder01Icon,
1015
+ className: "size-4 text-primary"
1016
+ }), host && /* @__PURE__ */ jsx("img", {
1017
+ src: `https://www.google.com/s2/favicons?sz=64&domain=${host}`,
1018
+ alt: "",
1019
+ width: 16,
1020
+ height: 16,
1021
+ onLoad: () => setLoaded(true),
1022
+ className: `size-4 rounded-sm ${loaded ? "block" : "hidden"}`
1023
+ })]
1024
+ });
1025
+ }
1026
+ /** Extract a hostname from a repo homepage, normalizing protocol-less URLs. */
1027
+ function faviconHost(homepage) {
1028
+ if (!homepage) return null;
1029
+ try {
1030
+ return new URL(/^https?:\/\//.test(homepage) ? homepage : `https://${homepage}`).hostname;
1031
+ } catch {
1032
+ return null;
1033
+ }
1034
+ }
1035
+ //#endregion
1036
+ export { Home as component };