@hirra/vibemeter 0.1.2 → 0.1.4

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 (262) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +7 -1
  3. package/.next/build-manifest.json +7 -8
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +16 -12
  6. package/.next/required-server-files.js +5 -4
  7. package/.next/required-server-files.json +5 -4
  8. package/.next/routes-manifest.json +36 -0
  9. package/.next/server/app/_global-error/page/build-manifest.json +4 -5
  10. package/.next/server/app/_global-error/page.js +4 -4
  11. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  12. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_global-error.html +1 -1
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/_not-found/page/build-manifest.json +4 -5
  21. package/.next/server/app/_not-found/page.js +5 -4
  22. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/admin/page/build-manifest.json +4 -5
  25. package/.next/server/app/admin/page.js +7 -5
  26. package/.next/server/app/admin/page.js.nft.json +1 -1
  27. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/codex-accounts/route.js +1 -1
  29. package/.next/server/app/api/codex-accounts/route.js.nft.json +1 -1
  30. package/.next/server/app/api/float/route/app-paths-manifest.json +3 -0
  31. package/.next/server/app/api/float/route/build-manifest.json +9 -0
  32. package/.next/server/app/api/float/route/server-reference-manifest.json +4 -0
  33. package/.next/server/app/api/float/route.js +8 -0
  34. package/.next/server/app/api/float/route.js.map +5 -0
  35. package/.next/server/app/api/float/route.js.nft.json +1 -0
  36. package/.next/server/app/api/float/route_client-reference-manifest.js +3 -0
  37. package/.next/server/app/api/import-sessions/route.js.nft.json +1 -1
  38. package/.next/server/app/api/sessions/[id]/tags/route.js +1 -1
  39. package/.next/server/app/api/sessions/[id]/tags/route.js.nft.json +1 -1
  40. package/.next/server/app/api/sessions/route.js +1 -1
  41. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  42. package/.next/server/app/api/settings/alerts/route/app-paths-manifest.json +3 -0
  43. package/.next/server/app/api/settings/alerts/route/build-manifest.json +9 -0
  44. package/.next/server/app/api/settings/alerts/route/server-reference-manifest.json +4 -0
  45. package/.next/server/app/api/settings/alerts/route.js +9 -0
  46. package/.next/server/app/api/settings/alerts/route.js.map +5 -0
  47. package/.next/server/app/api/settings/alerts/route.js.nft.json +1 -0
  48. package/.next/server/app/api/settings/alerts/route_client-reference-manifest.js +3 -0
  49. package/.next/server/app/api/settings/notify/route/app-paths-manifest.json +3 -0
  50. package/.next/server/app/api/settings/notify/route/build-manifest.json +9 -0
  51. package/.next/server/app/api/settings/notify/route/server-reference-manifest.json +4 -0
  52. package/.next/server/app/api/settings/notify/route.js +7 -0
  53. package/.next/server/app/api/settings/notify/route.js.map +5 -0
  54. package/.next/server/app/api/settings/notify/route.js.nft.json +1 -0
  55. package/.next/server/app/api/settings/notify/route_client-reference-manifest.js +3 -0
  56. package/.next/server/app/api/usage/route.js +1 -1
  57. package/.next/server/app/api/usage/route.js.nft.json +1 -1
  58. package/.next/server/app/float/page/app-paths-manifest.json +3 -0
  59. package/.next/server/app/float/page/build-manifest.json +16 -0
  60. package/.next/server/app/float/page/next-font-manifest.json +11 -0
  61. package/.next/server/app/float/page/react-loadable-manifest.json +1 -0
  62. package/.next/server/app/float/page/server-reference-manifest.json +4 -0
  63. package/.next/server/app/float/page.js +15 -0
  64. package/.next/server/app/float/page.js.map +5 -0
  65. package/.next/server/app/float/page.js.nft.json +1 -0
  66. package/.next/server/app/float/page_client-reference-manifest.js +3 -0
  67. package/.next/server/app/install.sh/route/app-paths-manifest.json +3 -0
  68. package/.next/server/app/install.sh/route/build-manifest.json +9 -0
  69. package/.next/server/app/install.sh/route/server-reference-manifest.json +4 -0
  70. package/.next/server/app/install.sh/route.js +6 -0
  71. package/.next/server/app/install.sh/route.js.map +5 -0
  72. package/.next/server/app/install.sh/route.js.nft.json +1 -0
  73. package/.next/server/app/install.sh/route_client-reference-manifest.js +3 -0
  74. package/.next/server/app/install.sh.body +108 -0
  75. package/.next/server/app/install.sh.meta +1 -0
  76. package/.next/server/app/page/build-manifest.json +4 -5
  77. package/.next/server/app/page.js +8 -5
  78. package/.next/server/app/page.js.nft.json +1 -1
  79. package/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  81. package/.next/server/app/settings/page/build-manifest.json +16 -0
  82. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  83. package/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  84. package/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  85. package/.next/server/app/settings/page.js +17 -0
  86. package/.next/server/app/settings/page.js.map +5 -0
  87. package/.next/server/app/settings/page.js.nft.json +1 -0
  88. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  89. package/.next/server/app-paths-manifest.json +7 -1
  90. package/.next/server/chunks/[externals]__0_i~3ox._.js +3 -0
  91. package/.next/server/chunks/[externals]__0_i~3ox._.js.map +1 -0
  92. package/.next/server/chunks/[externals]__13p_1zh._.js +3 -0
  93. package/.next/server/chunks/[externals]__13p_1zh._.js.map +1 -0
  94. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js +38 -0
  95. package/.next/server/chunks/[root-of-the-server]__01t2c3w._.js.map +1 -0
  96. package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js → [root-of-the-server]__024yzee._.js} +2 -2
  97. package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js → [root-of-the-server]__082iwfa._.js} +2 -2
  98. package/.next/server/chunks/[root-of-the-server]__0chedn~._.js +1 -1
  99. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js +38 -0
  100. package/.next/server/chunks/[root-of-the-server]__0mwf0bn._.js.map +1 -0
  101. package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js → [root-of-the-server]__0ru3_it._.js} +2 -2
  102. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js +111 -0
  103. package/.next/server/chunks/[root-of-the-server]__0u6y_k1._.js.map +1 -0
  104. package/.next/server/chunks/{[root-of-the-server]__0866q87._.js → [root-of-the-server]__0xa4dzi._.js} +2 -2
  105. package/.next/server/chunks/[root-of-the-server]__13415c6._.js +96 -0
  106. package/.next/server/chunks/[root-of-the-server]__13415c6._.js.map +1 -0
  107. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js +96 -0
  108. package/.next/server/chunks/[root-of-the-server]__13j_28o._.js.map +1 -0
  109. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js +3 -0
  110. package/.next/server/chunks/_next-internal_server_app_api_float_route_actions_012j~jr.js.map +1 -0
  111. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js +3 -0
  112. package/.next/server/chunks/_next-internal_server_app_api_settings_alerts_route_actions_0ydcyko.js.map +1 -0
  113. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js +3 -0
  114. package/.next/server/chunks/_next-internal_server_app_api_settings_notify_route_actions_0-j35mb.js.map +1 -0
  115. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js +3 -0
  116. package/.next/server/chunks/_next-internal_server_app_install_sh_route_actions_0cj-6me.js.map +1 -0
  117. package/.next/server/chunks/node_modules_next_06f88ko._.js +19 -0
  118. package/.next/server/chunks/node_modules_next_06f88ko._.js.map +1 -0
  119. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js +18 -0
  120. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_03jj5jj.js.map +1 -0
  121. package/.next/server/chunks/src_12i1qk5._.js +3 -0
  122. package/.next/server/chunks/src_12i1qk5._.js.map +1 -0
  123. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js +169 -0
  124. package/.next/server/chunks/src_lib_alerts_ticker_ts_0n6oy1d._.js.map +1 -0
  125. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js +3 -0
  126. package/.next/server/chunks/ssr/[root-of-the-server]__03mt8o0._.js.map +1 -0
  127. package/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__090jxzh._.js} +2 -2
  128. package/.next/server/chunks/ssr/[root-of-the-server]__090jxzh._.js.map +1 -0
  129. package/.next/server/chunks/ssr/{[root-of-the-server]__09hgk-7._.js → [root-of-the-server]__0c3j40u._.js} +2 -2
  130. package/.next/server/chunks/ssr/[root-of-the-server]__0c3j40u._.js.map +1 -0
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js +3 -0
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0ot4nev._.js.map +1 -0
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js +90 -0
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0q_~l2m._.js.map +1 -0
  135. package/.next/server/chunks/ssr/{[root-of-the-server]__0cqes87._.js → [root-of-the-server]__0qt26ty._.js} +2 -2
  136. package/.next/server/chunks/ssr/[root-of-the-server]__0qt26ty._.js.map +1 -0
  137. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js +55 -0
  138. package/.next/server/chunks/ssr/[root-of-the-server]__0s5.uhg._.js.map +1 -0
  139. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js +3 -0
  140. package/.next/server/chunks/ssr/[root-of-the-server]__0x~-phx._.js.map +1 -0
  141. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js +3 -0
  142. package/.next/server/chunks/ssr/[root-of-the-server]__0y_zq8k._.js.map +1 -0
  143. package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0~953ob._.js} +2 -2
  144. package/.next/server/chunks/ssr/[root-of-the-server]__0~953ob._.js.map +1 -0
  145. package/.next/server/chunks/ssr/_0-9j34y._.js +70 -0
  146. package/.next/server/chunks/ssr/_0-9j34y._.js.map +1 -0
  147. package/.next/server/chunks/ssr/_0jxmm9h._.js +6 -0
  148. package/.next/server/chunks/ssr/_0jxmm9h._.js.map +1 -0
  149. package/.next/server/chunks/ssr/_0lfe3wr._.js +3 -0
  150. package/.next/server/chunks/ssr/_0lfe3wr._.js.map +1 -0
  151. package/.next/server/chunks/ssr/{node_modules_0i2xw~e._.js → _0nvprxh._.js} +5 -2
  152. package/.next/server/chunks/ssr/_0nvprxh._.js.map +1 -0
  153. package/.next/server/chunks/ssr/_0pugb10._.js +6 -0
  154. package/.next/server/chunks/ssr/_0pugb10._.js.map +1 -0
  155. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js +3 -0
  156. package/.next/server/chunks/ssr/_next-internal_server_app_float_page_actions_0x6hm4p.js.map +1 -0
  157. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +3 -0
  158. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js.map +1 -0
  159. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js +3 -0
  160. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js.map +1 -0
  161. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js +3 -0
  162. package/.next/server/chunks/ssr/node_modules_next_dist_09jzzl8._.js.map +1 -0
  163. package/.next/server/chunks/ssr/{node_modules_next_dist_0e1izl_._.js → node_modules_next_dist_0h9llsw._.js} +2 -2
  164. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
  165. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js +4 -0
  166. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06b_a87.js.map +1 -0
  167. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js +4 -0
  168. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p_u4px.js.map +1 -0
  169. package/.next/server/chunks/ssr/src_0urkups._.js +3 -0
  170. package/.next/server/chunks/ssr/src_0urkups._.js.map +1 -0
  171. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js +3 -0
  172. package/.next/server/chunks/ssr/src_components_0ox9d~w._.js.map +1 -0
  173. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js +1 -1
  174. package/.next/server/chunks/ssr/src_components_CodexAccountsPanel_tsx_0n9xjzi._.js.map +1 -1
  175. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js +3 -0
  176. package/.next/server/chunks/ssr/src_components_FloatingWidget_tsx_089.6oo._.js.map +1 -0
  177. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js +3 -0
  178. package/.next/server/chunks/ssr/src_lib_i18n_client_tsx_07pysgz._.js.map +1 -0
  179. package/.next/server/edge/chunks/_0-m5tdn._.js +3 -0
  180. package/.next/server/edge/chunks/_0-m5tdn._.js.map +1 -0
  181. package/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js.map +1 -0
  182. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_0mz-5sp.js +3 -0
  183. package/.next/server/functions-config-manifest.json +4 -1
  184. package/.next/server/instrumentation/middleware-manifest.json +12 -0
  185. package/.next/server/instrumentation.js +4 -0
  186. package/.next/server/instrumentation.js.map +5 -0
  187. package/.next/server/instrumentation.js.nft.json +1 -0
  188. package/.next/server/middleware-build-manifest.js +7 -8
  189. package/.next/server/next-font-manifest.js +1 -1
  190. package/.next/server/next-font-manifest.json +8 -0
  191. package/.next/server/pages/500.html +1 -1
  192. package/.next/server/pages-manifest.json +0 -1
  193. package/.next/server/server-reference-manifest.js +1 -1
  194. package/.next/server/server-reference-manifest.json +1 -1
  195. package/.next/static/chunks/0bymg5d-lqs0o.js +5 -0
  196. package/.next/static/chunks/0ebdqsutnp8y4.js +1 -0
  197. package/.next/static/chunks/0i3~mnai-l497.js +1 -0
  198. package/.next/static/chunks/0idj4tdmyr934.js +1 -0
  199. package/.next/static/chunks/10eoi4q2wk80z.js +1 -0
  200. package/.next/static/chunks/10refkmyp9rbl.css +3 -0
  201. package/.next/static/chunks/{07lhk_q6pmm3r.js → 10u3y4bw1ayzs.js} +1 -1
  202. package/.next/static/chunks/{00gq-v0e07i1q.js → 115dplafwys-z.js} +1 -1
  203. package/.next/static/chunks/12-9memveha-v.js +1 -0
  204. package/.next/static/chunks/163s8y.j70104.js +4 -0
  205. package/.next/static/chunks/turbopack-0k9twle9a8sh6.js +1 -0
  206. package/.next/types/routes.d.ts +8 -2
  207. package/.next/types/validator.ts +54 -0
  208. package/README.md +57 -17
  209. package/bin/vibemeter-float.swift +970 -0
  210. package/bin/vibemeter-notify.sh +172 -0
  211. package/bin/vibemeter.mjs +385 -7
  212. package/package.json +2 -1
  213. package/public/demo1.png +0 -0
  214. package/public/float-ball.png +0 -0
  215. package/public/float-collapsed.png +0 -0
  216. package/public/float-expanded.png +0 -0
  217. package/public/pay-alipay.jpg +0 -0
  218. package/.next/server/app/_not-found.html +0 -1
  219. package/.next/server/app/_not-found.meta +0 -16
  220. package/.next/server/app/_not-found.rsc +0 -16
  221. package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
  222. package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  223. package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  224. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  225. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  226. package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
  227. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js +0 -96
  228. package/.next/server/chunks/[root-of-the-server]__0y68a5d._.js.map +0 -1
  229. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js +0 -3
  230. package/.next/server/chunks/ssr/[root-of-the-server]__054lv8d._.js.map +0 -1
  231. package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
  232. package/.next/server/chunks/ssr/[root-of-the-server]__098zro9._.js.map +0 -1
  233. package/.next/server/chunks/ssr/[root-of-the-server]__09hgk-7._.js.map +0 -1
  234. package/.next/server/chunks/ssr/[root-of-the-server]__0cqes87._.js.map +0 -1
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js +0 -3
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0l.drdn._.js.map +0 -1
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js +0 -120
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0v1zqf~._.js.map +0 -1
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +0 -3
  240. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +0 -1
  241. package/.next/server/chunks/ssr/_0ye~8el._.js +0 -7
  242. package/.next/server/chunks/ssr/_0ye~8el._.js.map +0 -1
  243. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
  244. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
  245. package/.next/server/chunks/ssr/node_modules_0i2xw~e._.js.map +0 -1
  246. package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
  247. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js +0 -3
  248. package/.next/server/chunks/ssr/node_modules_next_dist_0gsjr7_._.js.map +0 -1
  249. package/.next/server/pages/404.html +0 -1
  250. package/.next/static/chunks/002~6040mndie.css +0 -3
  251. package/.next/static/chunks/02g3221oh~3le.js +0 -2
  252. package/.next/static/chunks/0erq0bmub6w_z.js +0 -2
  253. package/.next/static/chunks/0ljfidstam_7k.js +0 -1
  254. package/.next/static/chunks/0pqt~8bl3ukh4.js +0 -4
  255. package/.next/static/chunks/turbopack-14vio.b1b9i4l.js +0 -1
  256. /package/.next/server/chunks/{[root-of-the-server]__0g0u0lm._.js.map → [root-of-the-server]__024yzee._.js.map} +0 -0
  257. /package/.next/server/chunks/{[root-of-the-server]__00q0o~z._.js.map → [root-of-the-server]__082iwfa._.js.map} +0 -0
  258. /package/.next/server/chunks/{[root-of-the-server]__0-74syk._.js.map → [root-of-the-server]__0ru3_it._.js.map} +0 -0
  259. /package/.next/server/chunks/{[root-of-the-server]__0866q87._.js.map → [root-of-the-server]__0xa4dzi._.js.map} +0 -0
  260. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_buildManifest.js +0 -0
  261. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_clientMiddlewareManifest.js +0 -0
  262. /package/.next/static/{Ong62ufsHaRU36s0QK5ZZ → _Y03MiN6NI16Ms86q6vCJ}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/next/dist/client/app-dir/link.js/__nextjs-internal-proxy.cjs","../../../../node_modules/next/src/client/app-dir/link.tsx","../../../../node_modules/next/src/client/app-dir/link.react-server.tsx","../../../../src/components/LocaleSwitcher.tsx/__nextjs-internal-proxy.mjs","../../../../src/lib/i18n/messages.ts","../../../../src/lib/i18n/index.ts"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nconst { createClientModuleProxy } = require(\"react-server-dom-turbopack/server\");\n\n__turbopack_context__.n(createClientModuleProxy(\"[project]/node_modules/next/dist/client/app-dir/link.js\"));\n","'use client'\n\nimport React, { createContext, useContext, useOptimistic, useRef } from 'react'\nimport type { UrlObject } from 'url'\nimport { formatUrl } from '../../shared/lib/router/utils/format-url'\nimport { AppRouterContext } from '../../shared/lib/app-router-context.shared-runtime'\nimport { useMergedRef } from '../use-merged-ref'\nimport { isAbsoluteUrl } from '../../shared/lib/utils'\nimport { addBasePath } from '../add-base-path'\nimport { warnOnce } from '../../shared/lib/utils/warn-once'\nimport { ScrollBehavior } from '../components/router-reducer/router-reducer-types'\nimport type { PENDING_LINK_STATUS } from '../components/links'\nimport {\n IDLE_LINK_STATUS,\n mountLinkInstance,\n onNavigationIntent,\n unmountLinkForCurrentNavigation,\n unmountPrefetchableInstance,\n type LinkInstance,\n} from '../components/links'\nimport { isLocalURL } from '../../shared/lib/router/utils/is-local-url'\nimport {\n FetchStrategy,\n type PrefetchTaskFetchStrategy,\n} from '../components/segment-cache/types'\nimport { errorOnce } from '../../shared/lib/utils/error-once'\n\ntype Url = string | UrlObject\ntype RequiredKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? never : K\n}[keyof T]\ntype OptionalKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? K : never\n}[keyof T]\n\ntype OnNavigateEventHandler = (event: { preventDefault: () => void }) => void\n\ntype InternalLinkProps = {\n /**\n * **Required**. The path or URL to navigate to. It can also be an object (similar to `URL`).\n *\n * @example\n * ```tsx\n * // Navigate to /dashboard:\n * <Link href=\"/dashboard\">Dashboard</Link>\n *\n * // Navigate to /about?name=test:\n * <Link href={{ pathname: '/about', query: { name: 'test' } }}>\n * About\n * </Link>\n * ```\n *\n * @remarks\n * - For external URLs, use a fully qualified URL such as `https://...`.\n * - In the App Router, dynamic routes must not include bracketed segments in `href`.\n */\n href: Url\n\n /**\n * @deprecated v10.0.0: `href` props pointing to a dynamic route are\n * automatically resolved and no longer require the `as` prop.\n */\n as?: Url\n\n /**\n * Replace the current `history` state instead of adding a new URL into the stack.\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/about\" replace>\n * About (replaces the history state)\n * </Link>\n * ```\n */\n replace?: boolean\n\n /**\n * Whether to override the default scroll behavior. If `true`, Next.js attempts to maintain\n * the scroll position if the newly navigated page is still visible. If not, it scrolls to the top.\n *\n * If `false`, Next.js will not modify the scroll behavior at all.\n *\n * @defaultValue `true`\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" scroll={false}>\n * No auto scroll\n * </Link>\n * ```\n */\n scroll?: boolean\n\n /**\n * Update the path of the current page without rerunning data fetching methods\n * like `getStaticProps`, `getServerSideProps`, or `getInitialProps`.\n *\n * @remarks\n * `shallow` only applies to the Pages Router. For the App Router, see the\n * [following documentation](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#using-the-native-history-api).\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/blog\" shallow>\n * Shallow navigation\n * </Link>\n * ```\n */\n shallow?: boolean\n\n /**\n * Forces `Link` to pass its `href` to the child component. Useful if the child is a custom\n * component that wraps an `<a>` tag, or if you're using certain styling libraries.\n *\n * @defaultValue `false`\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" passHref legacyBehavior>\n * <MyStyledAnchor>Dashboard</MyStyledAnchor>\n * </Link>\n * ```\n */\n passHref?: boolean\n\n /**\n * Prefetch the page in the background.\n * Any `<Link />` that is in the viewport (initially or through scroll) will be prefetched.\n * Prefetch can be disabled by passing `prefetch={false}`.\n *\n * @remarks\n * Prefetching is only enabled in production.\n *\n * - In the **App Router**:\n * - `\"auto\"`, `null`, `undefined` (default): Prefetch behavior depends on static vs dynamic routes:\n * - Static routes: fully prefetched\n * - Dynamic routes: partial prefetch to the nearest segment with a `loading.js`\n * - `true`: Always prefetch the full route and data.\n * - `false`: Disable prefetching on both viewport and hover.\n * - In the **Pages Router**:\n * - `true` (default): Prefetches the route and data in the background on viewport or hover.\n * - `false`: Prefetch only on hover, not on viewport.\n *\n * @defaultValue `true` (Pages Router) or `null` (App Router)\n *\n * @example\n * ```tsx\n * <Link href=\"/dashboard\" prefetch={false}>\n * Dashboard\n * </Link>\n * ```\n */\n prefetch?: boolean | 'auto' | null\n\n /**\n * (unstable) Switch to a full prefetch on hover. Effectively the same as\n * updating the prefetch prop to `true` in a mouse event.\n */\n unstable_dynamicOnHover?: boolean\n\n /**\n * The active locale is automatically prepended in the Pages Router. `locale` allows for providing\n * a different locale, or can be set to `false` to opt out of automatic locale behavior.\n *\n * @remarks\n * Note: locale only applies in the Pages Router and is ignored in the App Router.\n *\n * @example\n * ```tsx\n * // Use the 'fr' locale:\n * <Link href=\"/about\" locale=\"fr\">\n * About (French)\n * </Link>\n *\n * // Disable locale prefix:\n * <Link href=\"/about\" locale={false}>\n * About (no locale prefix)\n * </Link>\n * ```\n */\n locale?: string | false\n\n /**\n * Enable legacy link behavior.\n *\n * @deprecated This will be removed in a future version\n * @defaultValue `false`\n * @see https://github.com/vercel/next.js/commit/489e65ed98544e69b0afd7e0cfc3f9f6c2b803b7\n */\n legacyBehavior?: boolean\n\n /**\n * Optional event handler for when the mouse pointer is moved onto the `<Link>`.\n */\n onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is touched.\n */\n onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is clicked.\n */\n onClick?: React.MouseEventHandler<HTMLAnchorElement>\n\n /**\n * Optional event handler for when the `<Link>` is navigated.\n */\n onNavigate?: OnNavigateEventHandler\n\n /**\n * Transition types to apply when navigating. These types are passed to\n * [`React.addTransitionType`](https://react.dev/reference/react/addTransitionType)\n * inside the navigation transition, enabling\n * [`<ViewTransition>`](https://react.dev/reference/react/ViewTransition) components\n * to apply different animations based on the type of navigation.\n *\n * @example\n * ```tsx\n * <Link href=\"/about\" transitionTypes={['slide-in']}>About</Link>\n * ```\n */\n transitionTypes?: string[]\n}\n\n// TODO-APP: Include the full set of Anchor props\n// adding this to the publicly exported type currently breaks existing apps\n\n// `RouteInferType` is a stub here to avoid breaking `typedRoutes` when the type\n// isn't generated yet. It will be replaced when type generation runs.\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type LinkProps<RouteInferType = any> = InternalLinkProps\ntype LinkPropsRequired = RequiredKeys<LinkProps>\ntype LinkPropsOptional = OptionalKeys<Omit<InternalLinkProps, 'locale'>>\n\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement\n const target = eventTarget.getAttribute('target')\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\nfunction linkClicked(\n e: React.MouseEvent,\n href: string,\n linkInstanceRef: React.RefObject<LinkInstance | null>,\n replace?: boolean,\n scroll?: boolean,\n onNavigate?: OnNavigateEventHandler,\n transitionTypes?: string[]\n): void {\n if (typeof window !== 'undefined') {\n const { nodeName } = e.currentTarget\n\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === 'A'\n if (\n (isAnchorNodeName && isModifiedEvent(e)) ||\n e.currentTarget.hasAttribute('download')\n ) {\n // ignore click for browser’s default behavior\n return\n }\n\n if (!isLocalURL(href)) {\n if (replace) {\n // browser default behavior does not replace the history state\n // so we need to do it manually\n e.preventDefault()\n location.replace(href)\n }\n\n // ignore click for browser’s default behavior\n return\n }\n\n e.preventDefault()\n\n if (onNavigate) {\n let isDefaultPrevented = false\n\n onNavigate({\n preventDefault: () => {\n isDefaultPrevented = true\n },\n })\n\n if (isDefaultPrevented) {\n return\n }\n }\n\n const { dispatchNavigateAction } =\n require('../components/app-router-instance') as typeof import('../components/app-router-instance')\n\n React.startTransition(() => {\n dispatchNavigateAction(\n href,\n replace ? 'replace' : 'push',\n scroll === false ? ScrollBehavior.NoScroll : ScrollBehavior.Default,\n linkInstanceRef.current,\n transitionTypes\n )\n })\n }\n}\n\nfunction formatStringOrUrl(urlObjOrString: UrlObject | string): string {\n if (typeof urlObjOrString === 'string') {\n return urlObjOrString\n }\n\n return formatUrl(urlObjOrString)\n}\n\n/**\n * A React component that extends the HTML `<a>` element to provide\n * [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching)\n * and client-side navigation. This is the primary way to navigate between routes in Next.js.\n *\n * @remarks\n * - Prefetching is only enabled in production.\n *\n * @see https://nextjs.org/docs/app/api-reference/components/link\n */\nexport default function LinkComponent(\n props: LinkProps & {\n children: React.ReactNode\n ref: React.Ref<HTMLAnchorElement>\n }\n) {\n const [linkStatus, setOptimisticLinkStatus] = useOptimistic(IDLE_LINK_STATUS)\n\n let children: React.ReactNode\n\n const linkInstanceRef = useRef<LinkInstance | null>(null)\n\n const {\n href: hrefProp,\n as: asProp,\n children: childrenProp,\n prefetch: prefetchProp = null,\n passHref,\n replace,\n shallow,\n scroll,\n onClick,\n onMouseEnter: onMouseEnterProp,\n onTouchStart: onTouchStartProp,\n legacyBehavior = false,\n onNavigate,\n transitionTypes,\n ref: forwardedRef,\n unstable_dynamicOnHover,\n ...restProps\n } = props\n\n children = childrenProp\n\n if (\n legacyBehavior &&\n (typeof children === 'string' || typeof children === 'number')\n ) {\n children = <a>{children}</a>\n }\n\n const router = React.useContext(AppRouterContext)\n\n const prefetchEnabled = prefetchProp !== false\n\n const fetchStrategy =\n prefetchProp !== false\n ? getFetchStrategyFromPrefetchProp(prefetchProp)\n : // TODO: it makes no sense to assign a fetchStrategy when prefetching is disabled.\n FetchStrategy.PPR\n\n if (process.env.NODE_ENV !== 'production') {\n function createPropError(args: {\n key: string\n expected: string\n actual: string\n }) {\n return new Error(\n `Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`<Link>\\`, but got \\`${args.actual}\\` instead.` +\n (typeof window !== 'undefined'\n ? \"\\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n\n // TypeScript trick for type-guarding:\n const requiredPropsGuard: Record<LinkPropsRequired, true> = {\n href: true,\n } as const\n const requiredProps: LinkPropsRequired[] = Object.keys(\n requiredPropsGuard\n ) as LinkPropsRequired[]\n requiredProps.forEach((key: LinkPropsRequired) => {\n if (key === 'href') {\n if (\n props[key] == null ||\n (typeof props[key] !== 'string' && typeof props[key] !== 'object')\n ) {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key],\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n\n // TypeScript trick for type-guarding:\n const optionalPropsGuard: Record<LinkPropsOptional, true> = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n unstable_dynamicOnHover: true,\n onClick: true,\n onMouseEnter: true,\n onTouchStart: true,\n legacyBehavior: true,\n onNavigate: true,\n transitionTypes: true,\n } as const\n const optionalProps: LinkPropsOptional[] = Object.keys(\n optionalPropsGuard\n ) as LinkPropsOptional[]\n optionalProps.forEach((key: LinkPropsOptional) => {\n const valType = typeof props[key]\n\n if (key === 'as') {\n if (props[key] && valType !== 'string' && valType !== 'object') {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: valType,\n })\n }\n } else if (\n key === 'onClick' ||\n key === 'onMouseEnter' ||\n key === 'onTouchStart' ||\n key === 'onNavigate'\n ) {\n if (props[key] && valType !== 'function') {\n throw createPropError({\n key,\n expected: '`function`',\n actual: valType,\n })\n }\n } else if (\n key === 'replace' ||\n key === 'scroll' ||\n key === 'shallow' ||\n key === 'passHref' ||\n key === 'legacyBehavior' ||\n key === 'unstable_dynamicOnHover'\n ) {\n if (props[key] != null && valType !== 'boolean') {\n throw createPropError({\n key,\n expected: '`boolean`',\n actual: valType,\n })\n }\n } else if (key === 'prefetch') {\n if (\n props[key] != null &&\n valType !== 'boolean' &&\n props[key] !== 'auto'\n ) {\n throw createPropError({\n key,\n expected: '`boolean | \"auto\"`',\n actual: valType,\n })\n }\n } else if (key === 'transitionTypes') {\n if (props[key] != null && !Array.isArray(props[key])) {\n throw createPropError({\n key,\n expected: '`string[]`',\n actual: valType,\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n const _: never = key\n }\n })\n }\n\n const resolvedHref = asProp || hrefProp\n const formattedHref = formatStringOrUrl(resolvedHref)\n\n if (process.env.NODE_ENV !== 'production') {\n if (props.locale) {\n warnOnce(\n 'The `locale` prop is not supported in `next/link` while using the `app` router. Read more about app router internalization: https://nextjs.org/docs/app/building-your-application/routing/internationalization'\n )\n }\n if (!asProp) {\n let href: string | undefined\n if (typeof resolvedHref === 'string') {\n href = resolvedHref\n } else if (\n typeof resolvedHref === 'object' &&\n typeof resolvedHref.pathname === 'string'\n ) {\n href = resolvedHref.pathname\n }\n\n if (href) {\n const hasDynamicSegment = href\n .split('/')\n .some((segment) => segment.startsWith('[') && segment.endsWith(']'))\n\n if (hasDynamicSegment) {\n throw new Error(\n `Dynamic href \\`${href}\\` found in <Link> while using the \\`/app\\` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href`\n )\n }\n }\n }\n }\n\n // This will return the first child, if multiple are provided it will throw an error\n let child: any\n if (legacyBehavior) {\n if ((children as any)?.$$typeof === Symbol.for('react.lazy')) {\n throw new Error(\n `\\`<Link legacyBehavior>\\` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's \\`<a>\\` tag.`\n )\n }\n\n if (process.env.NODE_ENV === 'development') {\n if (onClick) {\n console.warn(\n `\"onClick\" was passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link`\n )\n }\n if (onMouseEnterProp) {\n console.warn(\n `\"onMouseEnter\" was passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`\n )\n }\n try {\n child = React.Children.only(children)\n } catch (err) {\n if (!children) {\n throw new Error(\n `No children were passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but one child is required https://nextjs.org/docs/messages/link-no-children`\n )\n }\n throw new Error(\n `Multiple children were passed to <Link> with \\`href\\` of \\`${formattedHref}\\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` +\n (typeof window !== 'undefined'\n ? \" \\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n } else {\n child = React.Children.only(children)\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if ((children as any)?.type === 'a') {\n throw new Error(\n 'Invalid <Link> with <a> child. Please remove <a> or use <Link legacyBehavior>.\\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor'\n )\n }\n }\n }\n\n const childRef: any = legacyBehavior\n ? child && typeof child === 'object' && child.ref\n : forwardedRef\n\n // Use a callback ref to attach an IntersectionObserver to the anchor tag on\n // mount. In the future we will also use this to keep track of all the\n // currently mounted <Link> instances, e.g. so we can re-prefetch them after\n // a revalidation or refresh.\n const observeLinkVisibilityOnMount = React.useCallback(\n (element: HTMLAnchorElement | SVGAElement) => {\n if (router !== null) {\n linkInstanceRef.current = mountLinkInstance(\n element,\n formattedHref,\n router,\n fetchStrategy,\n prefetchEnabled,\n setOptimisticLinkStatus\n )\n }\n\n return () => {\n if (linkInstanceRef.current) {\n unmountLinkForCurrentNavigation(linkInstanceRef.current)\n linkInstanceRef.current = null\n }\n unmountPrefetchableInstance(element)\n }\n },\n [\n prefetchEnabled,\n formattedHref,\n router,\n fetchStrategy,\n setOptimisticLinkStatus,\n ]\n )\n\n const mergedRef = useMergedRef(observeLinkVisibilityOnMount, childRef)\n\n const childProps: {\n onTouchStart?: React.TouchEventHandler<HTMLAnchorElement>\n onMouseEnter: React.MouseEventHandler<HTMLAnchorElement>\n onClick: React.MouseEventHandler<HTMLAnchorElement>\n href?: string\n ref?: any\n } = {\n ref: mergedRef,\n onClick(e) {\n if (process.env.NODE_ENV !== 'production') {\n if (!e) {\n throw new Error(\n `Component rendered inside next/link has to pass click event to \"onClick\" prop.`\n )\n }\n }\n\n if (!legacyBehavior && typeof onClick === 'function') {\n onClick(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onClick === 'function'\n ) {\n child.props.onClick(e)\n }\n\n if (!router) {\n return\n }\n if (e.defaultPrevented) {\n return\n }\n linkClicked(\n e,\n formattedHref,\n linkInstanceRef,\n replace,\n scroll,\n onNavigate,\n transitionTypes\n )\n },\n onMouseEnter(e) {\n if (!legacyBehavior && typeof onMouseEnterProp === 'function') {\n onMouseEnterProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onMouseEnter === 'function'\n ) {\n child.props.onMouseEnter(e)\n }\n\n if (!router) {\n return\n }\n if (!prefetchEnabled || process.env.NODE_ENV === 'development') {\n return\n }\n\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true\n onNavigationIntent(\n e.currentTarget as HTMLAnchorElement | SVGAElement,\n upgradeToDynamicPrefetch\n )\n },\n onTouchStart: process.env.__NEXT_LINK_NO_TOUCH_START\n ? undefined\n : function onTouchStart(e) {\n if (!legacyBehavior && typeof onTouchStartProp === 'function') {\n onTouchStartProp(e)\n }\n\n if (\n legacyBehavior &&\n child.props &&\n typeof child.props.onTouchStart === 'function'\n ) {\n child.props.onTouchStart(e)\n }\n\n if (!router) {\n return\n }\n if (!prefetchEnabled) {\n return\n }\n\n const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true\n onNavigationIntent(\n e.currentTarget as HTMLAnchorElement | SVGAElement,\n upgradeToDynamicPrefetch\n )\n },\n }\n\n // If the url is absolute, we can bypass the logic to prepend the basePath.\n if (isAbsoluteUrl(formattedHref)) {\n childProps.href = formattedHref\n } else if (\n !legacyBehavior ||\n passHref ||\n (child.type === 'a' && !('href' in child.props))\n ) {\n childProps.href = addBasePath(formattedHref)\n }\n\n let link: React.ReactNode\n\n if (legacyBehavior) {\n if (process.env.NODE_ENV === 'development') {\n errorOnce(\n '`legacyBehavior` is deprecated and will be removed in a future ' +\n 'release. A codemod is available to upgrade your components:\\n\\n' +\n 'npx @next/codemod@latest new-link .\\n\\n' +\n 'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components'\n )\n }\n link = React.cloneElement(child, childProps)\n } else {\n link = (\n <a {...restProps} {...childProps}>\n {children}\n </a>\n )\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatus}>\n {link}\n </LinkStatusContext.Provider>\n )\n}\n\nconst LinkStatusContext = createContext<\n typeof PENDING_LINK_STATUS | typeof IDLE_LINK_STATUS\n>(IDLE_LINK_STATUS)\n\nexport const useLinkStatus = () => {\n return useContext(LinkStatusContext)\n}\n\nfunction getFetchStrategyFromPrefetchProp(\n prefetchProp: Exclude<LinkProps['prefetch'], undefined | false>\n): PrefetchTaskFetchStrategy {\n if (process.env.__NEXT_CACHE_COMPONENTS) {\n if (prefetchProp === true) {\n return FetchStrategy.Full\n }\n\n // `null` or `\"auto\"`: this is the default \"auto\" mode, where we will prefetch partially if the link is in the viewport.\n // This will also include invalid prop values that don't match the types specified here.\n // (although those should've been filtered out by prop validation in dev)\n prefetchProp satisfies null | 'auto'\n return FetchStrategy.PPR\n } else {\n return prefetchProp === null || prefetchProp === 'auto'\n ? // We default to PPR, and we'll discover whether or not the route supports it with the initial prefetch.\n FetchStrategy.PPR\n : // In the old implementation without runtime prefetches, `prefetch={true}` forces all dynamic data to be prefetched.\n // To preserve backwards-compatibility, anything other than `false`, `null`, or `\"auto\"` results in a full prefetch.\n // (although invalid values should've been filtered out by prop validation in dev)\n FetchStrategy.Full\n }\n}\n","import type { ComponentProps } from 'react'\nimport ClientLinkComponent, { type LinkProps, useLinkStatus } from './link'\n\nexport default function LinkComponent(\n props: ComponentProps<typeof ClientLinkComponent>\n) {\n const isLegacyBehavior = props.legacyBehavior\n const childIsHostComponent =\n typeof props.children === 'string' ||\n typeof props.children === 'number' ||\n typeof (props.children as any)?.type === 'string'\n const childIsClientComponent =\n (props.children as any)?.type?.$$typeof ===\n Symbol.for('react.client.reference')\n\n if (isLegacyBehavior && !childIsHostComponent && !childIsClientComponent) {\n if ((props.children as any)?.type?.$$typeof === Symbol.for('react.lazy')) {\n console.error(\n `Using a Lazy Component as a direct child of \\`<Link legacyBehavior>\\` from a Server Component is not supported. If you need legacyBehavior, wrap your Lazy Component in a Client Component that renders the Link's \\`<a>\\` tag.`\n )\n } else {\n console.error(\n `Using a Server Component as a direct child of \\`<Link legacyBehavior>\\` is not supported. If you need legacyBehavior, wrap your Server Component in a Client Component that renders the Link's \\`<a>\\` tag.`\n )\n }\n }\n\n return <ClientLinkComponent {...props} />\n}\n\nexport { type LinkProps, useLinkStatus }\n","// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const LocaleSwitcher = registerClientReference(\n function() { throw new Error(\"Attempted to call LocaleSwitcher() from the server but LocaleSwitcher is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/src/components/LocaleSwitcher.tsx\",\n \"LocaleSwitcher\",\n);\n","// All user-facing strings. Keep keys hierarchical so it's clear which screen\n// owns which copy. Translations are full sentences (not word-by-word) so the\n// other locale can flow naturally.\n\nimport type { Locale } from './types';\n\nexport type Messages = Record<string, string>;\n\nconst zh: Messages = {\n // ── common ────────────────────────────────────────────────────────────\n 'common.dashboard': '仪表盘',\n 'common.admin': '管理',\n 'common.settings': '设置',\n 'common.cancel': '取消',\n 'common.save': '保存',\n 'common.delete': '删除',\n 'common.close': '关闭',\n 'common.add': '添加',\n 'common.edit': '编辑',\n 'common.refresh': '刷新',\n 'common.loading': '加载中…',\n 'common.unknown': '未知',\n 'common.all': '全部',\n 'common.empty': '暂无数据',\n 'common.language': '语言',\n\n // ── header / layout ───────────────────────────────────────────────────\n 'header.tagline': '量化你的 AI 编码节奏 · 本地优先 · 数据永不离开本机',\n 'header.langZh': '中文',\n 'header.langEn': 'EN',\n\n // ── dashboard / filters ───────────────────────────────────────────────\n 'dashboard.refreshData': '刷新数据',\n 'dashboard.refreshing': '刷新中…',\n 'dashboard.toolAll': '全部',\n 'dashboard.toolClaude': 'Claude Code',\n 'dashboard.toolCodex': 'Codex',\n 'dashboard.toolCursor': 'Cursor',\n 'dashboard.dateToday': '今天',\n 'dashboard.date7d': '近 7 天',\n 'dashboard.date30d': '近 30 天',\n 'dashboard.dateAll': '全部',\n 'dashboard.codexAccount': 'Codex 账户',\n 'dashboard.codexAccountAll': '所有 Codex 账户',\n 'dashboard.codexHistoryFilter.current': '仅当前账户',\n 'dashboard.codexHistoryFilter.saved': '仅已保存账户的历史',\n 'dashboard.codexHistoryFilter.all': '所有已保存与历史 Codex 使用',\n 'dashboard.codexSwitchHint': '当前选项只筛选历史。如要采集新数据,请到「管理」切换账户。',\n 'dashboard.window5h': '5h 窗口',\n 'dashboard.windowWeekly': '本周窗口',\n 'dashboard.remaining': '剩余',\n 'dashboard.used': '已用',\n 'dashboard.noData': '暂无数据',\n 'dashboard.todaySessions': '今日会话',\n 'dashboard.totalSessions': '累计会话',\n 'dashboard.dateToday2': '今天',\n 'dashboard.date7days': '近 7 天',\n 'dashboard.date30days': '近 30 天',\n 'dashboard.dateAlltime': '全部时间',\n 'dashboard.refreshFailed': '刷新失败',\n 'dashboard.scanned': '扫了 {n} 条日志,耗时 {seconds}s',\n 'dashboard.codexCurrentOnly': '仅当前账户',\n 'dashboard.codexSavedOnly': '仅已保存账户的历史',\n 'dashboard.codexAllUsage': '所有已保存与历史 Codex 使用',\n 'dashboard.window7d': '7 天预算',\n 'dashboard.codexLabel': 'codex · 所有账户',\n 'dashboard.codexLabelPrefix': 'codex',\n 'dashboard.allAgents': '所有 agents',\n 'dashboard.claudeCodeLower': 'claude code',\n 'dashboard.noSnapshot': '该账户暂无 rate-limit 快照',\n 'dashboard.useCodexThenRefresh': '在 Codex 用一次再刷新',\n 'dashboard.switchAdminThenUse': '到「管理」切换后用一次 Codex,再刷新',\n 'dashboard.resetting': '重置中…',\n 'dashboard.resetsAt': '{date}({rel}后)重置',\n 'dashboard.short': 'all',\n\n // ── cards ─────────────────────────────────────────────────────────────\n 'card.spending.title': '消费 / 用量',\n 'card.spending.claudeCost': 'claude code 累计',\n 'card.spending.codexTokens': 'codex tokens',\n 'card.spending.last14d': '近 14 天',\n 'card.spending.noCursor': '当前筛选下无消费数据(cursor 无 token 计费)',\n 'card.spending.legendClaude': 'claude ($)',\n 'card.spending.legendCodex': 'codex (tokens)',\n 'card.activity.title': '活跃度',\n 'card.activity.streakDays': '连续 {n} 天',\n 'card.activity.peakSlot': '高峰时段',\n 'card.activity.todayTimeline': '今日时间线',\n 'card.activity.viewPattern': '热力图',\n 'card.activity.viewToday': '今日',\n 'card.activity.dayStreak': '天连续',\n 'card.activity.longest': '最长',\n 'card.activity.activeDays': '活跃天',\n 'card.activity.total': '累计',\n 'card.activity.peakSlotFmt': '高峰时段:{day} {hour}:00({mins})',\n 'card.activity.dayMon': '一',\n 'card.activity.dayTue': '二',\n 'card.activity.dayWed': '三',\n 'card.activity.dayThu': '四',\n 'card.activity.dayFri': '五',\n 'card.activity.daySat': '六',\n 'card.activity.daySun': '日',\n 'card.activity.less': '少',\n 'card.activity.more': '多',\n 'card.activity.dayHeader': '{date} · {n} 次会话 · 累计 {hours}h',\n 'card.activity.noToday': '今天还没有会话',\n 'card.achievements.title': '成就',\n 'card.achievements.unlocked': '已解锁 {n} / {total}',\n 'card.achievements.showLess': '收起',\n 'card.achievements.showAll': '查看全部({n})',\n 'achv.sessions-100.title': '百战不殆', 'achv.sessions-100.desc': '累计 100 个会话',\n 'achv.sessions-500.title': '已成习惯', 'achv.sessions-500.desc': '累计 500 个会话',\n 'achv.sessions-1000.title': '千锤百炼', 'achv.sessions-1000.desc': '累计 1000 个会话',\n 'achv.streak-7.title': '一周连击', 'achv.streak-7.desc': '连续编码 7 天',\n 'achv.streak-30.title': '月度坚持', 'achv.streak-30.desc': '连续编码 30 天',\n 'achv.spend-10.title': '小试牛刀', 'achv.spend-10.desc': 'Claude 累计花费 $10+',\n 'achv.spend-100.title': '挥金如土', 'achv.spend-100.desc': 'Claude 累计花费 $100+',\n 'achv.tokens-100m.title': 'Token 富翁', 'achv.tokens-100m.desc': 'Codex 累计 100M tokens',\n 'achv.tokens-1b.title': 'Token 大户', 'achv.tokens-1b.desc': 'Codex 累计 1B tokens',\n 'achv.marathon-4h.title': '马拉松选手', 'achv.marathon-4h.desc': '单次会话超过 4 小时',\n 'achv.marathon-8h.title': '通宵达旦', 'achv.marathon-8h.desc': '单次会话超过 8 小时',\n 'achv.projects-10.title': '博学多才', 'achv.projects-10.desc': '在 10+ 个项目里工作过',\n 'achv.projects-30.title': '杂家', 'achv.projects-30.desc': '在 30+ 个项目里工作过',\n 'achv.night-owl.title': '夜猫子', 'achv.night-owl.desc': '过午夜的会话 10+ 次',\n 'achv.early-bird.title': '晨型人', 'achv.early-bird.desc': '早 7 点前的会话 5+ 次',\n 'achv.multi-tool.title': '多面手', 'achv.multi-tool.desc': '用过 3 种不同的工具',\n 'card.burndown.title': '近 7 天用量',\n 'card.burndown.header': '近 7 天用量 · {label}',\n 'card.burndown.notEnough': '数据不足以画图',\n 'card.burndown.tipUsed': '已用',\n 'card.burndown.legend5h': '5h',\n 'card.burndown.legend7d': '7d',\n 'card.leaderboard.title': '项目榜',\n 'card.leaderboard.hours': '小时',\n 'card.leaderboard.sessions': '会话',\n 'card.leaderboard.tools': '工具',\n 'card.leaderboard.noProjects': '还没有项目数据',\n 'card.hotspots.title': '文件热点',\n 'card.hotspots.sessions': '次会话',\n 'card.toolSplit.title': '工具分布',\n 'card.toolSplit.sessions': '次会话',\n 'card.toolSplit.totalSessions': '共 {n} 次会话',\n 'card.sessions.title': '会话',\n 'card.sessions.search': '搜项目 / 标题…',\n 'card.sessions.tag': '标签',\n 'card.sessions.tool': '工具',\n 'card.sessions.project': '项目 · 标题',\n 'card.sessions.duration': '时长',\n 'card.sessions.started': '开始',\n 'card.sessions.status': '状态',\n 'card.sessions.tags': '标签',\n 'card.sessions.recent': '最近会话',\n 'card.sessions.activeCount': '{active} 进行中 · {shown}/{total}',\n 'card.sessions.noMatch': '没有匹配的会话。',\n 'card.sessions.active': '进行中',\n 'card.sessions.done': '完成',\n 'card.sessions.tagPlaceholder': '标签…',\n\n // ── admin ─────────────────────────────────────────────────────────────\n 'admin.title': 'Vibemeter · 管理',\n 'admin.subtitle': '本地 Codex 账户切换 · token 永不离开本机',\n 'admin.activeAccount': '当前 Codex 账户',\n 'admin.importCurrent': '保存当前 Codex 登录',\n 'admin.importing': '保存中…',\n 'admin.switch': '切换',\n 'admin.switching': '切换中…',\n 'admin.deleting': '删除中…',\n 'admin.savedAccounts': '已保存账户',\n 'admin.lastRefresh': '上次刷新',\n 'admin.activeAccountLabel': '当前 Codex 账户',\n 'admin.plan': '套餐',\n 'admin.accountId': '账户 id',\n 'admin.accessToken': '访问 token',\n 'admin.expires': '过期于 {date}',\n 'admin.noAuth': '未在 ~/.codex/auth.json 找到可读的 Codex 凭据。',\n 'admin.localStore': '本地账户存储',\n 'admin.localStoreHint': '快照存在 {path}。Token 落到磁盘是为了支持切换,本页只渲染解码后的元数据。',\n 'admin.colAccount': '账户',\n 'admin.colPlan': '套餐',\n 'admin.colTokens': 'tokens',\n 'admin.colActions': '操作',\n 'admin.noSaved': '还没有已保存的账户。先登录 Codex,再来这里保存当前登录。',\n 'admin.active': '当前',\n 'admin.accessFmt': '访问 {date}',\n 'admin.savedFmt': '保存于 {date}',\n 'admin.importSuccess': '当前 Codex 登录已存入账户列表。',\n 'admin.switchSuccess': 'Codex auth.json 已切换。重启正在运行的 Codex 会话以生效。',\n 'admin.deleteSuccess': '已删除该账户快照。',\n\n // ── settings page ─────────────────────────────────────────────────────\n 'settings.title': 'Vibemeter · 设置',\n 'settings.subtitle': '本地偏好 · 任何配置都不会离开本机',\n\n // ── settings · notify ─────────────────────────────────────────────────\n 'notify.title': '语音 + 系统通知',\n 'notify.subtitle': '仅 macOS。Claude/Codex 完成后,朗读「{tool} {project} 完成」并弹出系统通知。改动 ~/.claude/settings.json 与 ~/.codex/config.toml 前都会备份。',\n 'notify.on': '已开启',\n 'notify.off': '未开启',\n 'notify.claudeStop': 'Claude · Stop',\n 'notify.claudeNotification': 'Claude · Notification',\n 'notify.codexComplete': 'Codex · complete',\n 'notify.foreignNotifyWarning': '检测到 Codex 已配置其他 notify 命令,Vibemeter 不会覆盖:',\n 'notify.foreignNotifyHint': '若想交给 Vibemeter 接管,请手动移除上面那行。',\n 'notify.enable': '开启语音通知',\n 'notify.reapply': '重新套用',\n 'notify.disable': '关闭',\n 'notify.scriptMissing': '语音脚本不存在:{path}。请重装 @hirra/vibemeter。',\n 'notify.hookStop': 'Claude Code Stop hook',\n 'notify.hookNotification': 'Claude Code Notification hook(需介入时)',\n 'notify.hookCodex': 'Codex notify({state})',\n 'notify.hookCodexConfigFound': '已找到配置',\n 'notify.hookCodexConfigMissing': '未找到 ~/.codex/config.toml',\n 'notify.foreignWarn': '检测到 foreign notify',\n 'notify.foreignBody': 'Codex 已经配置了其他 notify 命令,Vibemeter **不会**覆盖:',\n 'notify.foreignRemove': '如需 Vibemeter 接管,请手动移除上面那一行。',\n 'notify.installing': '开启中…',\n 'notify.removing': '关闭中…',\n 'notify.skipNoCodex': 'Codex 配置未找到 — 已跳过',\n 'notify.skipForeign': 'Codex 已有其他 notify 命令,已保留原值:{cmd}',\n 'notify.updated': '已更新。{notes}',\n 'notify.enabledMsg': '语音通知已开启。',\n 'notify.disabledMsg': '语音通知已关闭。',\n\n // ── settings · alerts ─────────────────────────────────────────────────\n 'alerts.title': '额度推送提醒',\n 'alerts.subtitle': 'quota 触发阈值、每日摘要、5h/weekly 重置前提醒 — 推到企业微信群机器人或任意 webhook。webhook 只写本地 {path},{warn}',\n 'alerts.subtitleWarn': '绝不会进 GitHub',\n 'alerts.sectionChannels': '推送通道',\n 'alerts.sectionRules': '触发规则',\n 'alerts.addChannelWxwork': '+ 企业微信',\n 'alerts.addChannelGeneric': '+ 通用 webhook',\n 'alerts.addRuleThreshold': '+ 阈值',\n 'alerts.addRuleDaily': '+ 每日定时',\n 'alerts.addRuleReset': '+ 重置提醒',\n 'alerts.noChannels': '尚未配置任何通道。',\n 'alerts.noRules': '尚未配置任何规则。',\n 'alerts.testBtn': '测试',\n 'alerts.testing': '测试中…',\n 'alerts.sendNow': '现在发摘要',\n 'alerts.sending': '发送中…',\n 'alerts.delete': '删除',\n 'alerts.webhookLabel': 'Webhook URL',\n 'alerts.webhookHintWxwork': '— qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…',\n 'alerts.webhookPlaceholderEdit': '粘贴完整 webhook URL',\n 'alerts.webhookPlaceholderClick': '点击编辑',\n 'alerts.webhookStored': '已存储 — 编辑会替换;不编辑就保持原值',\n 'alerts.editFirst': '请先保存再测试',\n 'alerts.saveBtn': '保存配置',\n 'alerts.saving': '保存中…',\n 'alerts.runAllNow': '立即评估所有规则',\n 'alerts.evaluating': '评估中…',\n 'alerts.savedHint': '已保存。webhook 仅写入本地 ~/.vibemeter/alerts.json,不会上 GitHub。',\n 'alerts.testSuccess': '测试消息推送成功({channel}, {attempts} 次)',\n 'alerts.summarySuccess': '今日摘要推送成功({channel}, {attempts} 次)',\n 'alerts.pushFail': '推送失败:{message}',\n 'alerts.evalDone': '评估完成 — 触发 {fired} 次推送,启用规则 {evaluated} 条',\n 'alerts.kindThreshold': '阈值',\n 'alerts.kindDaily': '每日',\n 'alerts.kindReset': '重置提醒',\n 'alerts.enabled': '启用',\n 'alerts.metric': '指标',\n 'alerts.below': '低于',\n 'alerts.pushTime': '推送时间',\n 'alerts.pushTimeHint': '(本机时区,每天最多一条)',\n 'alerts.window': '窗口',\n 'alerts.minutesBefore': '提前',\n 'alerts.minutesBeforeHint': '分钟(60=1h,1440=1d)',\n 'alerts.remainingAbove': '剩余 ≥',\n 'alerts.remainingAboveHint': '% 时才推(赶在重置前用掉)',\n 'alerts.pushTo': '推送到',\n 'alerts.addChannelFirst': '先添加通道',\n 'alerts.pushLocale': '推送语言',\n 'alerts.pushLocaleHint': '群里发的消息用哪种语言(独立于 UI 语言)',\n 'alerts.pushLocaleZh': '中文',\n 'alerts.pushLocaleEn': 'English',\n 'alerts.defaultLabelWxwork': '企业微信机器人',\n 'alerts.defaultLabelGeneric': '通用 webhook',\n 'alerts.testMsgWord': '测试消息',\n 'alerts.summaryWord': '今日摘要',\n 'alerts.pushFailUnknown': '未知错误',\n 'alerts.metric.claude_5h_remaining_pct': 'Claude Code · 5h 剩余',\n 'alerts.metric.claude_weekly_remaining_pct': 'Claude Code · 本周剩余',\n 'alerts.metric.codex_5h_remaining_pct': 'Codex · 5h 剩余',\n 'alerts.metric.codex_weekly_remaining_pct': 'Codex · 本周剩余',\n 'alerts.resetMetric.claude_5h': 'Claude Code · 5h 窗口',\n 'alerts.resetMetric.claude_weekly': 'Claude Code · 本周窗口',\n 'alerts.resetMetric.codex_5h': 'Codex · 5h 窗口',\n 'alerts.resetMetric.codex_weekly': 'Codex · 本周窗口',\n\n // ── settings · donate ─────────────────────────────────────────────────\n 'donate.title': '觉得好用?请作者喝杯咖啡',\n 'donate.subtitle': 'Vibemeter 完全本地、完全免费。如果它帮你省了时间,欢迎随手打赏 — 无义务。',\n 'donate.alipay': '支付宝',\n 'donate.zoomClose': '关闭',\n 'donate.aside': '扫码即可,金额随意。备注里写一句你最常看哪个数据,下次迭代我会优先做。',\n 'donate.missing': 'QR image not bundled yet — drop it at {path}.',\n\n // ── float widget ──────────────────────────────────────────────────────\n 'float.unknownReset': 'unknown reset',\n 'float.snapshotExpired': 'snapshot expired',\n 'float.noSnapshot': 'no snapshot',\n 'float.justNow': 'just now',\n 'float.minAgo': '{n}m ago',\n 'float.hourAgo': '{n}h ago',\n 'float.currentQuota': 'current quota',\n 'float.noQuota': 'no quota',\n 'float.fiveHRemain': '5h remaining',\n 'float.usedPct': '{pct} used',\n 'float.usedNo': 'No snapshot',\n 'float.refresh': 'Refresh',\n 'float.refreshing': 'Refreshing',\n 'float.statToday': 'today',\n 'float.statTotal': 'total',\n 'float.statWeekly': 'weekly',\n 'float.noToday': 'No sessions today',\n 'float.latest': 'latest',\n};\n\nconst en: Messages = {\n // ── common ────────────────────────────────────────────────────────────\n 'common.dashboard': 'Dashboard',\n 'common.admin': 'Admin',\n 'common.settings': 'Settings',\n 'common.cancel': 'Cancel',\n 'common.save': 'Save',\n 'common.delete': 'Delete',\n 'common.close': 'Close',\n 'common.add': 'Add',\n 'common.edit': 'Edit',\n 'common.refresh': 'Refresh',\n 'common.loading': 'Loading…',\n 'common.unknown': 'unknown',\n 'common.all': 'All',\n 'common.empty': 'no data yet',\n 'common.language': 'Language',\n\n // ── header / layout ───────────────────────────────────────────────────\n 'header.tagline': 'measure your AI coding vibe · local-first · data never leaves this machine',\n 'header.langZh': '中文',\n 'header.langEn': 'EN',\n\n // ── dashboard / filters ───────────────────────────────────────────────\n 'dashboard.refreshData': 'Refresh data',\n 'dashboard.refreshing': 'Refreshing…',\n 'dashboard.toolAll': 'All',\n 'dashboard.toolClaude': 'Claude Code',\n 'dashboard.toolCodex': 'Codex',\n 'dashboard.toolCursor': 'Cursor',\n 'dashboard.dateToday': 'Today',\n 'dashboard.date7d': '7d',\n 'dashboard.date30d': '30d',\n 'dashboard.dateAll': 'All',\n 'dashboard.codexAccount': 'Codex account',\n 'dashboard.codexAccountAll': 'All Codex accounts',\n 'dashboard.codexHistoryFilter.current': 'current account only',\n 'dashboard.codexHistoryFilter.saved': 'saved account history only',\n 'dashboard.codexHistoryFilter.all': 'all saved and legacy Codex usage',\n 'dashboard.codexSwitchHint': 'Dashboard selection filters saved history only. Switch this account in Admin to collect new Codex usage.',\n 'dashboard.window5h': '5h window',\n 'dashboard.windowWeekly': 'weekly window',\n 'dashboard.remaining': 'remaining',\n 'dashboard.used': 'used',\n 'dashboard.noData': 'no data yet',\n 'dashboard.todaySessions': \"Today's sessions\",\n 'dashboard.totalSessions': 'Total sessions',\n 'dashboard.dateToday2': 'Today',\n 'dashboard.date7days': '7 days',\n 'dashboard.date30days': '30 days',\n 'dashboard.dateAlltime': 'All time',\n 'dashboard.refreshFailed': 'Refresh failed',\n 'dashboard.scanned': 'scanned {n} logs in {seconds}s',\n 'dashboard.codexCurrentOnly': 'current account only',\n 'dashboard.codexSavedOnly': 'saved account history only',\n 'dashboard.codexAllUsage': 'all saved and legacy Codex usage',\n 'dashboard.window7d': '7-day budget',\n 'dashboard.codexLabel': 'codex · all accounts',\n 'dashboard.codexLabelPrefix': 'codex',\n 'dashboard.allAgents': 'all agents',\n 'dashboard.claudeCodeLower': 'claude code',\n 'dashboard.noSnapshot': 'no rate-limit snapshot for this account yet',\n 'dashboard.useCodexThenRefresh': 'use Codex once, then Refresh data',\n 'dashboard.switchAdminThenUse': 'switch it in Admin, use Codex once, then Refresh data',\n 'dashboard.resetting': 'resetting…',\n 'dashboard.resetsAt': 'resets at {date} (in {rel})',\n 'dashboard.short': 'all',\n\n // ── cards ─────────────────────────────────────────────────────────────\n 'card.spending.title': 'spending / consumption',\n 'card.spending.claudeCost': 'claude code total',\n 'card.spending.codexTokens': 'codex tokens',\n 'card.spending.last14d': 'last 14 days',\n 'card.spending.noCursor': 'no spending data for cursor',\n 'card.spending.legendClaude': 'claude ($)',\n 'card.spending.legendCodex': 'codex (tokens)',\n 'card.activity.title': 'activity',\n 'card.activity.streakDays': '{n}-day streak',\n 'card.activity.peakSlot': 'peak slot',\n 'card.activity.todayTimeline': \"today's timeline\",\n 'card.activity.viewPattern': 'pattern',\n 'card.activity.viewToday': 'today',\n 'card.activity.dayStreak': 'day streak',\n 'card.activity.longest': 'longest',\n 'card.activity.activeDays': 'active days',\n 'card.activity.total': 'total',\n 'card.activity.peakSlotFmt': 'peak slot: {day} {hour}:00 ({mins})',\n 'card.activity.dayMon': 'Mon',\n 'card.activity.dayTue': 'Tue',\n 'card.activity.dayWed': 'Wed',\n 'card.activity.dayThu': 'Thu',\n 'card.activity.dayFri': 'Fri',\n 'card.activity.daySat': 'Sat',\n 'card.activity.daySun': 'Sun',\n 'card.activity.less': 'less',\n 'card.activity.more': 'more',\n 'card.activity.dayHeader': '{date} · {n} sessions · {hours}h active',\n 'card.activity.noToday': 'no sessions today',\n 'card.achievements.title': 'achievements',\n 'card.achievements.unlocked': '{n} / {total} unlocked',\n 'card.achievements.showLess': 'show less',\n 'card.achievements.showAll': 'show all ({n})',\n 'achv.sessions-100.title': 'Centurion', 'achv.sessions-100.desc': '100 sessions logged',\n 'achv.sessions-500.title': 'Habituated', 'achv.sessions-500.desc': '500 sessions logged',\n 'achv.sessions-1000.title': 'Veteran', 'achv.sessions-1000.desc': '1000 sessions logged',\n 'achv.streak-7.title': 'Week streak', 'achv.streak-7.desc': '7-day coding streak',\n 'achv.streak-30.title': 'Month streak', 'achv.streak-30.desc': '30-day coding streak',\n 'achv.spend-10.title': 'First $10', 'achv.spend-10.desc': 'Claude spend $10+',\n 'achv.spend-100.title': 'Big spender', 'achv.spend-100.desc': 'Claude spend $100+',\n 'achv.tokens-100m.title': 'Token rich', 'achv.tokens-100m.desc': '100M Codex tokens',\n 'achv.tokens-1b.title': 'Token tycoon', 'achv.tokens-1b.desc': '1B Codex tokens',\n 'achv.marathon-4h.title': 'Marathoner', 'achv.marathon-4h.desc': 'Single session 4h+',\n 'achv.marathon-8h.title': 'All-nighter', 'achv.marathon-8h.desc': 'Single session 8h+',\n 'achv.projects-10.title': 'Polymath', 'achv.projects-10.desc': 'Worked on 10+ projects',\n 'achv.projects-30.title': 'Jack of all', 'achv.projects-30.desc': 'Worked on 30+ projects',\n 'achv.night-owl.title': 'Night owl', 'achv.night-owl.desc': 'Past-midnight sessions 10+',\n 'achv.early-bird.title': 'Early bird', 'achv.early-bird.desc': 'Pre-7am sessions 5+',\n 'achv.multi-tool.title': 'Multi-tool', 'achv.multi-tool.desc': 'Used 3 different tools',\n 'card.burndown.title': '7-day burndown',\n 'card.burndown.header': 'usage history (7d) · {label}',\n 'card.burndown.notEnough': 'not enough data yet',\n 'card.burndown.tipUsed': 'used',\n 'card.burndown.legend5h': '5h',\n 'card.burndown.legend7d': '7day',\n 'card.leaderboard.title': 'project leaderboard',\n 'card.leaderboard.hours': 'hours',\n 'card.leaderboard.sessions': 'sessions',\n 'card.leaderboard.tools': 'tools',\n 'card.leaderboard.noProjects': 'no projects yet',\n 'card.hotspots.title': 'file hotspots',\n 'card.hotspots.sessions': 'sessions',\n 'card.toolSplit.title': 'tool split',\n 'card.toolSplit.sessions': 'sessions',\n 'card.toolSplit.totalSessions': '{n} total sessions',\n 'card.sessions.title': 'Sessions',\n 'card.sessions.search': 'search project / title…',\n 'card.sessions.tag': 'tag',\n 'card.sessions.tool': 'tool',\n 'card.sessions.project': 'project · title',\n 'card.sessions.duration': 'dur',\n 'card.sessions.started': 'started',\n 'card.sessions.status': 'status',\n 'card.sessions.tags': 'tags',\n 'card.sessions.recent': 'Recent Sessions',\n 'card.sessions.activeCount': '{active} active · {shown}/{total}',\n 'card.sessions.noMatch': 'No sessions match.',\n 'card.sessions.active': 'active',\n 'card.sessions.done': 'done',\n 'card.sessions.tagPlaceholder': 'tag…',\n\n // ── admin ─────────────────────────────────────────────────────────────\n 'admin.title': 'Vibemeter Admin',\n 'admin.subtitle': 'local Codex account switching · tokens stay on this machine',\n 'admin.activeAccount': 'Active Codex account',\n 'admin.importCurrent': 'Save current Codex login',\n 'admin.importing': 'Saving…',\n 'admin.switch': 'Switch',\n 'admin.switching': 'Switching…',\n 'admin.deleting': 'Deleting…',\n 'admin.savedAccounts': 'Saved accounts',\n 'admin.lastRefresh': 'last refresh',\n 'admin.activeAccountLabel': 'Active Codex account',\n 'admin.plan': 'plan',\n 'admin.accountId': 'account id',\n 'admin.accessToken': 'access token',\n 'admin.expires': 'expires {date}',\n 'admin.noAuth': 'No readable Codex auth found at ~/.codex/auth.json.',\n 'admin.localStore': 'Local account store',\n 'admin.localStoreHint': 'Saved snapshots live in {path}. Tokens are stored on disk for switching, but this page only renders decoded metadata.',\n 'admin.colAccount': 'account',\n 'admin.colPlan': 'plan',\n 'admin.colTokens': 'tokens',\n 'admin.colActions': 'actions',\n 'admin.noSaved': 'No saved accounts yet. Log into Codex, then save the current login here.',\n 'admin.active': 'active',\n 'admin.accessFmt': 'access {date}',\n 'admin.savedFmt': 'saved {date}',\n 'admin.importSuccess': 'Current Codex login saved to the account list.',\n 'admin.switchSuccess': 'Codex auth.json switched. Restart active Codex sessions to use the new account.',\n 'admin.deleteSuccess': 'Saved account removed.',\n\n // ── settings page ─────────────────────────────────────────────────────\n 'settings.title': 'Vibemeter Settings',\n 'settings.subtitle': 'local preferences · nothing leaves this machine',\n\n // ── settings · notify ─────────────────────────────────────────────────\n 'notify.title': 'Voice + system notifications',\n 'notify.subtitle': \"macOS only. When an agent finishes you'll hear a short \\\"{tool} {project} done\\\" and see a banner. ~/.claude/settings.json and ~/.codex/config.toml are backed up before any change.\",\n 'notify.on': 'on',\n 'notify.off': 'off',\n 'notify.claudeStop': 'Claude · Stop',\n 'notify.claudeNotification': 'Claude · Notification',\n 'notify.codexComplete': 'Codex · complete',\n 'notify.foreignNotifyWarning': \"Codex already has a different notify command. Vibemeter will not overwrite it:\",\n 'notify.foreignNotifyHint': \"Remove that line manually if you want Vibemeter to take over.\",\n 'notify.enable': 'Enable voice notifications',\n 'notify.reapply': 'Re-apply',\n 'notify.disable': 'Disable',\n 'notify.scriptMissing': 'Speaker script not found at {path}. Reinstall @hirra/vibemeter.',\n 'notify.hookStop': 'Claude Code Stop hook',\n 'notify.hookNotification': 'Claude Code Notification hook (when permission needed)',\n 'notify.hookCodex': 'Codex notify ({state})',\n 'notify.hookCodexConfigFound': 'config found',\n 'notify.hookCodexConfigMissing': 'no ~/.codex/config.toml',\n 'notify.foreignWarn': 'foreign notify exists',\n 'notify.foreignBody': 'Codex already has a different notify command. Vibemeter will **not** overwrite it:',\n 'notify.foreignRemove': 'Remove that line manually if you want Vibemeter to take over.',\n 'notify.installing': 'Enabling…',\n 'notify.removing': 'Removing…',\n 'notify.skipNoCodex': 'Codex config not found — skipped',\n 'notify.skipForeign': 'Codex notify already set to a different command, left alone: {cmd}',\n 'notify.updated': 'Updated. {notes}',\n 'notify.enabledMsg': 'Voice notifications enabled.',\n 'notify.disabledMsg': 'Voice notifications removed.',\n\n // ── settings · alerts ─────────────────────────────────────────────────\n 'alerts.title': 'Quota push alerts',\n 'alerts.subtitle': 'threshold trips, daily summary, 5h/weekly reset reminders — push to WeChat Work bot or any webhook. Webhook is written to {path} only — {warn}',\n 'alerts.subtitleWarn': 'never reaches GitHub',\n 'alerts.sectionChannels': 'Push channels',\n 'alerts.sectionRules': 'Trigger rules',\n 'alerts.addChannelWxwork': '+ WeChat Work',\n 'alerts.addChannelGeneric': '+ Generic webhook',\n 'alerts.addRuleThreshold': '+ Threshold',\n 'alerts.addRuleDaily': '+ Daily',\n 'alerts.addRuleReset': '+ Reset reminder',\n 'alerts.noChannels': 'No channels yet.',\n 'alerts.noRules': 'No rules yet.',\n 'alerts.testBtn': 'Test',\n 'alerts.testing': 'Testing…',\n 'alerts.sendNow': 'Send summary now',\n 'alerts.sending': 'Sending…',\n 'alerts.delete': 'Delete',\n 'alerts.webhookLabel': 'Webhook URL',\n 'alerts.webhookHintWxwork': '— qyapi.weixin.qq.com/cgi-bin/webhook/send?key=…',\n 'alerts.webhookPlaceholderEdit': 'Paste the full webhook URL',\n 'alerts.webhookPlaceholderClick': 'Click to edit',\n 'alerts.webhookStored': 'Stored — editing replaces; leave alone to keep current.',\n 'alerts.editFirst': 'Save first before testing',\n 'alerts.saveBtn': 'Save',\n 'alerts.saving': 'Saving…',\n 'alerts.runAllNow': 'Evaluate all rules now',\n 'alerts.evaluating': 'Evaluating…',\n 'alerts.savedHint': 'Saved. Webhook is only written to ~/.vibemeter/alerts.json — never uploaded to GitHub.',\n 'alerts.testSuccess': 'Test message delivered ({channel}, {attempts} attempt(s))',\n 'alerts.summarySuccess': \"Today's summary delivered ({channel}, {attempts} attempt(s))\",\n 'alerts.pushFail': 'Push failed: {message}',\n 'alerts.evalDone': 'Done — {fired} push(es) fired, {evaluated} enabled rule(s)',\n 'alerts.kindThreshold': 'threshold',\n 'alerts.kindDaily': 'daily',\n 'alerts.kindReset': 'reset',\n 'alerts.enabled': 'enabled',\n 'alerts.metric': 'Metric',\n 'alerts.below': 'Below',\n 'alerts.pushTime': 'Push at',\n 'alerts.pushTimeHint': '(local time, at most one per day)',\n 'alerts.window': 'Window',\n 'alerts.minutesBefore': 'Lead',\n 'alerts.minutesBeforeHint': 'min (60=1h, 1440=1d)',\n 'alerts.remainingAbove': 'Remaining ≥',\n 'alerts.remainingAboveHint': '% (only nudges while quota is worth saving)',\n 'alerts.pushTo': 'Push to',\n 'alerts.addChannelFirst': 'Add a channel first',\n 'alerts.pushLocale': 'Push language',\n 'alerts.pushLocaleHint': 'Language used in pushed messages (independent of UI language)',\n 'alerts.pushLocaleZh': '中文',\n 'alerts.pushLocaleEn': 'English',\n 'alerts.defaultLabelWxwork': 'WeChat Work bot',\n 'alerts.defaultLabelGeneric': 'Generic webhook',\n 'alerts.testMsgWord': 'Test message',\n 'alerts.summaryWord': \"Today's summary\",\n 'alerts.pushFailUnknown': 'unknown error',\n 'alerts.metric.claude_5h_remaining_pct': 'Claude Code · 5h remaining',\n 'alerts.metric.claude_weekly_remaining_pct': 'Claude Code · weekly remaining',\n 'alerts.metric.codex_5h_remaining_pct': 'Codex · 5h remaining',\n 'alerts.metric.codex_weekly_remaining_pct': 'Codex · weekly remaining',\n 'alerts.resetMetric.claude_5h': 'Claude Code · 5h window',\n 'alerts.resetMetric.claude_weekly': 'Claude Code · weekly window',\n 'alerts.resetMetric.codex_5h': 'Codex · 5h window',\n 'alerts.resetMetric.codex_weekly': 'Codex · weekly window',\n\n // ── settings · donate ─────────────────────────────────────────────────\n 'donate.title': 'Tip the author',\n 'donate.subtitle': 'Vibemeter is fully local and free. If it saves you time, a small tip keeps the project alive — no obligation.',\n 'donate.alipay': 'Alipay',\n 'donate.zoomClose': 'Close',\n 'donate.aside': 'Scan and pay any amount. Drop a note about the dashboard view you use the most — that drives the next iteration.',\n 'donate.missing': 'QR image not bundled yet — drop it at {path}.',\n\n // ── float widget ──────────────────────────────────────────────────────\n 'float.unknownReset': '未知重置时间',\n 'float.snapshotExpired': '快照已过期',\n 'float.noSnapshot': '尚无快照',\n 'float.justNow': '刚刚',\n 'float.minAgo': '{n} 分钟前',\n 'float.hourAgo': '{n} 小时前',\n 'float.currentQuota': '当前额度',\n 'float.noQuota': '无额度',\n 'float.fiveHRemain': '5h 剩余',\n 'float.usedPct': '已用 {pct}',\n 'float.usedNo': '尚无数据',\n 'float.refresh': '刷新',\n 'float.refreshing': '刷新中',\n 'float.statToday': '今日',\n 'float.statTotal': '累计',\n 'float.statWeekly': '本周',\n 'float.noToday': '今天还没有会话',\n 'float.latest': '最近',\n};\n\nconst MESSAGES: Record<Locale, Messages> = { zh, en };\n\nexport function messagesFor(locale: Locale): Messages {\n return MESSAGES[locale] ?? MESSAGES.zh;\n}\n","// Pure translator. Lookup by key + optional {name} interpolation. Works in\n// both server and client contexts — caller supplies the locale explicitly so\n// we don't need to thread next/headers into the hot path.\n\nimport { messagesFor } from './messages';\nimport type { Locale } from './types';\n\nexport type { Locale } from './types';\nexport { DEFAULT_LOCALE, LOCALE_COOKIE, LOCALES, isLocale, normalizeLocale } from './types';\nexport { messagesFor } from './messages';\n\nexport function t(locale: Locale, key: string, vars?: Record<string, string | number>): string {\n const msgs = messagesFor(locale);\n const tpl = msgs[key] ?? key;\n if (!vars) return tpl;\n return tpl.replace(/\\{(\\w+)\\}/g, (_, name) => {\n const v = vars[name];\n return v == null ? `{${name}}` : String(v);\n });\n}\n"],"names":["createClientModuleProxy","__turbopack_context__","n","LinkComponent","useLinkStatus","isModifiedEvent","event","eventTarget","currentTarget","target","getAttribute","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","linkClicked","e","href","linkInstanceRef","replace","scroll","onNavigate","transitionTypes","window","nodeName","isAnchorNodeName","toUpperCase","hasAttribute","isLocalURL","preventDefault","location","isDefaultPrevented","dispatchNavigateAction","require","React","startTransition","ScrollBehavior","NoScroll","Default","current","formatStringOrUrl","urlObjOrString","formatUrl","props","linkStatus","setOptimisticLinkStatus","useOptimistic","IDLE_LINK_STATUS","children","useRef","hrefProp","as","asProp","childrenProp","prefetch","prefetchProp","passHref","shallow","onClick","onMouseEnter","onMouseEnterProp","onTouchStart","onTouchStartProp","legacyBehavior","ref","forwardedRef","unstable_dynamicOnHover","restProps","a","router","useContext","AppRouterContext","prefetchEnabled","fetchStrategy","getFetchStrategyFromPrefetchProp","FetchStrategy","PPR","process","env","NODE_ENV","createPropError","args","Error","key","expected","actual","requiredPropsGuard","requiredProps","Object","keys","forEach","_","optionalPropsGuard","optionalProps","valType","Array","isArray","resolvedHref","formattedHref","locale","warnOnce","pathname","hasDynamicSegment","split","some","segment","startsWith","endsWith","child","$$typeof","Symbol","for","console","warn","Children","only","err","type","childRef","observeLinkVisibilityOnMount","useCallback","element","mountLinkInstance","unmountLinkForCurrentNavigation","unmountPrefetchableInstance","mergedRef","useMergedRef","childProps","defaultPrevented","upgradeToDynamicPrefetch","onNavigationIntent","__NEXT_LINK_NO_TOUCH_START","undefined","isAbsoluteUrl","addBasePath","link","errorOnce","cloneElement","LinkStatusContext","Provider","value","createContext","__NEXT_CACHE_COMPONENTS","Full","isLegacyBehavior","childIsHostComponent","childIsClientComponent","error","ClientLinkComponent","LocaleSwitcher","zh","en","MESSAGES","messagesFor"],"mappings":"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","ignoreList":[0,2,3]}