@vasfal/vellum 0.1.0 → 0.1.2

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 (484) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -5
  3. package/.next/build-manifest.json +13 -14
  4. package/.next/next-minimal-server.js.nft.json +1 -1
  5. package/.next/next-server.js.nft.json +1 -1
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/required-server-files.js +2 -0
  8. package/.next/required-server-files.json +2 -0
  9. package/.next/server/app/(app)/page.js +2 -15
  10. package/.next/server/app/(app)/page.js.nft.json +1 -1
  11. package/.next/server/app/(app)/page_client-reference-manifest.js +1 -3
  12. package/.next/server/app/(app)/session/[name]/page.js +2 -15
  13. package/.next/server/app/(app)/session/[name]/page.js.nft.json +1 -1
  14. package/.next/server/app/(app)/session/[name]/page_client-reference-manifest.js +1 -3
  15. package/.next/server/app/(app)/settings/key/page.js +2 -15
  16. package/.next/server/app/(app)/settings/key/page.js.nft.json +1 -1
  17. package/.next/server/app/(app)/settings/key/page_client-reference-manifest.js +1 -3
  18. package/.next/server/app/_global-error/page.js +32 -9
  19. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  20. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -3
  21. package/.next/server/app/_global-error.html +1 -1
  22. package/.next/server/app/_global-error.meta +2 -1
  23. package/.next/server/app/_global-error.rsc +7 -7
  24. package/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  25. package/.next/server/app/_global-error.segments/{__PAGE__.segment.rsc → _global-error/__PAGE__.segment.rsc} +2 -2
  26. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  27. package/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  28. package/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  29. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  30. package/.next/server/app/_not-found/page.js +2 -13
  31. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  32. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -3
  33. package/.next/server/app/_not-found.html +1 -1
  34. package/.next/server/app/_not-found.rsc +14 -12
  35. package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -12
  36. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  37. package/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
  38. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  39. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  40. package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -2
  41. package/.next/server/app/api/analyze/route.js +12 -9
  42. package/.next/server/app/api/analyze/route.js.nft.json +1 -1
  43. package/.next/server/app/api/analyze/route_client-reference-manifest.js +1 -3
  44. package/.next/server/app/api/key/route.js +1 -8
  45. package/.next/server/app/api/key/route.js.nft.json +1 -1
  46. package/.next/server/app/api/key/route_client-reference-manifest.js +1 -3
  47. package/.next/server/app/api/key-status/route.js +1 -7
  48. package/.next/server/app/api/key-status/route.js.nft.json +1 -1
  49. package/.next/server/app/api/key-status/route_client-reference-manifest.js +1 -3
  50. package/.next/server/app/api/models/route.js +1 -7
  51. package/.next/server/app/api/models/route.js.nft.json +1 -1
  52. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -3
  53. package/.next/server/app/api/revise/route.js +1 -8
  54. package/.next/server/app/api/revise/route.js.nft.json +1 -1
  55. package/.next/server/app/api/revise/route_client-reference-manifest.js +1 -3
  56. package/.next/server/app/icon.svg/route.js +1 -7
  57. package/.next/server/app/icon.svg/route.js.nft.json +1 -1
  58. package/.next/server/app/index.html +1 -1
  59. package/.next/server/app/index.rsc +24 -27
  60. package/.next/server/app/index.segments/!KGFwcCk/__PAGE__.segment.rsc +6 -6
  61. package/.next/server/app/index.segments/!KGFwcCk.segment.rsc +9 -9
  62. package/.next/server/app/index.segments/_full.segment.rsc +24 -27
  63. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  64. package/.next/server/app/index.segments/_index.segment.rsc +6 -6
  65. package/.next/server/app/index.segments/_tree.segment.rsc +4 -4
  66. package/.next/server/app/record-test/page.js +8 -14
  67. package/.next/server/app/record-test/page.js.nft.json +1 -1
  68. package/.next/server/app/record-test/page_client-reference-manifest.js +1 -3
  69. package/.next/server/app/record-test.html +2 -2
  70. package/.next/server/app/record-test.rsc +16 -16
  71. package/.next/server/app/record-test.segments/_full.segment.rsc +16 -16
  72. package/.next/server/app/record-test.segments/_head.segment.rsc +4 -4
  73. package/.next/server/app/record-test.segments/_index.segment.rsc +6 -6
  74. package/.next/server/app/record-test.segments/_tree.segment.rsc +4 -4
  75. package/.next/server/app/record-test.segments/record-test/__PAGE__.segment.rsc +4 -4
  76. package/.next/server/app/record-test.segments/record-test.segment.rsc +3 -3
  77. package/.next/server/app/settings/key.html +1 -1
  78. package/.next/server/app/settings/key.rsc +28 -34
  79. package/.next/server/app/settings/key.segments/!KGFwcCk/settings/key/__PAGE__.segment.rsc +5 -5
  80. package/.next/server/app/settings/key.segments/!KGFwcCk/settings/key.segment.rsc +3 -3
  81. package/.next/server/app/settings/key.segments/!KGFwcCk/settings.segment.rsc +3 -3
  82. package/.next/server/app/settings/key.segments/!KGFwcCk.segment.rsc +9 -9
  83. package/.next/server/app/settings/key.segments/_full.segment.rsc +28 -34
  84. package/.next/server/app/settings/key.segments/_head.segment.rsc +4 -4
  85. package/.next/server/app/settings/key.segments/_index.segment.rsc +6 -6
  86. package/.next/server/app/settings/key.segments/_tree.segment.rsc +4 -4
  87. package/.next/server/app/styleguide/page.js +2 -15
  88. package/.next/server/app/styleguide/page.js.nft.json +1 -1
  89. package/.next/server/app/styleguide/page_client-reference-manifest.js +1 -3
  90. package/.next/server/app/styleguide.html +1 -1
  91. package/.next/server/app/styleguide.rsc +68 -71
  92. package/.next/server/app/styleguide.segments/_full.segment.rsc +68 -71
  93. package/.next/server/app/styleguide.segments/_head.segment.rsc +4 -4
  94. package/.next/server/app/styleguide.segments/_index.segment.rsc +6 -6
  95. package/.next/server/app/styleguide.segments/_tree.segment.rsc +4 -4
  96. package/.next/server/app/styleguide.segments/styleguide/__PAGE__.segment.rsc +43 -45
  97. package/.next/server/app/styleguide.segments/styleguide.segment.rsc +3 -3
  98. package/.next/server/app-paths-manifest.json +5 -5
  99. package/.next/server/chunks/15.js +1 -0
  100. package/.next/server/chunks/319.js +45 -0
  101. package/.next/server/chunks/367.js +122 -0
  102. package/.next/server/chunks/393.js +4 -0
  103. package/.next/server/chunks/491.js +2 -0
  104. package/.next/server/chunks/497.js +1 -0
  105. package/.next/server/chunks/546.js +1 -0
  106. package/.next/server/chunks/592.js +44 -0
  107. package/.next/server/chunks/607.js +4 -0
  108. package/.next/server/chunks/724.js +1 -0
  109. package/.next/server/chunks/741.js +18 -0
  110. package/.next/server/chunks/813.js +1 -0
  111. package/.next/server/chunks/837.js +75 -0
  112. package/.next/server/chunks/852.js +14 -0
  113. package/.next/server/chunks/907.js +62 -0
  114. package/.next/server/chunks/915.js +8 -0
  115. package/.next/server/chunks/994.js +8 -0
  116. package/.next/server/middleware-build-manifest.js +1 -21
  117. package/.next/server/middleware-manifest.json +2 -2
  118. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  119. package/.next/server/next-font-manifest.js +1 -1
  120. package/.next/server/next-font-manifest.json +1 -31
  121. package/.next/server/pages/404.html +1 -1
  122. package/.next/server/pages/500.html +1 -1
  123. package/.next/server/server-reference-manifest.js +1 -1
  124. package/.next/server/server-reference-manifest.json +1 -5
  125. package/.next/server/webpack-runtime.js +1 -0
  126. package/.next/static/FExJe2q2O67X3zxf-SYQ_/_buildManifest.js +1 -0
  127. package/.next/static/chunks/185-9c51ded7cd36ca7e.js +1 -0
  128. package/.next/static/chunks/20-cca33f633fa125b2.js +1 -0
  129. package/.next/static/chunks/27-02413cc56fbb4570.js +1 -0
  130. package/.next/static/chunks/376-6f7bc95550542e0b.js +62 -0
  131. package/.next/static/chunks/479-ea67f878851afbcd.js +1 -0
  132. package/.next/static/chunks/493-6bd8c75c972d3abd.js +2 -0
  133. package/.next/static/chunks/4bd1b696-deb4a0a1da1923b0.js +1 -0
  134. package/.next/static/chunks/603-6235d4d53b37035c.js +1 -0
  135. package/.next/static/chunks/743-c183133e0fbf1564.js +44 -0
  136. package/.next/static/chunks/793-5e37343b804eb1d9.js +1 -0
  137. package/.next/static/chunks/794-dc751ec6c8c611f8.js +32 -0
  138. package/.next/static/chunks/924-9226750edc5c2c2f.js +1 -0
  139. package/.next/static/chunks/95247769-a29d70f7fbba27c6.js +1 -0
  140. package/.next/static/chunks/app/(app)/layout-aad46049bfd54648.js +1 -0
  141. package/.next/static/chunks/app/(app)/page-d75e1fccccdbe30e.js +1 -0
  142. package/.next/static/chunks/app/(app)/session/[name]/page-60529ed1fd7a66a1.js +1 -0
  143. package/.next/static/chunks/app/(app)/settings/key/page-c2aab9f11db98d4e.js +1 -0
  144. package/.next/static/chunks/app/_global-error/page-b1c3f51315835726.js +1 -0
  145. package/.next/static/chunks/app/_not-found/page-6830be21b0ed0c95.js +1 -0
  146. package/.next/static/chunks/app/api/analyze/route-b1c3f51315835726.js +1 -0
  147. package/.next/static/chunks/app/api/key/route-b1c3f51315835726.js +1 -0
  148. package/.next/static/chunks/app/api/key-status/route-b1c3f51315835726.js +1 -0
  149. package/.next/static/chunks/app/api/models/route-b1c3f51315835726.js +1 -0
  150. package/.next/static/chunks/app/api/revise/route-b1c3f51315835726.js +1 -0
  151. package/.next/static/chunks/app/layout-aa71ca14e7f13c0c.js +1 -0
  152. package/.next/static/chunks/app/record-test/page-efb4287dda79ede4.js +7 -0
  153. package/.next/static/chunks/app/styleguide/page-f39510e82c1f9f31.js +1 -0
  154. package/.next/static/chunks/framework-b29f9083d3cda3b2.js +1 -0
  155. package/.next/static/chunks/main-app-39f57c6e6702740e.js +1 -0
  156. package/.next/static/chunks/main-fac8900b4f9c4833.js +5 -0
  157. package/.next/static/chunks/next/dist/client/components/builtin/app-error-b1c3f51315835726.js +1 -0
  158. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-b1c3f51315835726.js +1 -0
  159. package/.next/static/chunks/next/dist/client/components/builtin/global-error-c1d4bb24e31b66a2.js +1 -0
  160. package/.next/static/chunks/next/dist/client/components/builtin/not-found-b1c3f51315835726.js +1 -0
  161. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b1c3f51315835726.js +1 -0
  162. package/.next/static/chunks/webpack-ceb933bd5f77076f.js +1 -0
  163. package/.next/static/css/e2905f0858acd77d.css +3 -0
  164. package/.next/types/app/(app)/page.ts +87 -0
  165. package/.next/types/app/(app)/session/[name]/page.ts +87 -0
  166. package/.next/types/app/(app)/settings/key/page.ts +87 -0
  167. package/.next/types/app/api/analyze/route.ts +351 -0
  168. package/.next/types/app/api/key/route.ts +351 -0
  169. package/.next/types/app/api/key-status/route.ts +351 -0
  170. package/.next/types/app/api/models/route.ts +351 -0
  171. package/.next/types/app/api/revise/route.ts +351 -0
  172. package/.next/types/app/layout.ts +87 -0
  173. package/.next/types/app/record-test/page.ts +87 -0
  174. package/.next/types/app/styleguide/page.ts +87 -0
  175. package/.next/types/package.json +1 -0
  176. package/README.md +4 -6
  177. package/next.config.ts +8 -0
  178. package/package.json +4 -4
  179. package/.next/build/56416d4ae4ce586f.js +0 -6
  180. package/.next/build/56416d4ae4ce586f.js.map +0 -5
  181. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js +0 -206
  182. package/.next/build/chunks/[root-of-the-server]__0oj80bi._.js.map +0 -8
  183. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js +0 -500
  184. package/.next/build/chunks/[root-of-the-server]__1f933tp._.js.map +0 -11
  185. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js +0 -13
  186. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0b7xl6g._.js.map +0 -5
  187. package/.next/build/chunks/[turbopack]_runtime.js +0 -890
  188. package/.next/build/chunks/[turbopack]_runtime.js.map +0 -11
  189. package/.next/build/chunks/node_modules_20v-8wl._.js +0 -6832
  190. package/.next/build/chunks/node_modules_20v-8wl._.js.map +0 -47
  191. package/.next/build/package.json +0 -1
  192. package/.next/cache/.previewinfo +0 -1
  193. package/.next/cache/.rscinfo +0 -1
  194. package/.next/cache/.tsbuildinfo +0 -1
  195. package/.next/diagnostics/route-bundle-stats.json +0 -111
  196. package/.next/fallback-build-manifest.json +0 -13
  197. package/.next/server/app/(app)/page/app-paths-manifest.json +0 -3
  198. package/.next/server/app/(app)/page/build-manifest.json +0 -17
  199. package/.next/server/app/(app)/page/next-font-manifest.json +0 -11
  200. package/.next/server/app/(app)/page/server-reference-manifest.json +0 -4
  201. package/.next/server/app/(app)/page.js.map +0 -5
  202. package/.next/server/app/(app)/session/[name]/page/app-paths-manifest.json +0 -3
  203. package/.next/server/app/(app)/session/[name]/page/build-manifest.json +0 -17
  204. package/.next/server/app/(app)/session/[name]/page/next-font-manifest.json +0 -11
  205. package/.next/server/app/(app)/session/[name]/page/react-loadable-manifest.json +0 -1
  206. package/.next/server/app/(app)/session/[name]/page/server-reference-manifest.json +0 -4
  207. package/.next/server/app/(app)/session/[name]/page.js.map +0 -5
  208. package/.next/server/app/(app)/settings/key/page/app-paths-manifest.json +0 -3
  209. package/.next/server/app/(app)/settings/key/page/build-manifest.json +0 -17
  210. package/.next/server/app/(app)/settings/key/page/next-font-manifest.json +0 -11
  211. package/.next/server/app/(app)/settings/key/page/react-loadable-manifest.json +0 -1
  212. package/.next/server/app/(app)/settings/key/page/server-reference-manifest.json +0 -4
  213. package/.next/server/app/(app)/settings/key/page.js.map +0 -5
  214. package/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
  215. package/.next/server/app/_global-error/page/build-manifest.json +0 -17
  216. package/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
  217. package/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
  218. package/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
  219. package/.next/server/app/_global-error/page.js.map +0 -5
  220. package/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
  221. package/.next/server/app/_not-found/page/build-manifest.json +0 -17
  222. package/.next/server/app/_not-found/page/next-font-manifest.json +0 -11
  223. package/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
  224. package/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
  225. package/.next/server/app/_not-found/page.js.map +0 -5
  226. package/.next/server/app/api/analyze/route/app-paths-manifest.json +0 -3
  227. package/.next/server/app/api/analyze/route/build-manifest.json +0 -9
  228. package/.next/server/app/api/analyze/route/server-reference-manifest.json +0 -4
  229. package/.next/server/app/api/analyze/route.js.map +0 -5
  230. package/.next/server/app/api/key/route/app-paths-manifest.json +0 -3
  231. package/.next/server/app/api/key/route/build-manifest.json +0 -9
  232. package/.next/server/app/api/key/route/server-reference-manifest.json +0 -4
  233. package/.next/server/app/api/key/route.js.map +0 -5
  234. package/.next/server/app/api/key-status/route/app-paths-manifest.json +0 -3
  235. package/.next/server/app/api/key-status/route/build-manifest.json +0 -9
  236. package/.next/server/app/api/key-status/route/server-reference-manifest.json +0 -4
  237. package/.next/server/app/api/key-status/route.js.map +0 -5
  238. package/.next/server/app/api/models/route/app-paths-manifest.json +0 -3
  239. package/.next/server/app/api/models/route/build-manifest.json +0 -9
  240. package/.next/server/app/api/models/route/server-reference-manifest.json +0 -4
  241. package/.next/server/app/api/models/route.js.map +0 -5
  242. package/.next/server/app/api/revise/route/app-paths-manifest.json +0 -3
  243. package/.next/server/app/api/revise/route/build-manifest.json +0 -9
  244. package/.next/server/app/api/revise/route/server-reference-manifest.json +0 -4
  245. package/.next/server/app/api/revise/route.js.map +0 -5
  246. package/.next/server/app/icon.svg/route/app-paths-manifest.json +0 -3
  247. package/.next/server/app/icon.svg/route/build-manifest.json +0 -9
  248. package/.next/server/app/icon.svg/route.js.map +0 -5
  249. package/.next/server/app/record-test/page/app-paths-manifest.json +0 -3
  250. package/.next/server/app/record-test/page/build-manifest.json +0 -17
  251. package/.next/server/app/record-test/page/next-font-manifest.json +0 -11
  252. package/.next/server/app/record-test/page/react-loadable-manifest.json +0 -1
  253. package/.next/server/app/record-test/page/server-reference-manifest.json +0 -4
  254. package/.next/server/app/record-test/page.js.map +0 -5
  255. package/.next/server/app/styleguide/page/app-paths-manifest.json +0 -3
  256. package/.next/server/app/styleguide/page/build-manifest.json +0 -17
  257. package/.next/server/app/styleguide/page/next-font-manifest.json +0 -11
  258. package/.next/server/app/styleguide/page/react-loadable-manifest.json +0 -1
  259. package/.next/server/app/styleguide/page/server-reference-manifest.json +0 -4
  260. package/.next/server/app/styleguide/page.js.map +0 -5
  261. package/.next/server/chunks/[externals]__1l0bqbz._.js +0 -3
  262. package/.next/server/chunks/[externals]__1l0bqbz._.js.map +0 -1
  263. package/.next/server/chunks/[root-of-the-server]__00u0a0m._.js +0 -3
  264. package/.next/server/chunks/[root-of-the-server]__00u0a0m._.js.map +0 -1
  265. package/.next/server/chunks/[root-of-the-server]__02oblj7._.js +0 -3
  266. package/.next/server/chunks/[root-of-the-server]__02oblj7._.js.map +0 -1
  267. package/.next/server/chunks/[root-of-the-server]__04dzkv1._.js +0 -3
  268. package/.next/server/chunks/[root-of-the-server]__04dzkv1._.js.map +0 -1
  269. package/.next/server/chunks/[root-of-the-server]__081zp1m._.js +0 -3
  270. package/.next/server/chunks/[root-of-the-server]__081zp1m._.js.map +0 -1
  271. package/.next/server/chunks/[root-of-the-server]__0dkua3v._.js +0 -3
  272. package/.next/server/chunks/[root-of-the-server]__0dkua3v._.js.map +0 -1
  273. package/.next/server/chunks/[root-of-the-server]__0ezil_h._.js +0 -3
  274. package/.next/server/chunks/[root-of-the-server]__0ezil_h._.js.map +0 -1
  275. package/.next/server/chunks/[root-of-the-server]__0ww_12a._.js +0 -3
  276. package/.next/server/chunks/[root-of-the-server]__0ww_12a._.js.map +0 -1
  277. package/.next/server/chunks/[root-of-the-server]__0x-kpif._.js +0 -3
  278. package/.next/server/chunks/[root-of-the-server]__0x-kpif._.js.map +0 -1
  279. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js +0 -3
  280. package/.next/server/chunks/[root-of-the-server]__15bjnu5._.js.map +0 -1
  281. package/.next/server/chunks/[root-of-the-server]__1kmbnvv._.js +0 -3
  282. package/.next/server/chunks/[root-of-the-server]__1kmbnvv._.js.map +0 -1
  283. package/.next/server/chunks/[root-of-the-server]__1kp4vwc._.js +0 -14
  284. package/.next/server/chunks/[root-of-the-server]__1kp4vwc._.js.map +0 -1
  285. package/.next/server/chunks/[root-of-the-server]__1lbd3kd._.js +0 -3
  286. package/.next/server/chunks/[root-of-the-server]__1lbd3kd._.js.map +0 -1
  287. package/.next/server/chunks/[root-of-the-server]__1ra6psc._.js +0 -3
  288. package/.next/server/chunks/[root-of-the-server]__1ra6psc._.js.map +0 -1
  289. package/.next/server/chunks/[root-of-the-server]__1zn977r._.js +0 -3
  290. package/.next/server/chunks/[root-of-the-server]__1zn977r._.js.map +0 -1
  291. package/.next/server/chunks/[turbopack]_runtime.js +0 -903
  292. package/.next/server/chunks/[turbopack]_runtime.js.map +0 -11
  293. package/.next/server/chunks/_04h1cv_._.js +0 -185
  294. package/.next/server/chunks/_04h1cv_._.js.map +0 -1
  295. package/.next/server/chunks/_0pqmhjh._.js +0 -185
  296. package/.next/server/chunks/_0pqmhjh._.js.map +0 -1
  297. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js +0 -3
  298. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js.map +0 -1
  299. package/.next/server/chunks/_next-internal_server_app_api_key-status_route_actions_1qgztm2.js +0 -3
  300. package/.next/server/chunks/_next-internal_server_app_api_key-status_route_actions_1qgztm2.js.map +0 -1
  301. package/.next/server/chunks/_next-internal_server_app_api_key_route_actions_15n2qsb.js +0 -3
  302. package/.next/server/chunks/_next-internal_server_app_api_key_route_actions_15n2qsb.js.map +0 -1
  303. package/.next/server/chunks/_next-internal_server_app_api_models_route_actions_1h6mkqp.js +0 -3
  304. package/.next/server/chunks/_next-internal_server_app_api_models_route_actions_1h6mkqp.js.map +0 -1
  305. package/.next/server/chunks/_next-internal_server_app_api_revise_route_actions_19kk3m-.js +0 -3
  306. package/.next/server/chunks/_next-internal_server_app_api_revise_route_actions_19kk3m-.js.map +0 -1
  307. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js +0 -3
  308. package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_1r2h_ub.js.map +0 -1
  309. package/.next/server/chunks/node_modules_0x51oh_._.js +0 -10
  310. package/.next/server/chunks/node_modules_0x51oh_._.js.map +0 -1
  311. package/.next/server/chunks/node_modules_19bvt3l._.js +0 -6
  312. package/.next/server/chunks/node_modules_19bvt3l._.js.map +0 -1
  313. package/.next/server/chunks/node_modules_1_-az43._.js +0 -16
  314. package/.next/server/chunks/node_modules_1_-az43._.js.map +0 -1
  315. package/.next/server/chunks/node_modules_1t2pqct._.js +0 -10
  316. package/.next/server/chunks/node_modules_1t2pqct._.js.map +0 -1
  317. package/.next/server/chunks/node_modules_next_08s853w._.js +0 -13
  318. package/.next/server/chunks/node_modules_next_08s853w._.js.map +0 -1
  319. package/.next/server/chunks/node_modules_node-fetch_src_index_1gf-_pn.js +0 -3
  320. package/.next/server/chunks/node_modules_node-fetch_src_index_1gf-_pn.js.map +0 -1
  321. package/.next/server/chunks/ssr/[externals]__1l0bqbz._.js +0 -3
  322. package/.next/server/chunks/ssr/[externals]__1l0bqbz._.js.map +0 -1
  323. package/.next/server/chunks/ssr/[root-of-the-server]__06ync7f._.js +0 -3
  324. package/.next/server/chunks/ssr/[root-of-the-server]__06ync7f._.js.map +0 -1
  325. package/.next/server/chunks/ssr/[root-of-the-server]__0hml-pd._.js +0 -3
  326. package/.next/server/chunks/ssr/[root-of-the-server]__0hml-pd._.js.map +0 -1
  327. package/.next/server/chunks/ssr/[root-of-the-server]__0ntia6u._.js +0 -3
  328. package/.next/server/chunks/ssr/[root-of-the-server]__0ntia6u._.js.map +0 -1
  329. package/.next/server/chunks/ssr/[root-of-the-server]__0sdpd0o._.js +0 -3
  330. package/.next/server/chunks/ssr/[root-of-the-server]__0sdpd0o._.js.map +0 -1
  331. package/.next/server/chunks/ssr/[root-of-the-server]__0w2pa_y._.js +0 -33
  332. package/.next/server/chunks/ssr/[root-of-the-server]__0w2pa_y._.js.map +0 -1
  333. package/.next/server/chunks/ssr/[root-of-the-server]__10y0-wv._.js +0 -3
  334. package/.next/server/chunks/ssr/[root-of-the-server]__10y0-wv._.js.map +0 -1
  335. package/.next/server/chunks/ssr/[root-of-the-server]__11_7weu._.js +0 -3
  336. package/.next/server/chunks/ssr/[root-of-the-server]__11_7weu._.js.map +0 -1
  337. package/.next/server/chunks/ssr/[root-of-the-server]__1_stkwn._.js +0 -3
  338. package/.next/server/chunks/ssr/[root-of-the-server]__1_stkwn._.js.map +0 -1
  339. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js +0 -33
  340. package/.next/server/chunks/ssr/[root-of-the-server]__1dky4g0._.js.map +0 -1
  341. package/.next/server/chunks/ssr/[root-of-the-server]__1k6ey-q._.js +0 -3
  342. package/.next/server/chunks/ssr/[root-of-the-server]__1k6ey-q._.js.map +0 -1
  343. package/.next/server/chunks/ssr/[root-of-the-server]__1la73u1._.js +0 -3
  344. package/.next/server/chunks/ssr/[root-of-the-server]__1la73u1._.js.map +0 -1
  345. package/.next/server/chunks/ssr/[root-of-the-server]__1nshnxm._.js +0 -3
  346. package/.next/server/chunks/ssr/[root-of-the-server]__1nshnxm._.js.map +0 -1
  347. package/.next/server/chunks/ssr/[root-of-the-server]__1pssg49._.js +0 -3
  348. package/.next/server/chunks/ssr/[root-of-the-server]__1pssg49._.js.map +0 -1
  349. package/.next/server/chunks/ssr/[root-of-the-server]__1q6zd30._.js +0 -3
  350. package/.next/server/chunks/ssr/[root-of-the-server]__1q6zd30._.js.map +0 -1
  351. package/.next/server/chunks/ssr/[root-of-the-server]__1qlmg27._.js +0 -3
  352. package/.next/server/chunks/ssr/[root-of-the-server]__1qlmg27._.js.map +0 -1
  353. package/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -903
  354. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +0 -11
  355. package/.next/server/chunks/ssr/_01pksvc._.js +0 -78
  356. package/.next/server/chunks/ssr/_01pksvc._.js.map +0 -1
  357. package/.next/server/chunks/ssr/_03lgii8._.js +0 -3
  358. package/.next/server/chunks/ssr/_03lgii8._.js.map +0 -1
  359. package/.next/server/chunks/ssr/_05tft_r._.js +0 -3
  360. package/.next/server/chunks/ssr/_05tft_r._.js.map +0 -1
  361. package/.next/server/chunks/ssr/_06gt995._.js +0 -3
  362. package/.next/server/chunks/ssr/_06gt995._.js.map +0 -1
  363. package/.next/server/chunks/ssr/_0jrh37c._.js +0 -46
  364. package/.next/server/chunks/ssr/_0jrh37c._.js.map +0 -1
  365. package/.next/server/chunks/ssr/_0kw6yq_._.js +0 -3
  366. package/.next/server/chunks/ssr/_0kw6yq_._.js.map +0 -1
  367. package/.next/server/chunks/ssr/_0l3c05z._.js +0 -3
  368. package/.next/server/chunks/ssr/_0l3c05z._.js.map +0 -1
  369. package/.next/server/chunks/ssr/_0n-ojw-._.js +0 -3
  370. package/.next/server/chunks/ssr/_0n-ojw-._.js.map +0 -1
  371. package/.next/server/chunks/ssr/_0t6a1ln._.js +0 -6
  372. package/.next/server/chunks/ssr/_0t6a1ln._.js.map +0 -1
  373. package/.next/server/chunks/ssr/_0td-xk-._.js +0 -3
  374. package/.next/server/chunks/ssr/_0td-xk-._.js.map +0 -1
  375. package/.next/server/chunks/ssr/_0y92f-y._.js +0 -46
  376. package/.next/server/chunks/ssr/_0y92f-y._.js.map +0 -1
  377. package/.next/server/chunks/ssr/_1b6au28._.js +0 -3
  378. package/.next/server/chunks/ssr/_1b6au28._.js.map +0 -1
  379. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_page_actions_1gxdy57.js +0 -3
  380. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_page_actions_1gxdy57.js.map +0 -1
  381. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_session_[name]_page_actions_115d_ja.js +0 -3
  382. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_session_[name]_page_actions_115d_ja.js.map +0 -1
  383. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_settings_key_page_actions_1jsc3or.js +0 -3
  384. package/.next/server/chunks/ssr/_next-internal_server_app_(app)_settings_key_page_actions_1jsc3or.js.map +0 -1
  385. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +0 -3
  386. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +0 -1
  387. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +0 -3
  388. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +0 -1
  389. package/.next/server/chunks/ssr/_next-internal_server_app_record-test_page_actions_0a_yofw.js +0 -3
  390. package/.next/server/chunks/ssr/_next-internal_server_app_record-test_page_actions_0a_yofw.js.map +0 -1
  391. package/.next/server/chunks/ssr/_next-internal_server_app_styleguide_page_actions_174h7x7.js +0 -3
  392. package/.next/server/chunks/ssr/_next-internal_server_app_styleguide_page_actions_174h7x7.js.map +0 -1
  393. package/.next/server/chunks/ssr/node_modules_0el53_h._.js +0 -10
  394. package/.next/server/chunks/ssr/node_modules_0el53_h._.js.map +0 -1
  395. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js +0 -33
  396. package/.next/server/chunks/ssr/node_modules_0h91jdk._.js.map +0 -1
  397. package/.next/server/chunks/ssr/node_modules_1fxqp22._.js +0 -10
  398. package/.next/server/chunks/ssr/node_modules_1fxqp22._.js.map +0 -1
  399. package/.next/server/chunks/ssr/node_modules_1loo6j7._.js +0 -6
  400. package/.next/server/chunks/ssr/node_modules_1loo6j7._.js.map +0 -1
  401. package/.next/server/chunks/ssr/node_modules_1pvqj0r._.js +0 -3
  402. package/.next/server/chunks/ssr/node_modules_1pvqj0r._.js.map +0 -1
  403. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js +0 -6
  404. package/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js.map +0 -1
  405. package/.next/server/chunks/ssr/node_modules_next_dist_172hvm-._.js +0 -19
  406. package/.next/server/chunks/ssr/node_modules_next_dist_172hvm-._.js.map +0 -1
  407. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +0 -3
  408. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +0 -1
  409. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +0 -3
  410. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +0 -1
  411. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js +0 -3
  412. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0-o-goa.js.map +0 -1
  413. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +0 -3
  414. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +0 -1
  415. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_q50sh.js +0 -4
  416. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_q50sh.js.map +0 -1
  417. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_xbpm0.js +0 -4
  418. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_xbpm0.js.map +0 -1
  419. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_119i6eu.js +0 -4
  420. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_119i6eu.js.map +0 -1
  421. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_14nl2rs.js +0 -4
  422. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_14nl2rs.js.map +0 -1
  423. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18u8k23.js +0 -4
  424. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_18u8k23.js.map +0 -1
  425. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js +0 -4
  426. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_19--w_z.js.map +0 -1
  427. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1_iwj0a.js +0 -4
  428. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1_iwj0a.js.map +0 -1
  429. package/.next/server/chunks/ssr/node_modules_node-fetch_src_index_1e0t9p6.js +0 -3
  430. package/.next/server/chunks/ssr/node_modules_node-fetch_src_index_1e0t9p6.js.map +0 -1
  431. package/.next/server/chunks/ssr/src_19oqe9t._.js +0 -3
  432. package/.next/server/chunks/ssr/src_19oqe9t._.js.map +0 -1
  433. package/.next/server/chunks/ssr/src_app_record-test_page_tsx_08-2bld._.js +0 -9
  434. package/.next/server/chunks/ssr/src_app_record-test_page_tsx_08-2bld._.js.map +0 -1
  435. package/.next/server/chunks/ssr/src_components_app-sidebar_tsx_1xx2k53._.js +0 -3
  436. package/.next/server/chunks/ssr/src_components_app-sidebar_tsx_1xx2k53._.js.map +0 -1
  437. package/.next/server/chunks/ssr/src_components_settings_key-setup_tsx_0jxhnpa._.js +0 -3
  438. package/.next/server/chunks/ssr/src_components_settings_key-setup_tsx_0jxhnpa._.js.map +0 -1
  439. package/.next/server/chunks/ssr/src_components_ui_0lq7ewx._.js +0 -3
  440. package/.next/server/chunks/ssr/src_components_ui_0lq7ewx._.js.map +0 -1
  441. package/.next/static/CIZxngYjzUw1Kb0KrE473/_buildManifest.js +0 -11
  442. package/.next/static/CIZxngYjzUw1Kb0KrE473/_clientMiddlewareManifest.js +0 -1
  443. package/.next/static/chunks/05-c3ty_6dwfk.js +0 -1
  444. package/.next/static/chunks/07-hzktxqjvzd.js +0 -4
  445. package/.next/static/chunks/09bn0buuu6k2x.js +0 -1
  446. package/.next/static/chunks/0kkimqpuecvfn.js +0 -1
  447. package/.next/static/chunks/0mk1g55o6kl1e.js +0 -2
  448. package/.next/static/chunks/0ul837-9k0zx_.js +0 -63
  449. package/.next/static/chunks/0wpges32btt_p.js +0 -1
  450. package/.next/static/chunks/18qo-4_hfuwko.js +0 -1
  451. package/.next/static/chunks/1_dsevxz78b97.js +0 -1
  452. package/.next/static/chunks/2-oqhnxovgl_2.js +0 -44
  453. package/.next/static/chunks/2et_7fxuzt9cq.js +0 -31
  454. package/.next/static/chunks/2im7c515bo69p.js +0 -1
  455. package/.next/static/chunks/2merpuxt1zcvf.js +0 -1
  456. package/.next/static/chunks/2qb8lge1e2sv2.js +0 -1
  457. package/.next/static/chunks/2sj0gufu0lojq.css +0 -3
  458. package/.next/static/chunks/2zloaj9ja_vpy.js +0 -1
  459. package/.next/static/chunks/3rvy2rc9d_hwt.js +0 -1
  460. package/.next/static/chunks/3uci2qhsbp444.js +0 -50
  461. package/.next/static/chunks/3yao5u25-bf0g.js +0 -1
  462. package/.next/static/chunks/41_0qs6kjmoek.js +0 -1
  463. package/.next/static/chunks/4395sbjm36lbl.js +0 -1
  464. package/.next/static/chunks/turbopack-2cevjmbuh84ft.js +0 -1
  465. package/.next/static/media/icon.2_sgat73yt9an.svg +0 -7
  466. package/.next/trace +0 -1
  467. package/.next/trace-build +0 -1
  468. package/.next/turbopack +0 -0
  469. /package/.next/{server/app/(app)/page/react-loadable-manifest.json → react-loadable-manifest.json} +0 -0
  470. /package/.next/static/{CIZxngYjzUw1Kb0KrE473 → FExJe2q2O67X3zxf-SYQ_}/_ssgManifest.js +0 -0
  471. /package/.next/static/chunks/{0cz1d0mv5g_q7.js → polyfills-42372ed130431b0a.js} +0 -0
  472. /package/.next/static/media/{5ce348bf30bf5439-s.31988l_ccedte.woff2 → 013b72fa676f92e0-s.woff2} +0 -0
  473. /package/.next/static/media/{5476f68d60460930-s.2uwcyprjm3xu3.woff2 → 19cfc7226ec3afaa-s.woff2} +0 -0
  474. /package/.next/static/media/{9c72aa0f40e4eef8-s.1y4-pdgsjb-pw.woff2 → 21350d82a1f187e9-s.woff2} +0 -0
  475. /package/.next/static/media/{bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2 → 2b5b02fc7e511755-s.woff2} +0 -0
  476. /package/.next/static/media/{6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2 → 65f03d54ccadf4a8-s.woff2} +0 -0
  477. /package/.next/static/media/{797e433ab948586e-s.p.0r6juujl39pe6.woff2 → 7d4881bb7e1bf84d-s.p.woff2} +0 -0
  478. /package/.next/static/media/{1bffadaabf893a1e-s.3-6t-g6q0vh0a.woff2 → 8e9860b6e62d6359-s.woff2} +0 -0
  479. /package/.next/static/media/{4fa387ec64143e14-s.2tuy5pz7dlieh.woff2 → b9408752a0c24fb9-s.woff2} +0 -0
  480. /package/.next/static/media/{2c55a0e60120577a-s.0-dom-5bn10r2.woff2 → ba9851c3c22cd980-s.woff2} +0 -0
  481. /package/.next/static/media/{ad66f9afd8947f86-s.3lvt2whj97whp.woff2 → c5fe6dc8356a8c31-s.woff2} +0 -0
  482. /package/.next/static/media/{2bbe8d2671613f1f-s.0k62hbripvv8p.woff2 → df0a9ae256c0569c-s.woff2} +0 -0
  483. /package/.next/static/media/{7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2 → e038a29029a234f2-s.woff2} +0 -0
  484. /package/.next/static/media/{83afe278b6a6bb3c-s.p.2bn3s6zvc0dyp.woff2 → e4af272ccee01ff0-s.p.woff2} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/theme-switcher.tsx","../../../../src/components/app-sidebar.tsx","../../../../src/components/import-video.tsx","../../../../src/components/recording/new-recording.tsx","../../../../src/lib/filesystem/sessions.ts","../../../../src/hooks/useSessions.ts","../../../../src/components/session-list.tsx","../../../../src/components/settings/sidebar-status.tsx","../../../../node_modules/lucide-react/src/icons/sun.ts","../../../../node_modules/lucide-react/src/icons/search.ts","../../../../node_modules/lucide-react/src/icons/circle-alert.ts","../../../../node_modules/lucide-react/src/icons/folder.ts","../../../../node_modules/lucide-react/src/icons/film.ts","../../../../node_modules/lucide-react/src/icons/moon.ts","../../../../node_modules/lucide-react/src/icons/circle-dashed.ts","../../../../node_modules/lucide-react/src/icons/picture-in-picture-2.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n// Theme control (ADR-019): a static horizontal two-way toggle — Light / Dark —\n// pinned to the right of the wordmark in the sidebar logo band. Dark is the\n// default for everyone (no System option), so this is just a straight pick\n// between the two. Monochrome box: the active mode sits on the raised surface,\n// the other stays muted (ADR-004).\n//\n// `mounted` gates the active highlight — on the server `theme` is undefined, so\n// deferring it to after mount avoids a hydration mismatch.\nconst OPTIONS = [\n { value: \"light\", label: \"Light\", Icon: Sun },\n { value: \"dark\", label: \"Dark\", Icon: Moon },\n] as const;\n\nexport function ThemeSwitcher() {\n const { theme, setTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n\n return (\n <div className=\"flex items-center gap-0.5 rounded-lg border border-border bg-background p-0.5\">\n {OPTIONS.map(({ value, label, Icon }) => {\n const active = mounted && theme === value;\n return (\n <Tooltip key={value}>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n onClick={() => setTheme(value)}\n aria-label={label}\n aria-pressed={active}\n className={cn(\n \"flex size-6 items-center justify-center rounded-md transition-colors duration-150 ease-out active:opacity-80\",\n active\n ? \"bg-secondary text-secondary-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n />\n }\n >\n <Icon className=\"size-3.5\" strokeWidth={1.5} />\n </TooltipTrigger>\n <TooltipContent side=\"top\">{label}</TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Search, X } from \"lucide-react\";\n\nimport { ImportVideo } from \"@/components/import-video\";\nimport { NewRecording } from \"@/components/recording/new-recording\";\nimport { useSessionActions } from \"@/components/recording/session-actions\";\nimport { Logo } from \"@/components/logo\";\nimport { SessionList } from \"@/components/session-list\";\nimport { SidebarStatus } from \"@/components/settings/sidebar-status\";\nimport { ThemeSwitcher } from \"@/components/theme-switcher\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuItem,\n} from \"@/components/ui/sidebar\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n// App version shown beside the wordmark. Bumped manually (per Vasyl) — do NOT\n// auto-change it.\nconst APP_VERSION = \"v1.0\";\n\n// The Vellum app sidebar. The session list reads the live workspace (TASK-14);\n// New recording records into the adopted workspace (TASK-25). The footer surfaces\n// the Gemini key status + active workspace with a re-pick action (TASK-38).\nexport function AppSidebar() {\n // TASK-19 — live filter over the session list. Purely client-side: state lives\n // here so the search box and the list share it; the list matches on the display\n // name (matchesQuery). The box is hidden behind a toggle next to the \"Sessions\"\n // label (progressive disclosure) and resets when closed.\n const [query, setQuery] = useState(\"\");\n const [searchOpen, setSearchOpen] = useState(false);\n // While a recording is in progress, the controls fill the row and the Import\n // button is hidden. The active flag comes from the shared record/import context\n // (TASK-40), so the sidebar and the empty state agree on one recorder.\n const { recordingActive } = useSessionActions();\n\n const toggleSearch = () =>\n setSearchOpen((open) => {\n if (open) setQuery(\"\"); // closing clears the filter\n return !open;\n });\n\n return (\n // `inset` variant: the shell background becomes the sidebar colour and the\n // main content floats as a rounded panel with margins on it — the Linear /\n // Factorial layout (ADR-019 era). px-0! strips the variant's horizontal\n // padding so the sidebar's dividers run full width; its 8px top padding\n // stays, aligning the logo band with the floating panel's header.\n <Sidebar variant=\"inset\" className=\"px-0!\">\n <SidebarHeader className=\"gap-2 p-0\">\n {/* Logo band matches the PageHeader height (h-12) so the wordmark aligns\n with the page title across the sidebar / content boundary. The theme\n toggle is pinned to the right edge of this band (ADR-019). */}\n <div className=\"flex h-12 items-center justify-between pl-4 pr-3\">\n {/* Version baseline-aligns to the foot of the wordmark (items-end +\n leading-none), the cluster stays vertically centred in the band. */}\n <div className=\"flex items-end gap-2\">\n <Logo className=\"h-[18px]\" />\n <span className=\"relative -top-px font-mono text-[11px] leading-none tabular-nums text-muted-foreground\">\n {APP_VERSION}\n </span>\n </div>\n <ThemeSwitcher />\n </div>\n <SidebarMenu className=\"px-3 pb-1.5\">\n {/* One row: the primary \"New recording\" grows; Import (S13, the quieter\n second entry point — bg-background fill) sits beside it as a compact\n icon button with a hover tooltip. Import is hidden while a recording\n is in progress, when Record becomes the live controls. */}\n <SidebarMenuItem className=\"flex items-stretch gap-2.5\">\n <div className=\"min-w-0 flex-1\">\n <NewRecording />\n </div>\n {!recordingActive && <ImportVideo />}\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n\n {/* overflow-hidden here so the group below owns the scroll — the Sessions\n label + search box stay pinned and only the list scrolls. */}\n <SidebarContent className=\"overflow-hidden\">\n <SidebarGroup className=\"min-h-0 flex-1\">\n <div className=\"flex shrink-0 items-center justify-between\">\n {/* Quiet Linear-style section label — tiny, uppercase, tracked and\n dimmed so it reads as a divider, not a heading (TASK-39). */}\n <SidebarGroupLabel className=\"h-7 text-[0.6875rem] font-medium uppercase tracking-wider text-sidebar-foreground/50\">\n Sessions\n </SidebarGroupLabel>\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n onClick={toggleSearch}\n aria-label={searchOpen ? \"Close search\" : \"Search sessions\"}\n aria-expanded={searchOpen}\n className={`mr-1 rounded p-1 transition-colors ${\n searchOpen\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n />\n }\n >\n <Search className=\"size-3.5\" strokeWidth={1.5} />\n </TooltipTrigger>\n <TooltipContent>\n {searchOpen ? \"Close search\" : \"Search sessions\"}\n </TooltipContent>\n </Tooltip>\n </div>\n {searchOpen && (\n <div className=\"shrink-0 px-1 pb-2\">\n {/* The positioning context is the input box ONLY (h-8) — no padding\n here, or top-1/2 would center against a taller box and the icons\n would sit high. */}\n <div className=\"relative h-8\">\n <Search\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\"\n strokeWidth={1.5}\n />\n <Input\n type=\"text\"\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search sessions\"\n aria-label=\"Search sessions\"\n className=\"h-8 pl-8 pr-8 text-sm\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery(\"\")}\n aria-label=\"Clear search\"\n className=\"absolute right-2 top-1/2 flex -translate-y-1/2 items-center rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground\"\n >\n <X className=\"size-3.5\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n </div>\n )}\n <SidebarGroupContent className=\"min-h-0 flex-1 overflow-y-auto\">\n <SessionList query={searchOpen ? query : \"\"} />\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n\n <SidebarFooter className=\"py-0.5\">\n <SidebarStatus />\n </SidebarFooter>\n </Sidebar>\n );\n}\n","\"use client\";\n\n// TASK-30 / TASK-40 — the sidebar trigger for the non-record entry point (S13).\n// The copy + analyze flow and its dialog live in SessionActionsProvider (so\n// import can also be started from the empty state); this is the compact icon\n// button beside New recording. Its fill is bg-background in both themes — the\n// colour of the main content panel — reading as the quieter action while still\n// sitting distinctly on the sidebar surface. A hover tooltip carries the label.\n\nimport { Import, Loader2 } from \"lucide-react\";\n\nimport { useSessionActions } from \"@/components/recording/session-actions\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nexport function ImportVideo() {\n const { startImport, importing } = useSessionActions();\n\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={startImport}\n disabled={importing}\n aria-label=\"Import video\"\n className=\"bg-background dark:bg-background\"\n />\n }\n >\n {importing ? (\n <Loader2 className=\"animate-spin\" strokeWidth={1.5} />\n ) : (\n <Import strokeWidth={1.5} />\n )}\n </TooltipTrigger>\n <TooltipContent>Import video</TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\n// TASK-25 / TASK-40 — the product \"New recording\" surface in the sidebar. The\n// recorder itself (state, disk, PiP) lives in SessionActionsProvider now so it\n// can be started from the empty state too; this component only renders the\n// sidebar's view of it:\n//\n// Idle: the primary sidebar button (the ETALON primary style — see empty state\n// and the Analyze CTA, which match it). Recording: a compact in-page control\n// block (REC + timer + mic / pause / stop / pop-out). The PiP floating widget is\n// rendered by the provider, not here — it drives the SAME recorder either way.\n\nimport {\n Mic,\n MicOff,\n Pause,\n PictureInPicture2,\n Play,\n Square,\n Video,\n} from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { useSessionActions } from \"@/components/recording/session-actions\";\nimport { formatElapsed } from \"@/hooks/useRecordingElapsed\";\nimport type { RecorderState } from \"@/lib/recording/recorder\";\nimport { cn } from \"@/lib/utils\";\n\nexport function NewRecording() {\n const { startRecording, recordingActive, recording } = useSessionActions();\n\n if (!recordingActive) {\n // Same Button component as the empty-state CTA (guaranteed identical size),\n // full-width to fill the sidebar row.\n return (\n <Button onClick={startRecording} className=\"w-full\">\n <Video strokeWidth={1.5} />\n New recording\n </Button>\n );\n }\n\n return (\n <InPageControls\n phase={recording.phase}\n elapsedMs={recording.elapsedMs}\n micEnabled={recording.micEnabled}\n canPopOut={recording.canPopOut}\n onPauseResume={recording.pauseResume}\n onStop={recording.stop}\n onToggleMic={recording.toggleMic}\n onPopOut={recording.popOut}\n />\n );\n}\n\n// The in-page recording surface: a dense, monochrome block (ADR-004) that fits\n// the sidebar's width. REC/timer up top; mic / pause / pop-out / Stop below.\nfunction InPageControls({\n phase,\n elapsedMs,\n micEnabled,\n canPopOut,\n onPauseResume,\n onStop,\n onToggleMic,\n onPopOut,\n}: {\n phase: RecorderState;\n elapsedMs: number;\n micEnabled: boolean;\n canPopOut: boolean;\n onPauseResume: () => void;\n onStop: () => void;\n onToggleMic: () => void;\n onPopOut: () => void;\n}) {\n const isRecording = phase === \"recording\";\n const isPaused = phase === \"paused\";\n\n return (\n <div className=\"flex flex-col gap-2.5 rounded-lg border border-border bg-card p-2.5\">\n <div className=\"flex items-center gap-2\">\n <RecDot isRecording={isRecording} isPaused={isPaused} />\n <span className=\"font-mono text-[11px] font-semibold tracking-wider text-foreground\">\n {isRecording ? \"REC\" : \"PAUSED\"}\n </span>\n <span className=\"ml-auto font-mono text-xs tabular-nums text-foreground\">\n {formatElapsed(elapsedMs)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onToggleMic}\n aria-label={micEnabled ? \"Mute microphone\" : \"Unmute microphone\"}\n className={cn(!micEnabled && \"text-muted-foreground\")}\n >\n {micEnabled ? (\n <Mic strokeWidth={1.5} />\n ) : (\n <MicOff strokeWidth={1.5} />\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onPauseResume}\n aria-label={isPaused ? \"Resume recording\" : \"Pause recording\"}\n >\n {isPaused ? <Play strokeWidth={1.5} /> : <Pause strokeWidth={1.5} />}\n </Button>\n {canPopOut && (\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onPopOut}\n aria-label=\"Pop out floating controls\"\n >\n <PictureInPicture2 strokeWidth={1.5} />\n </Button>\n )}\n <Button size=\"sm\" onClick={onStop} className=\"ml-auto\">\n <Square fill=\"currentColor\" strokeWidth={2} />\n Stop\n </Button>\n </div>\n </div>\n );\n}\n\n// Mirrors the RecIndicator dot (record-test / PiP widget): a solid pulsing dot\n// while recording, a hollow ring when paused. Monochrome (ADR-004); the pulse is\n// a calm ~1.6s breathe animating only opacity+transform (ADR-005). The keyframe\n// is scoped and self-contained so this block needs no shared-CSS change.\nfunction RecDot({\n isRecording,\n isPaused,\n}: {\n isRecording: boolean;\n isPaused: boolean;\n}) {\n return (\n <>\n <style>{`@keyframes vellum-rec-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.82)}}.vellum-rec-dot{animation:vellum-rec-pulse 1.6s ease-in-out infinite}`}</style>\n <span\n className={cn(\n \"size-2 shrink-0 rounded-full\",\n isRecording && \"vellum-rec-dot bg-foreground\",\n isPaused && \"border-[1.5px] border-foreground\",\n )}\n />\n </>\n );\n}\n","// TASK-14 — scan the workspace folder for Vellum sessions.\n//\n// This is the read side of ADR-008 (\"identity via markers, never assume\n// structure\"). We scan ONLY the first level of the workspace root and treat a\n// subfolder as a session only if it carries the `tasks.json` marker that\n// writeReport (TASK-7) drops. Everything else in the workspace — foreign files,\n// unmarked folders, the `.vellum-workspace.json` marker itself — is ignored.\n//\n// We deliberately do NOT parse tasks.json here. Presence of the marker is the\n// whole signal (ADR-008); a corrupt or unrecognized payload must not make a\n// session vanish from the list. Parsing is the session view's job (Phase 4).\n//\n// TASK-43 — the name sidecar (a 0-byte `<display-name>.txt` dropped inside a\n// session folder for Finder findability) is NOT a marker: it's a plain file, and\n// this scan only ever treats root-level DIRECTORIES carrying tasks.json/recording\n// as sessions. So the sidecar is ignored here by construction — it never changes\n// the lists / incomplete / unanalyzed logic and is never rendered as a session.\n\nimport { findRecording } from \"./recording-file\";\nimport { readOverrideName } from \"./session-name\";\nimport { sessionDisplayName } from \"@/lib/report/render-report\";\n\n/** The session marker (ADR-008) and the two deliverables a complete session has. */\nexport const SESSION_MARKER = \"tasks.json\";\nconst REPORT_FILE = \"report.md\";\n\nexport interface SessionRow {\n /**\n * The folder name — the stable session identity and URL slug. It is a\n * timestamp; it is NEVER renamed (the File System Access API can't rename a\n * directory), so this stays constant even after a Gemini suggestion or a manual\n * rename. Use `displayName` for what the user sees.\n */\n name: string;\n /**\n * The human-facing name (TASK-22): a manual override (name.txt) > Gemini's\n * suggested_name (tasks.json) > the folder name. Read best-effort — a corrupt\n * or unreadable tasks.json / name.txt falls back to the folder name, so a\n * session still lists (ADR-008 spirit) even when its name can't be resolved.\n */\n displayName: string;\n /**\n * Recency key: the marker file's last-modified time (ms). Reflects when the\n * session was last analyzed / re-rendered, which is the freshness we sort by.\n * Survives a folder rename, unlike a timestamp parsed from the folder name.\n */\n lastModified: number;\n /**\n * tasks.json is present but recording.webm or report.md is missing (ADR-008):\n * shown with an `incomplete` badge rather than hidden or crashing.\n */\n incomplete: boolean;\n /**\n * No tasks.json yet, but a real recording is on disk — a just-recorded (TASK-25)\n * or just-imported session that hasn't been analyzed. Surfaced (with an\n * `unanalyzed` badge) so the recording is reachable from the sidebar and never\n * orphaned by navigating away (never-lose-data). Mutually exclusive with an\n * analyzed row: an `unanalyzed` row has no marker, so `incomplete` is false.\n */\n unanalyzed: boolean;\n}\n\n/**\n * Does this session match a search query? Pure and case-insensitive so it can be\n * unit-tested offline (TASK-19). An empty/whitespace query matches everything\n * (the filter is \"off\"). Otherwise a plain substring match over the display NAME\n * only — searching hidden task content surfaced timestamp-named sessions with no\n * visible reason, which read as false positives; name-only is the predictable\n * behavior (content search deferred with a match reason / snippet if ever wanted).\n */\nexport function matchesQuery(row: SessionRow, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return row.displayName.toLowerCase().includes(q);\n}\n\n/**\n * List the workspace's sessions, most-recent first. Returns [] for an empty or\n * marker-only workspace. A directory entry that disappears mid-scan (or whose\n * marker can't be read) is simply skipped — a partially-deleted folder must not\n * crash the whole list.\n */\nexport async function scanSessions(\n workspace: FileSystemDirectoryHandle,\n): Promise<SessionRow[]> {\n const rows: SessionRow[] = [];\n\n for await (const entry of workspace.values()) {\n if (entry.kind !== \"directory\") continue; // files in the root are not sessions\n const row = await readSession(entry);\n if (row) rows.push(row);\n }\n\n // Most-recent first. lastModified is a number, so a plain descending sort.\n rows.sort((a, b) => b.lastModified - a.lastModified);\n return rows;\n}\n\n/**\n * Turn one subfolder into a SessionRow, or null if it isn't a Vellum session\n * (no marker and no recording) or became unreadable mid-scan.\n */\nasync function readSession(\n dir: FileSystemDirectoryHandle,\n): Promise<SessionRow | null> {\n const markerHandle = await getFileHandleOrNull(dir, SESSION_MARKER);\n if (!markerHandle) return readUnanalyzed(dir); // no marker → maybe a raw recording\n\n // Read the marker's mtime for recency (and, best-effort, its suggested_name).\n // If the file vanished between the handle and the read, treat the folder as\n // gone and skip it.\n let markerFile: File;\n try {\n markerFile = await markerHandle.getFile();\n } catch {\n return null;\n }\n const lastModified = markerFile.lastModified;\n\n // Recording may be webm (recorded) or mp4 (imported — S13); resolve either so\n // an imported session isn't wrongly flagged incomplete in the sidebar.\n const [recording, report, suggested, override] = await Promise.all([\n findRecording(dir),\n getFileHandleOrNull(dir, REPORT_FILE),\n readSuggestedName(markerFile),\n readOverrideName(dir),\n ]);\n\n return {\n name: dir.name,\n displayName: sessionDisplayName({ override, suggested, folderName: dir.name }),\n lastModified,\n incomplete: !recording || !report,\n unanalyzed: false,\n };\n}\n\n/**\n * Pull `suggested_name` out of the marker file, best-effort (TASK-22). We do NOT\n * run the full schema here — ADR-008 keeps this scan tolerant of a corrupt or\n * partial tasks.json — so we read the one field only if it's plausibly there and\n * fall back to null (→ folder name for display) on any problem.\n */\nasync function readSuggestedName(markerFile: File): Promise<string | null> {\n try {\n const parsed: unknown = JSON.parse(await markerFile.text());\n if (parsed && typeof parsed === \"object\" && \"suggested_name\" in parsed) {\n const value = (parsed as { suggested_name?: unknown }).suggested_name;\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * A folder with no `tasks.json` but a real recording is a recorded/imported\n * session awaiting analysis (TASK-25/30) — surface it so it's reachable, never\n * orphaned. A folder with no recording is not ours (ADR-008) → skip. A 0-byte\n * `recording.webm` is a crash stub owned by the recovery scan (TASK-24), not a\n * session here → skip. Recency is the recording's own mtime.\n */\nasync function readUnanalyzed(\n dir: FileSystemDirectoryHandle,\n): Promise<SessionRow | null> {\n const recording = await findRecording(dir);\n if (!recording) return null;\n\n let file: File;\n try {\n file = await recording.handle.getFile();\n } catch {\n return null; // vanished mid-scan\n }\n if (file.size === 0) return null; // crash stub → TASK-24, not a session row\n\n // No tasks.json yet → no suggested_name; a manual override is still possible.\n const override = await readOverrideName(dir);\n return {\n name: dir.name,\n displayName: sessionDisplayName({ override, suggested: null, folderName: dir.name }),\n lastModified: file.lastModified,\n incomplete: false,\n unanalyzed: true,\n };\n}\n\n/**\n * getFileHandle, but NotFoundError → null instead of throwing. A missing file\n * is an expected, meaningful state here (no marker, or an incomplete session),\n * not an error. Any other failure (e.g. permission) still throws.\n */\nasync function getFileHandleOrNull(\n dir: FileSystemDirectoryHandle,\n name: string,\n): Promise<FileSystemFileHandle | null> {\n try {\n return await dir.getFileHandle(name);\n } catch (err) {\n if (err instanceof DOMException && err.name === \"NotFoundError\") return null;\n throw err;\n }\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { useWorkspace } from \"@/components/workspace/workspace-provider\";\nimport { scanSessions, type SessionRow } from \"@/lib/filesystem/sessions\";\n\n// TASK-14 — read the workspace's sessions for the sidebar list. Scans against\n// the live, ready workspace handle (useWorkspace, TASK-15), and re-scans when\n// sessionsNonce bumps — i.e. after an in-app write (import/record/re-analyze),\n// so a freshly created session appears without a full page reload (TASK-30).\n\ntype State =\n | { status: \"loading\" }\n | { status: \"ready\"; sessions: SessionRow[] }\n | { status: \"error\" };\n\nexport function useSessions(): State {\n const { handle, sessionsNonce } = useWorkspace();\n const [state, setState] = useState<State>({ status: \"loading\" });\n\n useEffect(() => {\n let cancelled = false;\n scanSessions(handle)\n .then((sessions) => {\n if (!cancelled) setState({ status: \"ready\", sessions });\n })\n .catch(() => {\n // The handle is granted + reachable when we get here, so a failure is\n // unexpected (e.g. permission revoked mid-session). Surface it rather\n // than render a misleading empty list.\n if (!cancelled) setState({ status: \"error\" });\n });\n return () => {\n cancelled = true;\n };\n // Re-scan on handle change and whenever an in-app write bumps the nonce.\n }, [handle, sessionsNonce]);\n\n return state;\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { CircleDashed, Film, Loader2 } from \"lucide-react\";\n\nimport { useAnalysis } from \"@/components/analysis/analysis-provider\";\nimport { FadeText } from \"@/components/fade-text\";\nimport { useSessions } from \"@/hooks/useSessions\";\nimport { formatRelativeTime } from \"@/lib/time\";\nimport {\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n} from \"@/components/ui/sidebar\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { matchesQuery, type SessionRow } from \"@/lib/filesystem/sessions\";\n\n// TASK-14 — the session list inside the sidebar. Scans the workspace via\n// useSessions and renders one row per marked session, most-recent first.\n//\n// TASK-17 — rows are now navigable: each links to /session/<name> (the session\n// view). The active row is highlighted from the current path.\n//\n// TASK-19 — a live client-side filter: `query` (from the sidebar search box)\n// narrows the list to sessions whose display name or content matches. An empty\n// query shows everything; a query with no matches shows a friendly notice.\nexport function SessionList({ query = \"\" }: { query?: string }) {\n const state = useSessions();\n\n if (state.status === \"loading\") {\n return (\n <SidebarMenu>\n {/* A couple of placeholder rows while we read the directory. */}\n {[0, 1, 2].map((i) => (\n <SidebarMenuItem key={i}>\n <SidebarMenuSkeleton showIcon />\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n );\n }\n\n if (state.status === \"error\") {\n return (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">\n Couldn&apos;t read this workspace.\n </p>\n );\n }\n\n if (state.sessions.length === 0) {\n return (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">No sessions yet</p>\n );\n }\n\n const matches = state.sessions.filter((session) => matchesQuery(session, query));\n\n if (matches.length === 0) {\n return (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">No matches</p>\n );\n }\n\n return (\n <SidebarMenu>\n {matches.map((session) => (\n <SessionMenuItem key={session.name} session={session} />\n ))}\n </SidebarMenu>\n );\n}\n\nfunction SessionMenuItem({ session }: { session: SessionRow }) {\n const pathname = usePathname();\n // The route param is encoded; compare against the encoded name so the active\n // row still matches when the folder name has spaces or other URL-unsafe chars.\n const href = `/session/${encodeURIComponent(session.name)}`;\n const isActive = pathname === href;\n\n // TASK-42 — if THIS session is the one being analyzed, the row reports live\n // progress: a spinner in place of the film icon, the phase in the meta slot,\n // and a thin determinate bar along the bottom edge.\n const { analysis } = useAnalysis();\n const analyzing = analysis?.name === session.name ? analysis : null;\n\n // Status is now tooltip-only (badges removed): the row conveys it through the\n // icon (dashed ring vs. film) and the tooltip spells it out.\n const status = analyzing\n ? \"Analyzing…\"\n : session.unanalyzed\n ? \"Unanalyzed\"\n : session.incomplete\n ? \"Incomplete\"\n : \"Analyzed\";\n\n return (\n <SidebarMenuItem>\n {/* TASK-43 — a row-level tooltip surfaces the on-disk folder name (a\n timestamp; ADR-017 never renames it) alongside the display name, so\n app-name <-> Finder folder is mappable without opening the session.\n FadeText's own overflow tooltip is suppressed here (tooltip={false}) so\n the two don't stack. */}\n <Tooltip>\n <TooltipTrigger\n render={\n <SidebarMenuButton\n render={<Link href={href} />}\n isActive={isActive}\n // Selected row: a stronger fill than hover (gray-5) so the current\n // session reads clearly — darker than the panel in light, lighter in\n // dark (the ramp inverts). No hover change on the active row (hold\n // gray-5 on hover too). Keep the same font weight (override\n // data-active:font-medium).\n className=\"data-active:bg-[var(--gray-5)] data-active:font-normal data-active:hover:bg-[var(--gray-5)]\"\n />\n }\n >\n {/* Muted so the icon sits behind the name — hierarchy from contrast,\n not weight (ADR-004). The spinner keeps full contrast so a live run\n still reads at a glance. */}\n {analyzing ? (\n <Loader2 className=\"animate-spin\" strokeWidth={1.5} />\n ) : session.unanalyzed || session.incomplete ? (\n // Not-yet-analyzed / incomplete sessions read as a dashed ring; the\n // film icon is reserved for a real, analyzed session.\n <CircleDashed className=\"text-muted-foreground opacity-80\" strokeWidth={1.5} />\n ) : (\n <Film className=\"text-muted-foreground opacity-80\" strokeWidth={1.5} />\n )}\n {/* Effective display name (TASK-22): fades at the end when it overflows.\n Tooltip suppressed — the row tooltip below carries the full name.\n text-clip! cancels the SidebarMenuButton's `[&>span:last-child]:truncate`\n ellipsis (this is now the last child), leaving only the fade mask. */}\n <FadeText tooltip={false} className=\"min-w-0 flex-1 text-clip!\">\n {session.displayName}\n </FadeText>\n {/* The row stays quiet: no status badge and no timestamp. Both live in\n the tooltip now so the list reads as a clean column of names. */}\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"flex max-w-64 flex-col gap-0.5\">\n <span className=\"truncate text-popover-foreground\">\n {session.displayName}\n </span>\n {/* Folder name only when it adds information — for an unanalyzed row\n the display name IS the folder name, so showing it would just echo\n the line above. Kept for analyzed rows where the app-name <-> Finder\n folder mapping is otherwise invisible (TASK-43). */}\n {session.name !== session.displayName && (\n <span className=\"truncate font-mono text-[11px] text-muted-foreground\">\n {session.name}\n </span>\n )}\n {/* Status + recency, moved off the row and into the tooltip. */}\n <span className=\"text-[11px] text-muted-foreground\">\n {status} · {formatRelativeTime(session.lastModified)}\n </span>\n </TooltipContent>\n </Tooltip>\n </SidebarMenuItem>\n );\n}\n\n","\"use client\";\n\nimport { useState } from \"react\";\nimport Link from \"next/link\";\nimport { Check, CircleAlert, Folder, KeyRound } from \"lucide-react\";\n\nimport { useWorkspace } from \"@/components/workspace/workspace-provider\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n notifyKeyChanged,\n useKeyStatus,\n type KeyStatusState,\n} from \"@/lib/key-status/use-key-status\";\n\n// Compact status block in the sidebar footer (TASK-38). It surfaces the two\n// facts the app can't infer from the UI alone: whether a Gemini key is\n// configured (server-side, via /api/key-status) and which folder is the active\n// workspace (from the ready WorkspaceProvider), with a re-pick action.\n//\n// The key row is a LIVE, manageable surface (TASK-65.2): it refetches without a\n// reload when the key changes (useKeyStatus), and when a key saved to\n// ~/.vellum/.env is present it offers change (→ /settings/key) and a\n// confirm-guarded remove. A key coming from an env var is shown as configured\n// but isn't removable from here — deleting the file wouldn't clear it.\n//\n// This replaces the standalone Settings page (TASK-29): the step-by-step key\n// screen still lives at /settings/key, linked from the key row here and from the\n// analyze missing-key error. Deliberately a status surface, not a panel.\n\nexport function SidebarStatus() {\n const { handle, repickWorkspace } = useWorkspace();\n const key = useKeyStatus();\n\n return (\n <div className=\"flex flex-col gap-0.5\">\n {/* Key status row owns the full width now — the theme toggle moved up to\n the logo band (ADR-019). */}\n <KeyRow state={key} />\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n onClick={repickWorkspace}\n className=\"group flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-muted-foreground transition-colors hover:bg-sidebar-accent hover:text-foreground\"\n />\n }\n >\n <Folder className=\"size-4 shrink-0\" strokeWidth={1.5} />\n <span className=\"flex-1 truncate\">{handle.name}</span>\n <span className=\"shrink-0 pr-0.5 text-xs text-muted-foreground transition-colors group-hover:text-foreground\">\n Change\n </span>\n </TooltipTrigger>\n <TooltipContent>Change workspace folder</TooltipContent>\n </Tooltip>\n </div>\n );\n}\n\nconst ROW = \"flex items-center gap-2 rounded-md px-2 py-1.5 text-sm\";\n\nfunction KeyRow({ state }: { state: KeyStatusState }) {\n // No key → the row is the CTA to the setup screen.\n if (state.status === \"ready\" && !state.present) {\n return (\n <Link\n href=\"/settings/key\"\n className={`${ROW} text-foreground transition-colors hover:bg-sidebar-accent`}\n >\n <KeyRound\n className=\"size-4 shrink-0 text-muted-foreground\"\n strokeWidth={1.5}\n />\n <span className=\"truncate\">No key — set up</span>\n </Link>\n );\n }\n\n // Present → a live status; interactive only when the key is file-sourced\n // (removable). An env-sourced key is configured but managed elsewhere.\n if (state.status === \"ready\" && state.present) {\n return state.source === \"file\" ? <FileKeyRow /> : <EnvKeyRow />;\n }\n\n // Error → a degraded status line with a muted alert where the Check would sit\n // and a tooltip explaining why (the server couldn't be reached).\n if (state.status === \"error\") {\n return <ErrorKeyRow />;\n }\n\n // Loading stays a quiet, non-interactive status line.\n return (\n <div className={`${ROW} text-muted-foreground`}>\n <KeyRound className=\"size-4 shrink-0\" strokeWidth={1.5} />\n <span className=\"truncate\">Checking key…</span>\n </div>\n );\n}\n\n// The status check failed (server unreachable or the route errored). Mirrors the\n// configured rows, but the green Check is replaced by a muted alert icon and a\n// tooltip explains it's a transient, self-clearing state — not \"no key\".\nfunction ErrorKeyRow() {\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <div\n tabIndex={0}\n className={`${ROW} text-muted-foreground outline-none`}\n />\n }\n >\n <KeyRound className=\"size-4 shrink-0\" strokeWidth={1.5} />\n <span className=\"truncate\">Key status unavailable</span>\n <CircleAlert\n className=\"size-4 shrink-0 text-muted-foreground\"\n strokeWidth={1.5}\n aria-hidden\n />\n </TooltipTrigger>\n <TooltipContent>\n Couldn&apos;t reach the local server to check the key. It may be starting\n up — this clears once it responds.\n </TooltipContent>\n </Tooltip>\n );\n}\n\n// Present + saved in ~/.vellum/.env: interactive. Clicking the label opens\n// /settings/key to change the key; a hover-revealed Remove opens a confirm modal\n// before deleting (so a stray click can't clear the key).\nfunction FileKeyRow() {\n const [open, setOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n\n async function remove() {\n setDeleting(true);\n try {\n const res = await fetch(\"/api/key\", { method: \"DELETE\" });\n if (!res.ok) throw new Error(`delete ${res.status}`);\n } catch {\n // Deletion failed — the key is still there. Close the dialog quietly; the\n // status row keeps reading \"configured\".\n setDeleting(false);\n setOpen(false);\n return;\n }\n // Flip every live consumer to the no-key state; this row unmounts as the\n // parent re-renders the CTA, so there's no local state left to reset.\n notifyKeyChanged();\n }\n\n return (\n <>\n <div className={`${ROW} group text-muted-foreground transition-colors hover:bg-sidebar-accent`}>\n {/* Primary action: change the key. The label + status Check is the\n target, mirroring the workspace row below. Not flex-1 — the Check\n sits immediately after the text, not floated to the row edge. */}\n <Link\n href=\"/settings/key\"\n className=\"flex min-w-0 items-center gap-2 transition-colors group-hover:text-foreground\"\n >\n <KeyRound className=\"size-4 shrink-0\" strokeWidth={1.5} />\n <span className=\"truncate\">Key configured</span>\n {/* Green is a functional status affirmation (like --destructive for\n errors), not a brand accent — the one nod to color ADR-004 allows. */}\n <Check\n className=\"size-4 shrink-0 text-green-500\"\n strokeWidth={2.5}\n aria-hidden\n />\n </Link>\n {/* Remove is pinned to the right edge and revealed on row hover, so the\n resting row stays a calm status line. Same muted-xs treatment as the\n workspace \"Change\"; the confirm modal guards an accidental click. */}\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"ml-auto shrink-0 pr-0.5 text-xs text-muted-foreground opacity-0 transition-[color,opacity] duration-150 ease-out group-hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100\"\n >\n Remove\n </button>\n </div>\n\n <Dialog open={open} onOpenChange={(next) => !deleting && setOpen(next)}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>Remove API key?</DialogTitle>\n <DialogDescription>\n This clears the key saved in <code>~/.vellum/.env</code>. Analysis\n won&apos;t run until you add one again. You can set a new key any\n time from the sidebar.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <DialogClose\n render={<Button variant=\"outline\" disabled={deleting} />}\n >\n Cancel\n </DialogClose>\n <Button onClick={remove} disabled={deleting}>\n {deleting ? \"Removing…\" : \"Remove key\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\n// Present + provided by an env var / .env.local: configured, but not removable\n// from here (deleting the file wouldn't clear it — bin/vellum.mjs precedence).\n// A tooltip explains why there's no Remove; no change action, since a POST\n// wouldn't override the env var either.\nfunction EnvKeyRow() {\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <div\n tabIndex={0}\n className={`${ROW} text-muted-foreground outline-none`}\n />\n }\n >\n <KeyRound className=\"size-4 shrink-0\" strokeWidth={1.5} />\n <span className=\"truncate\">Key configured</span>\n <Check\n className=\"size-4 shrink-0 text-green-500\"\n strokeWidth={2.5}\n aria-hidden\n />\n </TooltipTrigger>\n <TooltipContent>\n Set via an environment variable — remove it where it&apos;s defined.\n </TooltipContent>\n </Tooltip>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],\n ['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],\n ['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],\n];\n\n/**\n * @component @name Sun\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xMiAydjIiIC8+CiAgPHBhdGggZD0iTTEyIDIwdjIiIC8+CiAgPHBhdGggZD0ibTQuOTMgNC45MyAxLjQxIDEuNDEiIC8+CiAgPHBhdGggZD0ibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJNMiAxMmgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxMmgyIiAvPgogIDxwYXRoIGQ9Im02LjM0IDE3LjY2LTEuNDEgMS40MSIgLz4KICA8cGF0aCBkPSJtMTkuMDcgNC45My0xLjQxIDEuNDEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sun\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sun = createLucideIcon('sun', __iconNode);\n\nexport default Sun;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34', key: '14j7rj' }],\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n];\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon('search', __iconNode);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n];\n\n/**\n * @component @name CircleAlert\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-alert\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleAlert = createLucideIcon('circle-alert', __iconNode);\n\nexport default CircleAlert;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z',\n key: '1kt360',\n },\n ],\n];\n\n/**\n * @component @name Folder\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/folder\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Folder = createLucideIcon('folder', __iconNode);\n\nexport default Folder;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M7 3v18', key: 'bbkbws' }],\n ['path', { d: 'M3 7.5h4', key: 'zfgn84' }],\n ['path', { d: 'M3 12h18', key: '1i2n21' }],\n ['path', { d: 'M3 16.5h4', key: '1230mu' }],\n ['path', { d: 'M17 3v18', key: 'in4fa5' }],\n ['path', { d: 'M17 7.5h4', key: 'myr1c1' }],\n ['path', { d: 'M17 16.5h4', key: 'go4c1d' }],\n];\n\n/**\n * @component @name Film\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik03IDN2MTgiIC8+CiAgPHBhdGggZD0iTTMgNy41aDQiIC8+CiAgPHBhdGggZD0iTTMgMTJoMTgiIC8+CiAgPHBhdGggZD0iTTMgMTYuNWg0IiAvPgogIDxwYXRoIGQ9Ik0xNyAzdjE4IiAvPgogIDxwYXRoIGQ9Ik0xNyA3LjVoNCIgLz4KICA8cGF0aCBkPSJNMTcgMTYuNWg0IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/film\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Film = createLucideIcon('film', __iconNode);\n\nexport default Film;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401',\n key: 'kfwtm',\n },\n ],\n];\n\n/**\n * @component @name Moon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/moon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Moon = createLucideIcon('moon', __iconNode);\n\nexport default Moon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10.1 2.182a10 10 0 0 1 3.8 0', key: '5ilxe3' }],\n ['path', { d: 'M13.9 21.818a10 10 0 0 1-3.8 0', key: '11zvb9' }],\n ['path', { d: 'M17.609 3.721a10 10 0 0 1 2.69 2.7', key: '1iw5b2' }],\n ['path', { d: 'M2.182 13.9a10 10 0 0 1 0-3.8', key: 'c0bmvh' }],\n ['path', { d: 'M20.279 17.609a10 10 0 0 1-2.7 2.69', key: '1ruxm7' }],\n ['path', { d: 'M21.818 10.1a10 10 0 0 1 0 3.8', key: 'qkgqxc' }],\n ['path', { d: 'M3.721 6.391a10 10 0 0 1 2.7-2.69', key: '1mcia2' }],\n ['path', { d: 'M6.391 20.279a10 10 0 0 1-2.69-2.7', key: '1fvljs' }],\n];\n\n/**\n * @component @name CircleDashed\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuMSAyLjE4MmExMCAxMCAwIDAgMSAzLjggMCIgLz4KICA8cGF0aCBkPSJNMTMuOSAyMS44MThhMTAgMTAgMCAwIDEtMy44IDAiIC8+CiAgPHBhdGggZD0iTTE3LjYwOSAzLjcyMWExMCAxMCAwIDAgMSAyLjY5IDIuNyIgLz4KICA8cGF0aCBkPSJNMi4xODIgMTMuOWExMCAxMCAwIDAgMSAwLTMuOCIgLz4KICA8cGF0aCBkPSJNMjAuMjc5IDE3LjYwOWExMCAxMCAwIDAgMS0yLjcgMi42OSIgLz4KICA8cGF0aCBkPSJNMjEuODE4IDEwLjFhMTAgMTAgMCAwIDEgMCAzLjgiIC8+CiAgPHBhdGggZD0iTTMuNzIxIDYuMzkxYTEwIDEwIDAgMCAxIDIuNy0yLjY5IiAvPgogIDxwYXRoIGQ9Ik02LjM5MSAyMC4yNzlhMTAgMTAgMCAwIDEtMi42OS0yLjciIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/circle-dashed\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst CircleDashed = createLucideIcon('circle-dashed', __iconNode);\n\nexport default CircleDashed;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 9V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10c0 1.1.9 2 2 2h4', key: 'daa4of' }],\n ['rect', { width: '10', height: '7', x: '12', y: '13', rx: '2', key: '1nb8gs' }],\n];\n\n/**\n * @component @name PictureInPicture2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgOVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEwYzAgMS4xLjkgMiAyIDJoNCIgLz4KICA8cmVjdCB3aWR0aD0iMTAiIGhlaWdodD0iNyIgeD0iMTIiIHk9IjEzIiByeD0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/picture-in-picture-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst PictureInPicture2 = createLucideIcon('picture-in-picture-2', __iconNode);\n\nexport default PictureInPicture2;\n"],"names":["Search"],"mappings":"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A,GAAA,EAAC,MAAA,CACC,SAAU,EACV,UAAW,CAAA,EAAG,EAAI,mCAAmC,CAAC,aAI1D,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,UAAU,kBAAkB,YAAa,MACnD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBAAW,mBAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,UAAU,iCACV,YAAa,IACb,aAAW,CAAA,CAAA,OAGf,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,UAAC,sEAKtB,0KCpOM,GAAA,CAAA,EAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAiB,CAAA,CAAA,IAvBO,CAuBA,WAtBrB,GAAI,KAAM,GAAA,KAAU,EAAA,QAAa,mBACrC,CAAE,ACAV,AMAQ,AHAA,AJAA,AMAA,AJAA,CKAE,ALAA,CAAA,UFAc,CIAA,AJAA,AEAA,AIAX,ACAU,GPAM,sBAChB,WAAY,CMAZ,AFAY,AFAD,AFAC,CAAA,AIAA,AEAZ,AJAW,CEAC,AEAZ,AJAW,AFAC,CEAD,AEAC,AJAK,AMAjB,ANAY,CIAK,AEAjB,ANAiB,AEAN,CEAM,AEAjB,ANAiB,QAAU,CEAH,AIAxB,ANCd,QAAS,CKAF,AJYH,AEZG,AGAE,ANAA,AIAA,yBJA6B,CAAA,AKA/B,AFAA,AGAO,ACYU,GPZmB,CKApC,ALAoC,AMA7B,ALY0B,AEZjC,AIYkC,CFZlC,ACAO,ACY2B,APZE,ACYH,AEZjC,CEAA,ACAO,ACY2B,AJZlC,AHAoC,ACYH,QDXxC,oCAAwC,IAAK,CEYV,AFZU,AMA/B,CAAA,AJYqB,AFZU,CMA/B,AJYqB,AFZU,CAAA,AEYV,AIZrB,CNA+B,AMA/B,cNCL,CAAE,AAAF,AMAA,AFAA,EJAK,CAAA,AMAA,AFAA,CEAA,AFAA,AJAA,CIAA,AJAA,AMAA,CNAA,AMAA,AFAA,CAAA,AJAA,AMAA,CAAA,AFAA,AJAA,CAAA,AIAA,AEAA,CFAA,AEAA,ANAA,CAAA,AMAA,AFAA,CEAA,AFAA,AJAA,AAAW,IAAK,WAC9B,CAAC,CIAA,AJAA,AMAA,CNAA,AIAA,AEAA,CFAA,AEAA,ANAA,CIAA,AJAA,AMAA,CFAA,AEAA,ANAA,CMAA,AFAA,AJAA,CAAA,AIAA,AEAA,CNAU,EAAA,WAAe,IAAK,UAAU,CACzC,mCAAuC,CMAzB,AFAmB,AJAM,CMAzB,ANAyB,EAAA,WACvC,QAAS,CAAA,AKYL,AFAA,EHZU,CKYH,AFAE,AHZC,uBAAyB,IAAK,CKYR,AFAI,AHZI,OAAA,CAAU,CAAA,GRRxD,IAAA,GAAA,EAAA,CAAA,CAAA,OAiBA,IAAM,GAAU,CACd,CAAE,MAAO,QAAS,MAAO,QAAS,KAAM,EAAI,EAC5C,CAAE,MAAO,OAAQ,MAAO,OAAQ,KAAM,EAAK,EAC5C,CAEM,SAAS,KACd,GAAM,OAAE,CAAK,CAAE,UAAQ,CAAE,CAAG,CAAA,EAAA,GAAA,QAAA,AAAQ,IAC9B,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAGvC,MAFA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,IAAM,GAAW,GAAO,EAAE,EAGlC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yFACZ,GAAQ,GAAG,CAAC,CAAC,OAAE,CAAK,OAAE,CAAK,MAAE,CAAI,CAAE,IAClC,IAAM,EAAS,GAAW,IAAU,EACpC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CACb,OACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAS,GACxB,aAAY,EACZ,eAAc,EACd,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,+GACA,EACI,yCACA,0DAKV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,UAAU,WAAW,YAAa,QAE1C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,eAAO,MAnBhB,EAsBlB,IAGN,CCjDA,IAAA,GAAA,EAAA,CAAA,CAAA,2BAyBO,SAAS,EAKd,GAAM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC7B,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAIvC,iBAAE,CAAe,CAAE,CAAG,CAAA,EAAA,EAAA,iBAAA,AAAiB,IAQ7C,MAME,CALA,AAKA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,CAAC,QAAQ,QAAQ,UAAU,kBACjC,CAAA,EAAA,EAAA,IAAA,CANyE,CAMxE,EAAA,aAAa,CAAA,CAAC,UAAU,sBAIvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DAGb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,IAAI,CAAA,CAAC,UAAU,aAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,kGAvCR,CAwCL,WAGL,CAAA,EAAA,EAAA,GAAA,EAAC,GAAA,CAAA,MAEH,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAC,UAAU,uBAKrB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,eAAe,CAAA,CAAC,UAAU,uCACzB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,KAEF,CAAC,GAAmB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,WAO5B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,UAAU,2BACxB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,YAAY,CAAA,CAAC,UAAU,2BACtB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDAGb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAAC,UAAU,gGAAuF,aAGpH,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CACb,OACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAzDG,CAyDM,GAxDzB,EAAc,AAAC,IACT,GAAM,EAAS,IACZ,CAAC,AADgB,IAwDV,aAAY,EAAa,SAxDa,MAwDI,kBAC1C,gBAAe,EACf,UAAW,CAAC,mCAAmC,EAC7C,EACI,kBACA,8CAAA,CACJ,YAIN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,UAAU,WAAW,YAAa,QAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,UACZ,EAAa,eAAiB,0BAIpC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8BAIb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,UAAU,gGACV,YAAa,MAEf,CAAA,EAAA,EAAA,GAAA,EAAC,GAAA,KAAK,CAAA,CACJ,KAAK,OACL,SAAS,CAAA,CAAA,EACT,MAAO,EACP,SAAU,AAAC,GAAM,EAAS,EAAE,MAAM,CAAC,KAAK,EACxC,YAAY,kBACZ,aAAW,kBACX,UAAU,0BAEX,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAS,IACxB,aAAW,eACX,UAAU,mJAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAC,CAAA,CAAC,UAAU,WAAW,YAAa,aAM/C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,mBAAmB,CAAA,CAAC,UAAU,0CAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,MAAO,EAAa,EAAQ,YAK/C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CAAC,UAAU,kBACvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAA,OAIT","ignoreList":[8,9,10,11,12,13,14,15]}
@@ -1,3 +0,0 @@
1
- module.exports=[96120,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(52562);let f=(0,a.i(64831).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);var g=a.i(26766),h=a.i(99570),i=a.i(66718),j=a.i(34550);function k({n:a}){return(0,b.jsx)("span",{className:"flex size-6 shrink-0 items-center justify-center rounded-full border border-border font-mono text-xs text-muted-foreground",children:a})}a.s(["KeySetup",0,function(){let a=(0,d.useRouter)(),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)({state:"idle"}),p="saving"===n.state,q=l.trim();async function r(a){if(a.preventDefault(),!(q.length<20)&&!p){o({state:"saving"});try{let a=await fetch("/api/key",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:q})}),b=await a.json();if(!a.ok||!b.ok)return void o({state:"error",message:b.error??"Couldn't save the key."});(0,j.notifyKeyChanged)(),o({state:"saved"})}catch{o({state:"error",message:"Couldn't reach the local server. Is Vellum still running?"})}}}return"saved"===n.state?(0,b.jsxs)("div",{className:"mx-auto w-full max-w-lg animate-in fade-in-0 zoom-in-95 duration-200 ease-out",children:[(0,b.jsx)("div",{className:"flex size-9 items-center justify-center rounded-lg border border-border bg-card",children:(0,b.jsx)(e.Check,{className:"size-5 text-green-500",strokeWidth:2})}),(0,b.jsx)("h1",{className:"mt-4 text-lg font-medium tracking-tight",children:"Key saved"}),(0,b.jsxs)("p",{className:"mt-1.5 text-sm text-muted-foreground",children:["Stored in ",(0,b.jsx)("code",{className:"font-mono text-[13px]",children:"~/.vellum/.env"}),"and active now — no restart needed. You're ready to analyze."]}),(0,b.jsx)(h.Button,{className:"mt-6",onClick:()=>{a.push("/"),a.refresh()},children:"Continue"})]}):(0,b.jsxs)("div",{className:"mx-auto w-full max-w-lg animate-in fade-in-0 zoom-in-95 duration-200 ease-out",children:[(0,b.jsx)("div",{className:"flex size-9 items-center justify-center rounded-lg border border-border bg-card",children:(0,b.jsx)(g.KeyRound,{className:"size-5",strokeWidth:1.5})}),(0,b.jsx)("h1",{className:"mt-4 text-lg font-medium tracking-tight",children:"Set up your Gemini API key"}),(0,b.jsxs)("p",{className:"mt-1.5 text-sm text-muted-foreground",children:["Vellum analyzes recordings with the Google Gemini API under your own key. It's stored in ",(0,b.jsx)("code",{className:"font-mono text-[13px]",children:"~/.vellum/.env"})," on this machine — it never leaves the server."]}),(0,b.jsxs)("ol",{className:"mt-8 space-y-6",children:[(0,b.jsxs)("li",{className:"flex gap-3",children:[(0,b.jsx)(k,{n:1}),(0,b.jsxs)("div",{className:"min-w-0 flex-1 pt-0.5",children:[(0,b.jsx)("p",{className:"text-sm font-medium",children:"Get a key from Google AI Studio"}),(0,b.jsxs)("a",{href:"https://aistudio.google.com/apikey",target:"_blank",rel:"noreferrer",className:"mt-1 inline-flex items-center gap-1 text-sm text-foreground underline decoration-border underline-offset-4 transition-colors hover:decoration-foreground",children:["aistudio.google.com/apikey",(0,b.jsx)(f,{className:"size-3",strokeWidth:1.5})]})]})]}),(0,b.jsxs)("li",{className:"flex gap-3",children:[(0,b.jsx)(k,{n:2}),(0,b.jsxs)("div",{className:"min-w-0 flex-1 pt-0.5",children:[(0,b.jsx)("p",{className:"text-sm font-medium",children:"Paste it here"}),(0,b.jsxs)("form",{onSubmit:r,className:"mt-2 flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(i.Input,{type:"password",value:l,onChange:a=>{m(a.target.value),"error"===n.state&&o({state:"idle"})},placeholder:"AIza…",autoComplete:"off",spellCheck:!1,"aria-invalid":"error"===n.state,className:"font-mono",disabled:p}),(0,b.jsx)(h.Button,{type:"submit",disabled:q.length<20||p,children:p?"Saving…":"Save"})]}),"error"===n.state&&(0,b.jsx)("p",{className:"text-sm text-destructive",children:n.message})]})]})]})]})]})}],96120)}];
2
-
3
- //# sourceMappingURL=src_components_settings_key-setup_tsx_0jxhnpa._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/settings/key-setup.tsx","../../../../node_modules/lucide-react/src/icons/external-link.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { Check, ExternalLink, KeyRound } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { notifyKeyChanged } from \"@/lib/key-status/use-key-status\";\nimport type { KeyWriteResult } from \"@/app/api/key/route\";\n\n// The Gemini-key setup screen (TASK-29, reworked in TASK-64). Once file-editing\n// instructions; now a real input. The user pastes a key, we POST it to\n// /api/key, which persists it to ~/.vellum/.env and sets it on the running\n// server (no restart), then we send them into the app.\n//\n// Privacy holds by construction (ARCHITECTURE §Privacy): the key is masked in\n// the field, sent once over the local loopback to our own server, and never\n// echoed back. This screen still only ever tells the user where a key GOES.\n\nconst AISTUDIO_URL = \"https://aistudio.google.com/apikey\";\n\ntype Status =\n | { state: \"idle\" }\n | { state: \"saving\" }\n | { state: \"error\"; message: string }\n | { state: \"saved\" };\n\nexport function KeySetup() {\n const router = useRouter();\n const [key, setKey] = useState(\"\");\n const [status, setStatus] = useState<Status>({ state: \"idle\" });\n\n const saving = status.state === \"saving\";\n const trimmed = key.trim();\n\n async function save(event: React.FormEvent) {\n event.preventDefault();\n if (trimmed.length < 20 || saving) return;\n setStatus({ state: \"saving\" });\n try {\n const res = await fetch(\"/api/key\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key: trimmed }),\n });\n const data = (await res.json()) as KeyWriteResult;\n if (!res.ok || !data.ok) {\n setStatus({ state: \"error\", message: data.error ?? \"Couldn't save the key.\" });\n return;\n }\n // Flip the sidebar (and any other live consumer) to \"Key configured\"\n // right away — independent of whether/when the user navigates on.\n notifyKeyChanged();\n setStatus({ state: \"saved\" });\n } catch {\n setStatus({ state: \"error\", message: \"Couldn't reach the local server. Is Vellum still running?\" });\n }\n }\n\n if (status.state === \"saved\") {\n return (\n <div className=\"mx-auto w-full max-w-lg animate-in fade-in-0 zoom-in-95 duration-200 ease-out\">\n <div className=\"flex size-9 items-center justify-center rounded-lg border border-border bg-card\">\n <Check className=\"size-5 text-green-500\" strokeWidth={2} />\n </div>\n <h1 className=\"mt-4 text-lg font-medium tracking-tight\">Key saved</h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">\n Stored in <code className=\"font-mono text-[13px]\">~/.vellum/.env</code> and active now —\n no restart needed. You&apos;re ready to analyze.\n </p>\n <Button\n className=\"mt-6\"\n onClick={() => {\n router.push(\"/\");\n router.refresh();\n }}\n >\n Continue\n </Button>\n </div>\n );\n }\n\n return (\n // ease-out enter; scale from 0.95, ~200ms (ADR-005 / emil-skill).\n <div className=\"mx-auto w-full max-w-lg animate-in fade-in-0 zoom-in-95 duration-200 ease-out\">\n <div className=\"flex size-9 items-center justify-center rounded-lg border border-border bg-card\">\n <KeyRound className=\"size-5\" strokeWidth={1.5} />\n </div>\n <h1 className=\"mt-4 text-lg font-medium tracking-tight\">\n Set up your Gemini API key\n </h1>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">\n Vellum analyzes recordings with the Google Gemini API under your own key.\n It&apos;s stored in <code className=\"font-mono text-[13px]\">~/.vellum/.env</code> on this\n machine — it never leaves the server.\n </p>\n\n <ol className=\"mt-8 space-y-6\">\n <li className=\"flex gap-3\">\n <Step n={1} />\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"text-sm font-medium\">Get a key from Google AI Studio</p>\n <a\n href={AISTUDIO_URL}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-sm text-foreground underline decoration-border underline-offset-4 transition-colors hover:decoration-foreground\"\n >\n aistudio.google.com/apikey\n <ExternalLink className=\"size-3\" strokeWidth={1.5} />\n </a>\n </div>\n </li>\n\n <li className=\"flex gap-3\">\n <Step n={2} />\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"text-sm font-medium\">Paste it here</p>\n <form onSubmit={save} className=\"mt-2 flex flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"password\"\n value={key}\n onChange={(e) => {\n setKey(e.target.value);\n if (status.state === \"error\") setStatus({ state: \"idle\" });\n }}\n placeholder=\"AIza…\"\n autoComplete=\"off\"\n spellCheck={false}\n aria-invalid={status.state === \"error\"}\n className=\"font-mono\"\n disabled={saving}\n />\n <Button type=\"submit\" disabled={trimmed.length < 20 || saving}>\n {saving ? \"Saving…\" : \"Save\"}\n </Button>\n </div>\n {status.state === \"error\" && (\n <p className=\"text-sm text-destructive\">{status.message}</p>\n )}\n </form>\n </div>\n </li>\n </ol>\n </div>\n );\n}\n\nfunction Step({ n }: { n: number }) {\n return (\n <span className=\"flex size-6 shrink-0 items-center justify-center rounded-full border border-border font-mono text-xs text-muted-foreground\">\n {n}\n </span>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 3h6v6', key: '1q9fwt' }],\n ['path', { d: 'M10 14 21 3', key: 'gplh6r' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6', key: 'a6xqqp' }],\n];\n\n/**\n * @component @name ExternalLink\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ExternalLink = createLucideIcon('external-link', __iconNode);\n\nexport default ExternalLink;\n"],"names":[],"mappings":"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","ignoreList":[1]}
@@ -1,3 +0,0 @@
1
- module.exports=[70430,a=>{"use strict";var b=a.i(87924),c=a.i(68114);a.s(["Label",0,function({className:a,...d}){return(0,b.jsx)("label",{"data-slot":"label",className:(0,c.cn)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",a),...d})}])},75083,a=>{"use strict";var b,c,d,e=a.i(87924);a.s([],17464),a.i(17464);var f=a.i(72131),g=a.i(50381),h=a.i(57738),i=a.i(54401),j=a.i(26184),k=a.i(79923),l=a.i(54662);let m=f.createContext(void 0);function n(){let a=f.useContext(m);if(void 0===a)throw Error((0,l.default)(64));return a}let o=((b={}).activationDirection="data-activation-direction",b.orientation="data-orientation",b),p={tabActivationDirection:a=>({[o.activationDirection]:a})};var q=a.i(94552),r=a.i(7436);let s=f.forwardRef(function(a,b){let{className:c,defaultValue:d=0,onValueChange:l,orientation:n="horizontal",render:o,value:s,style:u,...v}=a,w=void 0!==a.defaultValue,x=f.useRef([]),[y,z]=f.useState(()=>new Map),[A,B]=(0,g.useControlled)({controlled:s,default:d,name:"Tabs",state:"value"}),C=void 0!==s,[D,E]=f.useState(()=>new Map),F=f.useRef(void 0),G=f.useCallback(a=>{if(void 0===a)return null;for(let[b,c]of D.entries())if(null!=c&&a===(c.value??c.index))return b;return null},[D]),[H,I]=f.useState(()=>({previousValue:A,tabActivationDirection:"none"})),{previousValue:J,tabActivationDirection:K}=H,L=K,M=!1;J!==A&&(L=t(J,A,n,D),M=null!=J&&null!=A&&null==G(A));let N=M?J:A,O=J!==N||K!==L;(0,h.useIsoLayoutEffect)(()=>{O&&I({previousValue:N,tabActivationDirection:L})},[N,O,L]);let P=(0,i.useStableCallback)((a,b)=>{b.activationDirection=t(A,a,n,D),l?.(a,b),b.isCanceled||B(a)}),Q=(0,i.useStableCallback)((a,b)=>{l?.(a,(0,q.createChangeEventDetails)(b,void 0,void 0,{activationDirection:"none"}))}),R=(0,i.useStableCallback)((a,b)=>{z(c=>{if(c.get(a)===b)return c;let d=new Map(c);return d.set(a,b),d})}),S=(0,i.useStableCallback)((a,b)=>{z(c=>{if(!c.has(a)||c.get(a)!==b)return c;let d=new Map(c);return d.delete(a),d})}),T=f.useCallback(a=>y.get(a),[y]),U=f.useCallback(a=>{for(let b of D.values())if(a===b?.value)return b?.id},[D]),V=f.useMemo(()=>({getTabElementBySelectedValue:G,getTabIdByPanelValue:U,getTabPanelIdByValue:T,onValueChange:P,orientation:n,registerMountedTabPanel:R,setTabMap:E,unregisterMountedTabPanel:S,tabActivationDirection:L,value:A}),[G,U,T,P,n,R,E,S,L,A]),W=f.useMemo(()=>{for(let a of D.values())if(null!=a&&a.value===A)return a},[D,A]),X=f.useMemo(()=>{for(let a of D.values())if(null!=a&&!a.disabled)return a.value},[D]),Y=f.useRef(!w),Z=f.useRef(d),$=f.useRef(w),_=f.useRef(!1);(0,h.useIsoLayoutEffect)(()=>{if(C)return;function a(a,b){B(a),I(b=>b.previousValue===a&&"none"===b.tabActivationDirection?b:{previousValue:a,tabActivationDirection:"none"}),Q(a,b),Y.current=!1}if(0===D.size){_.current&&null!==A&&!F.current?.isConnected&&a(null,r.REASONS.missing);return}_.current=!0,F.current=D.keys().next().value;let b=W?.disabled,c=null==W&&null!==A;if(b||A!==Z.current||($.current=!1),$.current&&b&&A===Z.current)return;let d=Y.current;if(b||c){let c=X??null;if(A===c){Y.current=!1;return}let e=r.REASONS.missing;d?e=r.REASONS.initial:b&&(e=r.REASONS.disabled),a(c,e);return}d&&null!=W&&(Q(A,r.REASONS.initial),Y.current=!1)},[X,C,Q,W,B,D,A]);let aa={orientation:n,tabActivationDirection:L},ab=(0,j.useRenderElement)("div",a,{state:aa,ref:b,props:v,stateAttributesMapping:p});return(0,e.jsx)(m.Provider,{value:V,children:(0,e.jsx)(k.CompositeList,{elementsRef:x,children:ab})})});function t(a,b,c,d){if(null==a||null==b)return"none";let e=null,f=null;for(let[c,g]of d.entries()){if(null==g)continue;let d=g.value??g.index;if(a===d&&(e=c),b===d&&(f=c),null!=e&&null!=f)break}if(null==e||null==f)return e!==f&&("number"==typeof a||"string"==typeof a)&&typeof a==typeof b?"horizontal"===c?b>a?"right":"left":b>a?"down":"up":"none";let g=e.getBoundingClientRect(),h=f.getBoundingClientRect();if("horizontal"===c){if(h.left<g.left)return"left";if(h.left>g.left)return"right"}else{if(h.top<g.top)return"up";if(h.top>g.top)return"down"}return"none"}var u=a.i(87828),v=a.i(557),w=a.i(21436);let x="data-composite-item-active";var y=a.i(16966);let z=f.createContext(void 0);function A(){let a=f.useContext(z);if(void 0===a)throw Error((0,l.default)(65));return a}var B=a.i(40014);let C=f.forwardRef(function(a,b){let{className:c,disabled:d=!1,render:e,value:g,id:i,nativeButton:k=!0,style:l,...m}=a,{value:o,getTabPanelIdByValue:s,orientation:t,tabActivationDirection:z}=n(),{activateOnFocus:C,highlightedTabIndex:D,onTabActivation:E,registerTabResizeObserverElement:F,setHighlightedTabIndex:G,tabsListElement:H}=A(),I=(0,v.useBaseUiId)(i),J=f.useMemo(()=>({disabled:d,id:I,value:g}),[d,I,g]),{compositeProps:K,compositeRef:L,index:M}=(0,y.useCompositeItem)({metadata:J}),N=g===o,O=f.useRef(!1),P=f.useRef(null);(0,h.useIsoLayoutEffect)(()=>{let a=P.current;if(a)return F(a)},[F]),(0,h.useIsoLayoutEffect)(()=>{if(O.current){O.current=!1;return}if(N&&M>-1&&D!==M){if(null!=H){let a=(0,B.activeElement)((0,u.ownerDocument)(H));if(a&&(0,B.contains)(H,a))return}d||G(M)}},[N,M,D,G,d,H]);let{getButtonProps:Q,buttonRef:R}=(0,w.useButton)({disabled:d,native:k,focusableWhenDisabled:!0}),S=s(g),T=f.useRef(!1),U=f.useRef(!1);return(0,j.useRenderElement)("button",a,{state:{disabled:d,active:N,orientation:t,tabActivationDirection:z},ref:[b,R,L,P],props:[K,{role:"tab","aria-controls":S,"aria-selected":N,id:I,onClick:function(a){N||d||E(g,(0,q.createChangeEventDetails)(r.REASONS.none,a.nativeEvent,void 0,{activationDirection:"none"}))},onFocus:function(a){N||(M>-1&&!d&&G(M),!d&&C&&(!T.current||T.current&&U.current)&&E(g,(0,q.createChangeEventDetails)(r.REASONS.none,a.nativeEvent,void 0,{activationDirection:"none"})))},onPointerDown:function(a){N||d||(T.current=!0,a.button&&0!==a.button||(U.current=!0,(0,u.ownerDocument)(a.currentTarget).addEventListener("pointerup",function(){T.current=!1,U.current=!1},{once:!0})))},[x]:N?"":void 0,onKeyDownCapture(){O.current=!0}},m,Q],stateAttributesMapping:p})});var D=a.i(44501),E=a.i(87610),F=a.i(24715);function G(){return F.NOOP}function H(){return!1}function I(){return!0}let J=((c={}).activeTabLeft="--active-tab-left",c.activeTabRight="--active-tab-right",c.activeTabTop="--active-tab-top",c.activeTabBottom="--active-tab-bottom",c.activeTabWidth="--active-tab-width",c.activeTabHeight="--active-tab-height",c);var K=a.i(75898);let L={...p,activeTabPosition:()=>null,activeTabSize:()=>null},M=f.forwardRef(function(a,b){let{className:c,render:d,renderBeforeHydration:g=!1,style:h,...i}=a,{nonce:k}=(0,K.useCSPContext)(),{getTabElementBySelectedValue:l,orientation:m,tabActivationDirection:o,value:p}=n(),{tabsListElement:q,registerIndicatorUpdateListener:r}=A(),s=(0,E.useSyncExternalStore)(G,H,I),t=function(){let[,a]=f.useState({});return f.useCallback(()=>{a({})},[])}();f.useEffect(()=>r(t),[r,t]);let u=0,v=0,w=0,x=0,y=0,z=0,B=!1;if(null!=p&&null!=q){let a=l(p);if(null!=a){B=!0;let{width:b,height:c}=(0,D.getCssDimensions)(a),{width:d,height:e}=(0,D.getCssDimensions)(q),f=a.getBoundingClientRect(),g=q.getBoundingClientRect(),h=d>0?g.width/d:1,i=e>0?g.height/e:1;if(Math.abs(h)>Number.EPSILON&&Math.abs(i)>Number.EPSILON){let a=f.left-g.left,b=f.top-g.top;u=a/h+q.scrollLeft-q.clientLeft,w=b/i+q.scrollTop-q.clientTop}else u=a.offsetLeft,w=a.offsetTop;y=b,z=c,v=q.scrollWidth-u-y,x=q.scrollHeight-w-z}}let C=B?{left:u,right:v,top:w,bottom:x}:null,F=B?{width:y,height:z}:null,M=B?{[J.activeTabLeft]:`${u}px`,[J.activeTabRight]:`${v}px`,[J.activeTabTop]:`${w}px`,[J.activeTabBottom]:`${x}px`,[J.activeTabWidth]:`${y}px`,[J.activeTabHeight]:`${z}px`}:void 0,N=B&&y>0&&z>0,O=(0,j.useRenderElement)("span",a,{state:{orientation:m,activeTabPosition:C,activeTabSize:F,tabActivationDirection:o},ref:b,props:[{role:"presentation",style:M,hidden:!N},i,{suppressHydrationWarning:!0}],stateAttributesMapping:L});return null==p?null:(0,e.jsxs)(f.Fragment,{children:[O,s&&g&&(0,e.jsx)("script",{nonce:k,dangerouslySetInnerHTML:{__html:'!function(){const t=document.currentScript.previousElementSibling;if(!t)return;const e=t.closest(\'[role="tablist"]\');if(!e)return;const i=e.querySelector("[data-active]");if(!i)return;if(0===i.offsetWidth||0===e.offsetWidth)return;let o=0,n=0,h=0,l=0,r=0,f=0;function s(t){const e=getComputedStyle(t);let i=parseFloat(e.width)||0,o=parseFloat(e.height)||0;return(Math.round(i)!==t.offsetWidth||Math.round(o)!==t.offsetHeight)&&(i=t.offsetWidth,o=t.offsetHeight),{width:i,height:o}}if(null!=i&&null!=e){const{width:t,height:c}=s(i),{width:u,height:d}=s(e),a=i.getBoundingClientRect(),g=e.getBoundingClientRect(),p=u>0?g.width/u:1,b=d>0?g.height/d:1;if(Math.abs(p)>Number.EPSILON&&Math.abs(b)>Number.EPSILON){const t=a.left-g.left,i=a.top-g.top;o=t/p+e.scrollLeft-e.clientLeft,h=i/b+e.scrollTop-e.clientTop}else o=i.offsetLeft,h=i.offsetTop;r=t,f=c,n=e.scrollWidth-o-r,l=e.scrollHeight-h-f}function c(e,i){t.style.setProperty(`--active-tab-${e}`,`${i}px`)}c("left",o),c("right",n),c("top",h),c("bottom",l),c("width",r),c("height",f),r>0&&f>0&&t.removeAttribute("hidden")}();'},suppressHydrationWarning:!0})]})});var N=a.i(54125),O=a.i(81735),P=a.i(5687),Q=a.i(48250),R=a.i(92403);let S=((d={}).index="data-index",d.activationDirection="data-activation-direction",d.orientation="data-orientation",d.hidden="data-hidden",d[d.startingStyle=O.TransitionStatusDataAttributes.startingStyle]="startingStyle",d[d.endingStyle=O.TransitionStatusDataAttributes.endingStyle]="endingStyle",d),T={...p,...O.transitionStatusMapping},U=f.forwardRef(function(a,b){let{className:c,value:d,render:e,keepMounted:g=!1,style:i,...k}=a,{value:l,getTabIdByPanelValue:m,orientation:o,tabActivationDirection:p,registerMountedTabPanel:q,unregisterMountedTabPanel:r}=n(),s=(0,v.useBaseUiId)(),t=f.useMemo(()=>({id:s,value:d}),[s,d]),{ref:u,index:w}=(0,R.useCompositeListItem)({metadata:t}),x=d===l,{mounted:y,transitionStatus:z,setMounted:A}=(0,Q.useTransitionStatus)(x),B=!y,C=m(d),D=f.useRef(null),E=(0,j.useRenderElement)("div",a,{state:{hidden:B,orientation:o,tabActivationDirection:p,transitionStatus:z},ref:[b,u,D],props:[{"aria-labelledby":C,hidden:B,id:s,role:"tabpanel",tabIndex:x?0:-1,inert:(0,N.inertValue)(!x),[S.index]:w},k],stateAttributesMapping:T});return((0,P.useOpenChangeComplete)({open:x,ref:D,onComplete(){x||A(!1)}}),(0,h.useIsoLayoutEffect)(()=>{if((!B||g)&&null!=s)return q(d,s),()=>{r(d,s)}},[B,g,d,s,q,r]),g||y)?E:null});var V=a.i(52466),W=a.i(1811),X=a.i(69649),Y=a.i(96e3);let Z=[];var $=a.i(59539),_=a.i(62903);function aa(a){let{render:b,className:c,style:d,refs:g=F.EMPTY_ARRAY,props:l=F.EMPTY_ARRAY,state:m=F.EMPTY_OBJECT,stateAttributesMapping:n,highlightedIndex:o,onHighlightedIndexChange:p,orientation:q,grid:r,loopFocus:s,onLoop:t,enableHomeAndEndKeys:u,onMapChange:v,stopEventPropagation:w=!0,rootRef:y,disabledIndices:z,modifierKeys:A,highlightItemOnHover:C=!1,tag:D="div",...E}=a,{props:G,highlightedIndex:H,onHighlightedIndexChange:I,elementsRef:J,onMapChange:K,relayKeyboardEvent:L}=function(a){let{loopFocus:b=!0,orientation:c="both",grid:d,onLoop:e,direction:g,highlightedIndex:j,onHighlightedIndexChange:k,rootRef:l,enableHomeAndEndKeys:m=!1,stopEventPropagation:n=!1,disabledIndices:o,modifierKeys:p=Z}=a,[q,r]=f.useState(0),s=null!=d,t=f.useRef(null),u=(0,W.useMergedRefs)(t,l),v=f.useRef([]),w=f.useRef(!1),y=j??q,z=(0,i.useStableCallback)((a,b=!1)=>{if((k??r)(a),b){let b=v.current[a];(0,X.scrollIntoViewIfNeeded)(t.current,b,g,c)}}),A=(0,i.useStableCallback)(a=>{if(0===a.size||w.current)return;w.current=!0;let b=Array.from(a.keys()),d=b.find(a=>a?.hasAttribute(x))??null,e=d?b.indexOf(d):-1;if(-1!==e)z(e);else if((0,Y.isListIndexDisabled)(b,y,o)){let a=(0,Y.findNonDisabledListIndex)(b,{disabledIndices:o});(0,Y.isIndexOutOfListBounds)(b,a)||z(a)}(0,X.scrollIntoViewIfNeeded)(t.current,d,g,c)});(0,h.useIsoLayoutEffect)(()=>{if(null==o||null!=j||!w.current)return;let a=v.current;if((0,Y.isListIndexDisabled)(a,y,o)){let b=(0,Y.findNonDisabledListIndex)(a,{disabledIndices:o});(0,Y.isIndexOutOfListBounds)(a,b)||z(b)}},[o,j,y,v,z]);let C=(0,i.useStableCallback)((a,b,c)=>e?e(a,b,c,v):c),D=(0,i.useStableCallback)(a=>{let f=m?X.COMPOSITE_KEYS:X.ARROW_KEYS;if(!f.has(a.key)||function(a,b){for(let c of X.MODIFIER_KEYS.values())if(!b.includes(c)&&a.getModifierState(c))return!0;return!1}(a,p)||!t.current)return;let h="rtl"===g,i=h?X.ARROW_LEFT:X.ARROW_RIGHT,j={horizontal:i,vertical:X.ARROW_DOWN,both:i}[c],k=h?X.ARROW_RIGHT:X.ARROW_LEFT,l={horizontal:k,vertical:X.ARROW_UP,both:k}[c],q=(0,B.getTarget)(a.nativeEvent);if(null!=q&&(0,X.isNativeInput)(q)&&!(0,V.isElementDisabled)(q)){let b=q.selectionStart,c=q.selectionEnd,d=q.value??"";if(null==b||a.shiftKey||b!==c||a.key!==l&&b<d.length||a.key!==j&&b>0)return}let r=y,u=(0,Y.getMinListIndex)(v,o),w=(0,Y.getMaxListIndex)(v,o);null!=d&&(r=d({disabledIndices:o,elementsRef:v,event:a,highlightedIndex:y,loopFocus:b,maxIndex:w,minIndex:u,onLoop:C,orientation:c,rtl:h}));let x={horizontal:[i],vertical:[X.ARROW_DOWN],both:[i,X.ARROW_DOWN]}[c],A={horizontal:[k],vertical:[X.ARROW_UP],both:[k,X.ARROW_UP]}[c],D=s?f:({horizontal:m?X.HORIZONTAL_KEYS_WITH_EXTRA_KEYS:X.HORIZONTAL_KEYS,vertical:m?X.VERTICAL_KEYS_WITH_EXTRA_KEYS:X.VERTICAL_KEYS,both:f})[c];m&&(a.key===X.HOME?r=u:a.key===X.END&&(r=w)),r===y&&(x.includes(a.key)||A.includes(a.key))&&(b&&r===w&&x.includes(a.key)?(r=u,e&&(r=e(a,y,r,v))):b&&r===u&&A.includes(a.key)?(r=w,e&&(r=e(a,y,r,v))):r=(0,Y.findNonDisabledListIndex)(v.current,{startingIndex:r,decrement:A.includes(a.key),disabledIndices:o})),r===y||(0,Y.isIndexOutOfListBounds)(v.current,r)||(n&&a.stopPropagation(),D.has(a.key)&&a.preventDefault(),z(r,!0),queueMicrotask(()=>{v.current[r]?.focus()}))});return{props:{ref:u,onFocus(a){let b=t.current,c=(0,B.getTarget)(a.nativeEvent);b&&null!=c&&(0,X.isNativeInput)(c)&&c.setSelectionRange(0,c.value.length??0)},onKeyDown:D},highlightedIndex:y,onHighlightedIndexChange:z,elementsRef:v,disabledIndices:o,onMapChange:A,relayKeyboardEvent:D}}({grid:r,loopFocus:s,onLoop:t,orientation:q,highlightedIndex:o,onHighlightedIndexChange:p,rootRef:y,stopEventPropagation:w,enableHomeAndEndKeys:u,direction:(0,_.useDirection)(),disabledIndices:z,modifierKeys:A}),M=(0,j.useRenderElement)(D,a,{state:m,ref:g,props:[G,...l,E],stateAttributesMapping:n}),N=f.useMemo(()=>({highlightedIndex:H,onHighlightedIndexChange:I,highlightItemOnHover:C,relayKeyboardEvent:L}),[H,I,C,L]);return(0,e.jsx)($.CompositeRootContext.Provider,{value:N,children:(0,e.jsx)(k.CompositeList,{elementsRef:J,onMapChange:a=>{v?.(a),K(a)},children:M})})}let ab=f.forwardRef(function(a,b){let{activateOnFocus:c=!1,className:d,loopFocus:g=!0,render:j,style:k,...l}=a,{onValueChange:m,orientation:o,value:q,setTabMap:r,tabActivationDirection:s}=n(),[t,u]=f.useState(0),[v,w]=f.useState(null),x=f.useRef(new Set),y=f.useRef(new Set),A=f.useRef(null);(0,h.useIsoLayoutEffect)(()=>{if("u"<typeof ResizeObserver)return;let a=new ResizeObserver(()=>{x.current.forEach(a=>{a()})});return A.current=a,v&&a.observe(v),y.current.forEach(b=>{a.observe(b)}),()=>{a.disconnect(),A.current=null}},[v]);let B=(0,i.useStableCallback)(a=>(x.current.add(a),()=>{x.current.delete(a)})),C=(0,i.useStableCallback)(a=>(y.current.add(a),A.current?.observe(a),()=>{y.current.delete(a),A.current?.unobserve(a)})),D=(0,i.useStableCallback)((a,b)=>{a!==q&&m(a,b)}),E=f.useMemo(()=>({activateOnFocus:c,highlightedTabIndex:t,registerIndicatorUpdateListener:B,registerTabResizeObserverElement:C,onTabActivation:D,setHighlightedTabIndex:u,tabsListElement:v}),[c,t,B,C,D,u,v]);return(0,e.jsx)(z.Provider,{value:E,children:(0,e.jsx)(aa,{render:j,className:d,style:k,state:{orientation:o,tabActivationDirection:s},refs:[b,w],props:[{"aria-orientation":"vertical"===o?"vertical":void 0,role:"tablist"},l],stateAttributesMapping:p,highlightedIndex:t,enableHomeAndEndKeys:!0,loopFocus:g,orientation:o,onHighlightedIndexChange:u,onMapChange:r,disabledIndices:F.EMPTY_ARRAY})})});a.s(["Indicator",0,M,"List",0,ab,"Panel",0,U,"Root",0,s,"Tab",0,C],58524);var ac=a.i(58524),ac=ac,ad=a.i(187),ae=a.i(68114);let af=(0,ad.cva)("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",{variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});a.s(["Tabs",0,function({className:a,orientation:b="horizontal",...c}){return(0,e.jsx)(ac.Root,{"data-slot":"tabs","data-orientation":b,className:(0,ae.cn)("group/tabs flex gap-2 data-horizontal:flex-col",a),...c})},"TabsContent",0,function({className:a,...b}){return(0,e.jsx)(ac.Panel,{"data-slot":"tabs-content",className:(0,ae.cn)("flex-1 text-sm outline-none",a),...b})},"TabsList",0,function({className:a,variant:b="default",...c}){return(0,e.jsx)(ac.List,{"data-slot":"tabs-list","data-variant":b,className:(0,ae.cn)(af({variant:b}),a),...c})},"TabsTrigger",0,function({className:a,...b}){return(0,e.jsx)(ac.Tab,{"data-slot":"tabs-trigger",className:(0,ae.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",a),...b})},"tabsListVariants",0,af],75083)}];
2
-
3
- //# sourceMappingURL=src_components_ui_0lq7ewx._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/ui/label.tsx","../../../../node_modules/%40base-ui/react/tabs/root/TabsRoot.mjs","../../../../node_modules/%40base-ui/react/tabs/root/TabsRootContext.mjs","../../../../node_modules/%40base-ui/react/tabs/root/TabsRootDataAttributes.mjs","../../../../node_modules/%40base-ui/react/tabs/root/stateAttributesMapping.mjs","../../../../node_modules/%40base-ui/react/tabs/tab/TabsTab.mjs","../../../../node_modules/%40base-ui/react/internals/composite/constants.mjs","../../../../node_modules/%40base-ui/react/tabs/list/TabsListContext.mjs","../../../../node_modules/%40base-ui/utils/useForcedRerendering.mjs","../../../../node_modules/%40base-ui/react/tabs/indicator/TabsIndicator.mjs","../../../../node_modules/%40base-ui/react/utils/useIsHydrating.mjs","../../../../node_modules/%40base-ui/react/tabs/indicator/prehydrationScript.min.mjs","../../../../node_modules/%40base-ui/react/tabs/indicator/TabsIndicatorCssVars.mjs","../../../../node_modules/%40base-ui/react/tabs/panel/TabsPanel.mjs","../../../../node_modules/%40base-ui/react/tabs/panel/TabsPanelDataAttributes.mjs","../../../../node_modules/%40base-ui/react/internals/composite/root/useCompositeRoot.mjs","../../../../node_modules/%40base-ui/react/internals/composite/root/CompositeRoot.mjs","../../../../node_modules/%40base-ui/react/tabs/list/TabsList.mjs","../../../../src/components/ui/tabs.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { CompositeList } from \"../../internals/composite/list/CompositeList.mjs\";\nimport { TabsRootContext } from \"./TabsRootContext.mjs\";\nimport { tabsStateAttributesMapping } from \"./stateAttributesMapping.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\n\n/**\n * Groups the tabs and the corresponding panels.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const TabsRoot = /*#__PURE__*/React.forwardRef(function TabsRoot(componentProps, forwardedRef) {\n const {\n className,\n defaultValue: defaultValueProp = 0,\n onValueChange: onValueChangeProp,\n orientation = 'horizontal',\n render,\n value: valueProp,\n style,\n ...elementProps\n } = componentProps;\n\n // Track whether the user explicitly provided a defined `defaultValue` prop.\n // Used to determine if we should honor a disabled tab selection.\n const hasExplicitDefaultValueProp = componentProps.defaultValue !== undefined;\n const tabPanelRefs = React.useRef([]);\n const [mountedTabPanels, setMountedTabPanels] = React.useState(() => new Map());\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValueProp,\n name: 'Tabs',\n state: 'value'\n });\n const isControlled = valueProp !== undefined;\n const [tabMap, setTabMap] = React.useState(() => new Map());\n const lastKnownTabElementRef = React.useRef(undefined);\n\n // Used for activation direction detection via tab element positions.\n const getTabElementBySelectedValue = React.useCallback(selectedValue => {\n if (selectedValue === undefined) {\n return null;\n }\n for (const [tabElement, tabMetadata] of tabMap.entries()) {\n if (tabMetadata != null && selectedValue === (tabMetadata.value ?? tabMetadata.index)) {\n return tabElement;\n }\n }\n return null;\n }, [tabMap]);\n const [activationDirectionState, setActivationDirectionState] = React.useState(() => ({\n previousValue: value,\n tabActivationDirection: 'none'\n }));\n const {\n previousValue,\n tabActivationDirection: committedTabActivationDirection\n } = activationDirectionState;\n let tabActivationDirection = committedTabActivationDirection;\n let directionComputationIncomplete = false;\n\n // Compute activation direction during render when value changes so children see\n // the correct direction on their very first render after the selection update.\n // The previous value snapshot is stored in state and synced after commit.\n // https://github.com/mui/base-ui/issues/3873\n if (previousValue !== value) {\n tabActivationDirection = computeActivationDirection(previousValue, value, orientation, tabMap);\n\n // When a new tab is added and selected in the same controlled update,\n // the tab element may not yet be registered in tabMap, so direction was\n // computed from a value-based fallback. Keep the previous value snapshot\n // stale so we re-compute from DOM positions once tabMap is up to date.\n directionComputationIncomplete = previousValue != null && value != null && getTabElementBySelectedValue(value) == null;\n }\n const nextPreviousValue = directionComputationIncomplete ? previousValue : value;\n const shouldSyncActivationDirectionState = previousValue !== nextPreviousValue || committedTabActivationDirection !== tabActivationDirection;\n useIsoLayoutEffect(() => {\n if (!shouldSyncActivationDirectionState) {\n return;\n }\n setActivationDirectionState({\n previousValue: nextPreviousValue,\n tabActivationDirection\n });\n }, [nextPreviousValue, shouldSyncActivationDirectionState, tabActivationDirection]);\n const onValueChange = useStableCallback((newValue, eventDetails) => {\n const activationDirection = computeActivationDirection(value, newValue, orientation, tabMap);\n eventDetails.activationDirection = activationDirection;\n onValueChangeProp?.(newValue, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n setValue(newValue);\n });\n const notifyAutomaticValueChange = useStableCallback((nextValue, reason) => {\n onValueChangeProp?.(nextValue, createChangeEventDetails(reason, undefined, undefined, {\n activationDirection: 'none'\n }));\n });\n const registerMountedTabPanel = useStableCallback((panelValue, panelId) => {\n setMountedTabPanels(prev => {\n if (prev.get(panelValue) === panelId) {\n return prev;\n }\n const next = new Map(prev);\n next.set(panelValue, panelId);\n return next;\n });\n });\n const unregisterMountedTabPanel = useStableCallback((panelValue, panelId) => {\n setMountedTabPanels(prev => {\n if (!prev.has(panelValue) || prev.get(panelValue) !== panelId) {\n return prev;\n }\n const next = new Map(prev);\n next.delete(panelValue);\n return next;\n });\n });\n\n // get the `id` attribute of <Tabs.Panel> to set as the value of `aria-controls` on <Tabs.Tab>\n const getTabPanelIdByValue = React.useCallback(tabValue => {\n return mountedTabPanels.get(tabValue);\n }, [mountedTabPanels]);\n\n // get the `id` attribute of <Tabs.Tab> to set as the value of `aria-labelledby` on <Tabs.Panel>\n const getTabIdByPanelValue = React.useCallback(tabPanelValue => {\n for (const tabMetadata of tabMap.values()) {\n if (tabPanelValue === tabMetadata?.value) {\n return tabMetadata?.id;\n }\n }\n return undefined;\n }, [tabMap]);\n const tabsContextValue = React.useMemo(() => ({\n getTabElementBySelectedValue,\n getTabIdByPanelValue,\n getTabPanelIdByValue,\n onValueChange,\n orientation,\n registerMountedTabPanel,\n setTabMap,\n unregisterMountedTabPanel,\n tabActivationDirection,\n value\n }), [getTabElementBySelectedValue, getTabIdByPanelValue, getTabPanelIdByValue, onValueChange, orientation, registerMountedTabPanel, setTabMap, unregisterMountedTabPanel, tabActivationDirection, value]);\n const selectedTabMetadata = React.useMemo(() => {\n for (const tabMetadata of tabMap.values()) {\n if (tabMetadata != null && tabMetadata.value === value) {\n return tabMetadata;\n }\n }\n return undefined;\n }, [tabMap, value]);\n\n // Find the first non-disabled tab value.\n // Used as a fallback when the current selection is disabled or missing.\n const firstEnabledTabValue = React.useMemo(() => {\n for (const tabMetadata of tabMap.values()) {\n if (tabMetadata != null && !tabMetadata.disabled) {\n return tabMetadata.value;\n }\n }\n return undefined;\n }, [tabMap]);\n\n // Implicit uncontrolled selections are still automatic changes, so notify\n // once when the tabs first register. Explicit defaults are treated as user-owned.\n const shouldNotifyInitialValueChangeRef = React.useRef(!hasExplicitDefaultValueProp);\n // useControlled warns if defaultValue changes after mount, but the\n // disabled-default honor policy below still needs a stable initial value.\n const initialDefaultValueRef = React.useRef(defaultValueProp);\n // An explicit defaultValue can intentionally point at a disabled tab on mount.\n // Once that selection becomes valid, later disabled states should fall back.\n const shouldHonorDisabledDefaultValueRef = React.useRef(hasExplicitDefaultValueProp);\n const didRegisterTabsRef = React.useRef(false);\n\n // Uncontrolled roots own automatic fallback. Controlled roots keep the exact\n // value supplied by the parent, even when that tab is disabled or missing.\n useIsoLayoutEffect(() => {\n if (isControlled) {\n return;\n }\n function commitAutomaticValueChange(fallbackValue, fallbackReason) {\n setValue(fallbackValue);\n // Automatic fallbacks are not directional transitions; reset the direction\n // alongside the value so the batched commit keeps both in sync.\n setActivationDirectionState(prev => {\n if (prev.previousValue === fallbackValue && prev.tabActivationDirection === 'none') {\n return prev;\n }\n return {\n previousValue: fallbackValue,\n tabActivationDirection: 'none'\n };\n });\n notifyAutomaticValueChange(fallbackValue, fallbackReason);\n // Mark the initial notification as delivered only after the consumer\n // callback returns. The fallback value is queued first so automatic\n // consistency updates are not cancelable through a throwing handler.\n shouldNotifyInitialValueChangeRef.current = false;\n }\n if (tabMap.size === 0) {\n // A Suspense boundary outside the root can clean up layout effects while\n // keeping the previous tabs connected. Don't treat that as removal.\n if (didRegisterTabsRef.current && value !== null && !lastKnownTabElementRef.current?.isConnected) {\n commitAutomaticValueChange(null, REASONS.missing);\n }\n return;\n }\n didRegisterTabsRef.current = true;\n lastKnownTabElementRef.current = tabMap.keys().next().value;\n const selectionIsDisabled = selectedTabMetadata?.disabled;\n const selectionIsMissing = selectedTabMetadata == null && value !== null;\n if (!selectionIsDisabled && value === initialDefaultValueRef.current) {\n shouldHonorDisabledDefaultValueRef.current = false;\n }\n if (shouldHonorDisabledDefaultValueRef.current && selectionIsDisabled && value === initialDefaultValueRef.current) {\n return;\n }\n const shouldNotifyInitialValueChange = shouldNotifyInitialValueChangeRef.current;\n if (selectionIsDisabled || selectionIsMissing) {\n const fallbackValue = firstEnabledTabValue ?? null;\n if (value === fallbackValue) {\n // Already at the fallback value; no commit or notification needed,\n // but record that the implicit-initial transition has resolved.\n shouldNotifyInitialValueChangeRef.current = false;\n return;\n }\n let fallbackReason = REASONS.missing;\n if (shouldNotifyInitialValueChange) {\n fallbackReason = REASONS.initial;\n } else if (selectionIsDisabled) {\n fallbackReason = REASONS.disabled;\n }\n commitAutomaticValueChange(fallbackValue, fallbackReason);\n return;\n }\n if (shouldNotifyInitialValueChange && selectedTabMetadata != null) {\n notifyAutomaticValueChange(value, REASONS.initial);\n shouldNotifyInitialValueChangeRef.current = false;\n }\n }, [firstEnabledTabValue, isControlled, notifyAutomaticValueChange, selectedTabMetadata, setValue, tabMap, value]);\n const state = {\n orientation,\n tabActivationDirection\n };\n const element = useRenderElement('div', componentProps, {\n state,\n ref: forwardedRef,\n props: elementProps,\n stateAttributesMapping: tabsStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(TabsRootContext.Provider, {\n value: tabsContextValue,\n children: /*#__PURE__*/_jsx(CompositeList, {\n elementsRef: tabPanelRefs,\n children: element\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") TabsRoot.displayName = \"TabsRoot\";\nfunction computeActivationDirection(oldValue, newValue, orientation, tabMap) {\n if (oldValue == null || newValue == null) {\n return 'none';\n }\n let oldTab = null;\n let newTab = null;\n for (const [tabElement, tabMetadata] of tabMap.entries()) {\n if (tabMetadata == null) {\n continue;\n }\n const tabValue = tabMetadata.value ?? tabMetadata.index;\n if (oldValue === tabValue) {\n oldTab = tabElement;\n }\n if (newValue === tabValue) {\n newTab = tabElement;\n }\n if (oldTab != null && newTab != null) {\n break;\n }\n }\n if (oldTab == null || newTab == null) {\n // Fallback for dynamic tabs: when a tab element isn't registered yet\n // (e.g. added and selected in the same update), infer direction from\n // the values themselves. Works for comparable types (numbers, strings).\n if (oldTab !== newTab && (typeof oldValue === 'number' || typeof oldValue === 'string') && typeof oldValue === typeof newValue) {\n if (orientation === 'horizontal') {\n return newValue > oldValue ? 'right' : 'left';\n }\n return newValue > oldValue ? 'down' : 'up';\n }\n return 'none';\n }\n const oldRect = oldTab.getBoundingClientRect();\n const newRect = newTab.getBoundingClientRect();\n if (orientation === 'horizontal') {\n if (newRect.left < oldRect.left) {\n return 'left';\n }\n if (newRect.left > oldRect.left) {\n return 'right';\n }\n } else {\n if (newRect.top < oldRect.top) {\n return 'up';\n }\n if (newRect.top > oldRect.top) {\n return 'down';\n }\n }\n return 'none';\n}","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\n/**\n * @internal\n */\nexport const TabsRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") TabsRootContext.displayName = \"TabsRootContext\";\nexport function useTabsRootContext() {\n const context = React.useContext(TabsRootContext);\n if (context === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: TabsRootContext is missing. Tabs parts must be placed within <Tabs.Root>.' : _formatErrorMessage(64));\n }\n return context;\n}","export let TabsRootDataAttributes = /*#__PURE__*/function (TabsRootDataAttributes) {\n /**\n * Indicates the direction of the activation (based on the previous active tab).\n * @type {'left' | 'right' | 'up' | 'down' | 'none'}\n */\n TabsRootDataAttributes[\"activationDirection\"] = \"data-activation-direction\";\n /**\n * Indicates the orientation of the tabs.\n * @type {'horizontal' | 'vertical'}\n */\n TabsRootDataAttributes[\"orientation\"] = \"data-orientation\";\n return TabsRootDataAttributes;\n}({});","import { TabsRootDataAttributes } from \"./TabsRootDataAttributes.mjs\";\nexport const tabsStateAttributesMapping = {\n tabActivationDirection: dir => ({\n [TabsRootDataAttributes.activationDirection]: dir\n })\n};","'use client';\n\nimport * as React from 'react';\nimport { ownerDocument } from '@base-ui/utils/owner';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { ACTIVE_COMPOSITE_ITEM } from \"../../internals/composite/constants.mjs\";\nimport { useCompositeItem } from \"../../internals/composite/item/useCompositeItem.mjs\";\nimport { useTabsRootContext } from \"../root/TabsRootContext.mjs\";\nimport { tabsStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useTabsListContext } from \"../list/TabsListContext.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { activeElement, contains } from \"../../floating-ui-react/utils.mjs\";\n\n/**\n * An individual interactive tab button that toggles the corresponding panel.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)\n */\nexport const TabsTab = /*#__PURE__*/React.forwardRef(function TabsTab(componentProps, forwardedRef) {\n const {\n className,\n disabled = false,\n render,\n value,\n id: idProp,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n value: activeTabValue,\n getTabPanelIdByValue,\n orientation,\n tabActivationDirection\n } = useTabsRootContext();\n const {\n activateOnFocus,\n highlightedTabIndex,\n onTabActivation,\n registerTabResizeObserverElement,\n setHighlightedTabIndex,\n tabsListElement\n } = useTabsListContext();\n const id = useBaseUiId(idProp);\n const tabMetadata = React.useMemo(() => ({\n disabled,\n id,\n value\n }), [disabled, id, value]);\n const {\n compositeProps,\n compositeRef,\n index\n // hook is used instead of the CompositeItem component\n // because the index is needed for Tab internals\n } = useCompositeItem({\n metadata: tabMetadata\n });\n const active = value === activeTabValue;\n const isNavigatingRef = React.useRef(false);\n const tabElementRef = React.useRef(null);\n useIsoLayoutEffect(() => {\n const tabElement = tabElementRef.current;\n if (!tabElement) {\n return undefined;\n }\n return registerTabResizeObserverElement(tabElement);\n }, [registerTabResizeObserverElement]);\n\n // Keep the highlighted item in sync with the currently active tab\n // when the value prop changes externally (controlled mode)\n useIsoLayoutEffect(() => {\n if (isNavigatingRef.current) {\n isNavigatingRef.current = false;\n return;\n }\n if (!(active && index > -1 && highlightedTabIndex !== index)) {\n return;\n }\n\n // If focus is currently within the tabs list, don't override the roving\n // focus highlight. This keeps keyboard navigation relative to the focused\n // item after an external/asynchronous selection change.\n const listElement = tabsListElement;\n if (listElement != null) {\n const activeEl = activeElement(ownerDocument(listElement));\n if (activeEl && contains(listElement, activeEl)) {\n return;\n }\n }\n\n // Don't highlight disabled tabs to prevent them from interfering with keyboard navigation.\n // Keyboard focus (tabIndex) should remain on an enabled tab even when a disabled tab is selected.\n if (!disabled) {\n setHighlightedTabIndex(index);\n }\n }, [active, index, highlightedTabIndex, setHighlightedTabIndex, disabled, tabsListElement]);\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton,\n focusableWhenDisabled: true\n });\n const tabPanelId = getTabPanelIdByValue(value);\n const isPressingRef = React.useRef(false);\n const isMainButtonRef = React.useRef(false);\n function onClick(event) {\n if (active || disabled) {\n return;\n }\n onTabActivation(value, createChangeEventDetails(REASONS.none, event.nativeEvent, undefined, {\n activationDirection: 'none'\n }));\n }\n function onFocus(event) {\n if (active) {\n return;\n }\n\n // Only highlight enabled tabs when focused (disabled tabs remain focusable via focusableWhenDisabled).\n if (index > -1 && !disabled) {\n setHighlightedTabIndex(index);\n }\n if (disabled) {\n return;\n }\n if (activateOnFocus && (!isPressingRef.current ||\n // keyboard or touch focus\n isPressingRef.current && isMainButtonRef.current) // mouse focus\n ) {\n onTabActivation(value, createChangeEventDetails(REASONS.none, event.nativeEvent, undefined, {\n activationDirection: 'none'\n }));\n }\n }\n function onPointerDown(event) {\n if (active || disabled) {\n return;\n }\n isPressingRef.current = true;\n function handlePointerUp() {\n isPressingRef.current = false;\n isMainButtonRef.current = false;\n }\n if (!event.button || event.button === 0) {\n isMainButtonRef.current = true;\n const doc = ownerDocument(event.currentTarget);\n doc.addEventListener('pointerup', handlePointerUp, {\n once: true\n });\n }\n }\n const state = {\n disabled,\n active,\n orientation,\n tabActivationDirection\n };\n const element = useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef, compositeRef, tabElementRef],\n props: [compositeProps, {\n role: 'tab',\n 'aria-controls': tabPanelId,\n 'aria-selected': active,\n id,\n onClick,\n onFocus,\n onPointerDown,\n [ACTIVE_COMPOSITE_ITEM]: active ? '' : undefined,\n onKeyDownCapture() {\n isNavigatingRef.current = true;\n }\n }, elementProps, getButtonProps],\n stateAttributesMapping: tabsStateAttributesMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") TabsTab.displayName = \"TabsTab\";","export const ACTIVE_COMPOSITE_ITEM = 'data-composite-item-active';","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const TabsListContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") TabsListContext.displayName = \"TabsListContext\";\nexport function useTabsListContext() {\n const context = React.useContext(TabsListContext);\n if (context === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: TabsListContext is missing. TabsList parts must be placed within <Tabs.List>.' : _formatErrorMessage(65));\n }\n return context;\n}","'use client';\n\nimport * as React from 'react';\n\n/**\n * Returns a function that forces a rerender.\n */\nexport function useForcedRerendering() {\n const [, setState] = React.useState({});\n return React.useCallback(() => {\n setState({});\n }, []);\n}","'use client';\n\nimport * as React from 'react';\nimport { useForcedRerendering } from '@base-ui/utils/useForcedRerendering';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { getCssDimensions } from \"../../utils/getCssDimensions.mjs\";\nimport { useIsHydrating } from \"../../utils/useIsHydrating.mjs\";\nimport { useTabsRootContext } from \"../root/TabsRootContext.mjs\";\nimport { tabsStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useTabsListContext } from \"../list/TabsListContext.mjs\";\nimport { script as prehydrationScript } from \"./prehydrationScript.min.mjs\";\nimport { TabsIndicatorCssVars } from \"./TabsIndicatorCssVars.mjs\";\nimport { useCSPContext } from \"../../internals/csp-context/CSPContext.mjs\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nconst stateAttributesMapping = {\n ...tabsStateAttributesMapping,\n activeTabPosition: () => null,\n activeTabSize: () => null\n};\n\n/**\n * A visual indicator that can be styled to match the position of the currently active tab.\n * Renders a `<span>` element.\n *\n * Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)\n */\nexport const TabsIndicator = /*#__PURE__*/React.forwardRef(function TabsIndicator(componentProps, forwardedRef) {\n const {\n className,\n render,\n renderBeforeHydration = false,\n style: styleProp,\n ...elementProps\n } = componentProps;\n const {\n nonce\n } = useCSPContext();\n const {\n getTabElementBySelectedValue,\n orientation,\n tabActivationDirection,\n value\n } = useTabsRootContext();\n const {\n tabsListElement,\n registerIndicatorUpdateListener\n } = useTabsListContext();\n const isHydrating = useIsHydrating();\n const rerender = useForcedRerendering();\n React.useEffect(() => {\n return registerIndicatorUpdateListener(rerender);\n }, [registerIndicatorUpdateListener, rerender]);\n let left = 0;\n let right = 0;\n let top = 0;\n let bottom = 0;\n let width = 0;\n let height = 0;\n let isTabSelected = false;\n if (value != null && tabsListElement != null) {\n const activeTab = getTabElementBySelectedValue(value);\n if (activeTab != null) {\n isTabSelected = true;\n const {\n width: computedWidth,\n height: computedHeight\n } = getCssDimensions(activeTab);\n const {\n width: tabListWidth,\n height: tabListHeight\n } = getCssDimensions(tabsListElement);\n const tabRect = activeTab.getBoundingClientRect();\n const tabsListRect = tabsListElement.getBoundingClientRect();\n const scaleX = tabListWidth > 0 ? tabsListRect.width / tabListWidth : 1;\n const scaleY = tabListHeight > 0 ? tabsListRect.height / tabListHeight : 1;\n const hasNonZeroScale = Math.abs(scaleX) > Number.EPSILON && Math.abs(scaleY) > Number.EPSILON;\n if (hasNonZeroScale) {\n const tabLeftDelta = tabRect.left - tabsListRect.left;\n const tabTopDelta = tabRect.top - tabsListRect.top;\n left = tabLeftDelta / scaleX + tabsListElement.scrollLeft - tabsListElement.clientLeft;\n top = tabTopDelta / scaleY + tabsListElement.scrollTop - tabsListElement.clientTop;\n } else {\n left = activeTab.offsetLeft;\n top = activeTab.offsetTop;\n }\n width = computedWidth;\n height = computedHeight;\n right = tabsListElement.scrollWidth - left - width;\n bottom = tabsListElement.scrollHeight - top - height;\n }\n }\n const activeTabPosition = isTabSelected ? {\n left,\n right,\n top,\n bottom\n } : null;\n const activeTabSize = isTabSelected ? {\n width,\n height\n } : null;\n const style = isTabSelected ? {\n [TabsIndicatorCssVars.activeTabLeft]: `${left}px`,\n [TabsIndicatorCssVars.activeTabRight]: `${right}px`,\n [TabsIndicatorCssVars.activeTabTop]: `${top}px`,\n [TabsIndicatorCssVars.activeTabBottom]: `${bottom}px`,\n [TabsIndicatorCssVars.activeTabWidth]: `${width}px`,\n [TabsIndicatorCssVars.activeTabHeight]: `${height}px`\n } : undefined;\n const displayIndicator = isTabSelected && width > 0 && height > 0;\n const state = {\n orientation,\n activeTabPosition,\n activeTabSize,\n tabActivationDirection\n };\n const element = useRenderElement('span', componentProps, {\n state,\n ref: forwardedRef,\n props: [{\n role: 'presentation',\n style,\n hidden: !displayIndicator // do not display the indicator before the layout is settled\n }, elementProps, {\n suppressHydrationWarning: true\n }],\n stateAttributesMapping\n });\n if (value == null) {\n return null;\n }\n return /*#__PURE__*/_jsxs(React.Fragment, {\n children: [element, isHydrating && renderBeforeHydration && /*#__PURE__*/_jsx(\"script\", {\n nonce: nonce\n // eslint-disable-next-line react/no-danger\n ,\n dangerouslySetInnerHTML: {\n __html: prehydrationScript\n },\n suppressHydrationWarning: true\n })]\n });\n});\nif (process.env.NODE_ENV !== \"production\") TabsIndicator.displayName = \"TabsIndicator\";","import { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { NOOP } from \"../internals/noop.mjs\";\nfunction subscribe() {\n return NOOP;\n}\nfunction getSnapshot() {\n return false;\n}\nfunction getServerSnapshot() {\n return true;\n}\n\n/**\n * Returns `true` while React is hydrating server-rendered markup and `false`\n * for fresh client-only mounts.\n */\nexport function useIsHydrating() {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}","// This file is autogenerated. Do not edit it directly.\n// To update it, modify the corresponding source file and run `pnpm inline-scripts`.\n\n// prettier-ignore\nexport const script = '!function(){const t=document.currentScript.previousElementSibling;if(!t)return;const e=t.closest(\\'[role=\"tablist\"]\\');if(!e)return;const i=e.querySelector(\"[data-active]\");if(!i)return;if(0===i.offsetWidth||0===e.offsetWidth)return;let o=0,n=0,h=0,l=0,r=0,f=0;function s(t){const e=getComputedStyle(t);let i=parseFloat(e.width)||0,o=parseFloat(e.height)||0;return(Math.round(i)!==t.offsetWidth||Math.round(o)!==t.offsetHeight)&&(i=t.offsetWidth,o=t.offsetHeight),{width:i,height:o}}if(null!=i&&null!=e){const{width:t,height:c}=s(i),{width:u,height:d}=s(e),a=i.getBoundingClientRect(),g=e.getBoundingClientRect(),p=u>0?g.width/u:1,b=d>0?g.height/d:1;if(Math.abs(p)>Number.EPSILON&&Math.abs(b)>Number.EPSILON){const t=a.left-g.left,i=a.top-g.top;o=t/p+e.scrollLeft-e.clientLeft,h=i/b+e.scrollTop-e.clientTop}else o=i.offsetLeft,h=i.offsetTop;r=t,f=c,n=e.scrollWidth-o-r,l=e.scrollHeight-h-f}function c(e,i){t.style.setProperty(`--active-tab-${e}`,`${i}px`)}c(\"left\",o),c(\"right\",n),c(\"top\",h),c(\"bottom\",l),c(\"width\",r),c(\"height\",f),r>0&&f>0&&t.removeAttribute(\"hidden\")}();';","export let TabsIndicatorCssVars = /*#__PURE__*/function (TabsIndicatorCssVars) {\n /**\n * Indicates the distance on the left side from the parent's container if the tab is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabLeft\"] = \"--active-tab-left\";\n /**\n * Indicates the distance on the right side from the parent's container if the tab is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabRight\"] = \"--active-tab-right\";\n /**\n * Indicates the distance on the top side from the parent's container if the tab is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabTop\"] = \"--active-tab-top\";\n /**\n * Indicates the distance on the bottom side from the parent's container if the tab is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabBottom\"] = \"--active-tab-bottom\";\n /**\n * Indicates the width of the tab if it is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabWidth\"] = \"--active-tab-width\";\n /**\n * Indicates the height of the tab if it is active.\n * @type {number}\n */\n TabsIndicatorCssVars[\"activeTabHeight\"] = \"--active-tab-height\";\n return TabsIndicatorCssVars;\n}({});","'use client';\n\nimport * as React from 'react';\nimport { inertValue } from '@base-ui/utils/inertValue';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCompositeListItem } from \"../../internals/composite/list/useCompositeListItem.mjs\";\nimport { tabsStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useTabsRootContext } from \"../root/TabsRootContext.mjs\";\nimport { TabsPanelDataAttributes } from \"./TabsPanelDataAttributes.mjs\";\nconst stateAttributesMapping = {\n ...tabsStateAttributesMapping,\n ...transitionStatusMapping\n};\n\n/**\n * A panel displayed when the corresponding tab is active.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)\n */\nexport const TabsPanel = /*#__PURE__*/React.forwardRef(function TabsPanel(componentProps, forwardedRef) {\n const {\n className,\n value,\n render,\n keepMounted = false,\n style,\n ...elementProps\n } = componentProps;\n const {\n value: selectedValue,\n getTabIdByPanelValue,\n orientation,\n tabActivationDirection,\n registerMountedTabPanel,\n unregisterMountedTabPanel\n } = useTabsRootContext();\n const id = useBaseUiId();\n const metadata = React.useMemo(() => ({\n id,\n value\n }), [id, value]);\n const {\n ref: listItemRef,\n index\n } = useCompositeListItem({\n metadata\n });\n const open = value === selectedValue;\n const {\n mounted,\n transitionStatus,\n setMounted\n } = useTransitionStatus(open);\n const hidden = !mounted;\n const correspondingTabId = getTabIdByPanelValue(value);\n const state = {\n hidden,\n orientation,\n tabActivationDirection,\n transitionStatus\n };\n const panelRef = React.useRef(null);\n const element = useRenderElement('div', componentProps, {\n state,\n ref: [forwardedRef, listItemRef, panelRef],\n props: [{\n 'aria-labelledby': correspondingTabId,\n hidden,\n id,\n role: 'tabpanel',\n tabIndex: open ? 0 : -1,\n inert: inertValue(!open),\n [TabsPanelDataAttributes.index]: index\n }, elementProps],\n stateAttributesMapping\n });\n useOpenChangeComplete({\n open,\n ref: panelRef,\n onComplete() {\n if (!open) {\n setMounted(false);\n }\n }\n });\n useIsoLayoutEffect(() => {\n if (hidden && !keepMounted) {\n return undefined;\n }\n if (id == null) {\n return undefined;\n }\n registerMountedTabPanel(value, id);\n return () => {\n unregisterMountedTabPanel(value, id);\n };\n }, [hidden, keepMounted, value, id, registerMountedTabPanel, unregisterMountedTabPanel]);\n const shouldRender = keepMounted || mounted;\n if (!shouldRender) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") TabsPanel.displayName = \"TabsPanel\";","import { TransitionStatusDataAttributes } from \"../../internals/stateAttributesMapping.mjs\";\nexport let TabsPanelDataAttributes = function (TabsPanelDataAttributes) {\n /**\n * Indicates the index of the tab panel.\n */\n TabsPanelDataAttributes[\"index\"] = \"data-index\";\n /**\n * Indicates the direction of the activation (based on the previous active tab).\n * @type {'left' | 'right' | 'up' | 'down' | 'none'}\n */\n TabsPanelDataAttributes[\"activationDirection\"] = \"data-activation-direction\";\n /**\n * Indicates the orientation of the tabs.\n * @type {'horizontal' | 'vertical'}\n */\n TabsPanelDataAttributes[\"orientation\"] = \"data-orientation\";\n /**\n * Present when the panel is hidden.\n */\n TabsPanelDataAttributes[\"hidden\"] = \"data-hidden\";\n /**\n * Present when the panel is animating in.\n */\n TabsPanelDataAttributes[TabsPanelDataAttributes[\"startingStyle\"] = TransitionStatusDataAttributes.startingStyle] = \"startingStyle\";\n /**\n * Present when the panel is animating out.\n */\n TabsPanelDataAttributes[TabsPanelDataAttributes[\"endingStyle\"] = TransitionStatusDataAttributes.endingStyle] = \"endingStyle\";\n return TabsPanelDataAttributes;\n}({});","'use client';\n\nimport * as React from 'react';\nimport { isElementDisabled } from '@base-ui/utils/isElementDisabled';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { COMPOSITE_KEYS, ARROW_DOWN, ARROW_KEYS, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, END, HOME, HORIZONTAL_KEYS, HORIZONTAL_KEYS_WITH_EXTRA_KEYS, MODIFIER_KEYS, VERTICAL_KEYS, VERTICAL_KEYS_WITH_EXTRA_KEYS, findNonDisabledListIndex, getMaxListIndex, getMinListIndex, isListIndexDisabled, isIndexOutOfListBounds, isNativeInput, scrollIntoViewIfNeeded } from \"../composite.mjs\";\nimport { ACTIVE_COMPOSITE_ITEM } from \"../constants.mjs\";\nimport { getTarget } from \"../../../floating-ui-react/utils.mjs\";\nconst EMPTY_ARRAY = [];\nexport function useCompositeRoot(params) {\n const {\n loopFocus = true,\n orientation = 'both',\n grid,\n onLoop,\n direction,\n highlightedIndex: externalHighlightedIndex,\n onHighlightedIndexChange: externalSetHighlightedIndex,\n rootRef: externalRef,\n enableHomeAndEndKeys = false,\n stopEventPropagation = false,\n disabledIndices,\n modifierKeys = EMPTY_ARRAY\n } = params;\n const [internalHighlightedIndex, internalSetHighlightedIndex] = React.useState(0);\n const isGrid = grid != null;\n const rootRef = React.useRef(null);\n const mergedRef = useMergedRefs(rootRef, externalRef);\n const elementsRef = React.useRef([]);\n const hasSetDefaultIndexRef = React.useRef(false);\n const highlightedIndex = externalHighlightedIndex ?? internalHighlightedIndex;\n const onHighlightedIndexChange = useStableCallback((index, shouldScrollIntoView = false) => {\n (externalSetHighlightedIndex ?? internalSetHighlightedIndex)(index);\n if (shouldScrollIntoView) {\n const newActiveItem = elementsRef.current[index];\n scrollIntoViewIfNeeded(rootRef.current, newActiveItem, direction, orientation);\n }\n });\n const onMapChange = useStableCallback(map => {\n if (map.size === 0 || hasSetDefaultIndexRef.current) {\n return;\n }\n hasSetDefaultIndexRef.current = true;\n const sortedElements = Array.from(map.keys());\n const activeItem = sortedElements.find(compositeElement => compositeElement?.hasAttribute(ACTIVE_COMPOSITE_ITEM)) ?? null;\n // Set the default highlighted index of an arbitrary composite item.\n const activeIndex = activeItem ? sortedElements.indexOf(activeItem) : -1;\n if (activeIndex !== -1) {\n onHighlightedIndexChange(activeIndex);\n } else if (isListIndexDisabled(sortedElements, highlightedIndex, disabledIndices)) {\n // The default highlighted item is disabled, so it should not hold the single\n // roving tab stop: a natively disabled element is removed from the tab order,\n // and an aria-disabled one should not be the entry point. Move the tab stop\n // to the first enabled item. If every item is disabled, keep the current\n // highlighted index.\n const firstEnabledIndex = findNonDisabledListIndex(sortedElements, {\n disabledIndices\n });\n if (!isIndexOutOfListBounds(sortedElements, firstEnabledIndex)) {\n onHighlightedIndexChange(firstEnabledIndex);\n }\n }\n scrollIntoViewIfNeeded(rootRef.current, activeItem, direction, orientation);\n });\n useIsoLayoutEffect(() => {\n // `disabledIndices` can resolve a render after the initial map population\n // (e.g. Toolbar derives it from item metadata through a state update), so the\n // default tab stop at index 0 may now point at a disabled item, leaving the\n // composite without a reachable tab stop. Re-validate and move it to the first\n // enabled item. Gated on `disabledIndices` being provided so composites that\n // rely on the DOM disabled fallback keep their existing behavior.\n if (disabledIndices == null || externalHighlightedIndex != null || !hasSetDefaultIndexRef.current) {\n return;\n }\n const elements = elementsRef.current;\n if (isListIndexDisabled(elements, highlightedIndex, disabledIndices)) {\n const firstEnabledIndex = findNonDisabledListIndex(elements, {\n disabledIndices\n });\n if (!isIndexOutOfListBounds(elements, firstEnabledIndex)) {\n onHighlightedIndexChange(firstEnabledIndex);\n }\n }\n }, [disabledIndices, externalHighlightedIndex, highlightedIndex, elementsRef, onHighlightedIndexChange]);\n const wrappedOnLoop = useStableCallback((event, prevIndex, nextIndex) => {\n if (!onLoop) {\n return nextIndex;\n }\n return onLoop(event, prevIndex, nextIndex, elementsRef);\n });\n\n // Stable so that `relayKeyboardEvent` does not invalidate identity-sensitive\n // consumers (the `CompositeRootContext` value and trigger data forwarding).\n const onKeyDown = useStableCallback(event => {\n const RELEVANT_KEYS = enableHomeAndEndKeys ? COMPOSITE_KEYS : ARROW_KEYS;\n if (!RELEVANT_KEYS.has(event.key)) {\n return;\n }\n if (isModifierKeySet(event, modifierKeys)) {\n return;\n }\n const element = rootRef.current;\n if (!element) {\n return;\n }\n const isRtl = direction === 'rtl';\n const horizontalForwardKey = isRtl ? ARROW_LEFT : ARROW_RIGHT;\n const forwardKey = {\n horizontal: horizontalForwardKey,\n vertical: ARROW_DOWN,\n both: horizontalForwardKey\n }[orientation];\n const horizontalBackwardKey = isRtl ? ARROW_RIGHT : ARROW_LEFT;\n const backwardKey = {\n horizontal: horizontalBackwardKey,\n vertical: ARROW_UP,\n both: horizontalBackwardKey\n }[orientation];\n const target = getTarget(event.nativeEvent);\n if (target != null && isNativeInput(target) && !isElementDisabled(target)) {\n const selectionStart = target.selectionStart;\n const selectionEnd = target.selectionEnd;\n const textContent = target.value ?? '';\n // return to native textbox behavior when\n // 1 - Shift is held to make a text selection, or if there already is a text selection\n if (selectionStart == null || event.shiftKey || selectionStart !== selectionEnd) {\n return;\n }\n // 2 - arrow-ing forward and not in the last position of the text\n if (event.key !== backwardKey && selectionStart < textContent.length) {\n return;\n }\n // 3 -arrow-ing backward and not in the first position of the text\n if (event.key !== forwardKey && selectionStart > 0) {\n return;\n }\n }\n let nextIndex = highlightedIndex;\n const minIndex = getMinListIndex(elementsRef, disabledIndices);\n const maxIndex = getMaxListIndex(elementsRef, disabledIndices);\n if (grid != null) {\n nextIndex = grid({\n disabledIndices,\n elementsRef,\n event,\n highlightedIndex,\n loopFocus,\n maxIndex,\n minIndex,\n onLoop: wrappedOnLoop,\n orientation,\n rtl: isRtl\n });\n }\n const forwardKeys = {\n horizontal: [horizontalForwardKey],\n vertical: [ARROW_DOWN],\n both: [horizontalForwardKey, ARROW_DOWN]\n }[orientation];\n const backwardKeys = {\n horizontal: [horizontalBackwardKey],\n vertical: [ARROW_UP],\n both: [horizontalBackwardKey, ARROW_UP]\n }[orientation];\n const preventedKeys = isGrid ? RELEVANT_KEYS : {\n horizontal: enableHomeAndEndKeys ? HORIZONTAL_KEYS_WITH_EXTRA_KEYS : HORIZONTAL_KEYS,\n vertical: enableHomeAndEndKeys ? VERTICAL_KEYS_WITH_EXTRA_KEYS : VERTICAL_KEYS,\n both: RELEVANT_KEYS\n }[orientation];\n if (enableHomeAndEndKeys) {\n if (event.key === HOME) {\n nextIndex = minIndex;\n } else if (event.key === END) {\n nextIndex = maxIndex;\n }\n }\n if (nextIndex === highlightedIndex && (forwardKeys.includes(event.key) || backwardKeys.includes(event.key))) {\n if (loopFocus && nextIndex === maxIndex && forwardKeys.includes(event.key)) {\n nextIndex = minIndex;\n if (onLoop) {\n nextIndex = onLoop(event, highlightedIndex, nextIndex, elementsRef);\n }\n } else if (loopFocus && nextIndex === minIndex && backwardKeys.includes(event.key)) {\n nextIndex = maxIndex;\n if (onLoop) {\n nextIndex = onLoop(event, highlightedIndex, nextIndex, elementsRef);\n }\n } else {\n nextIndex = findNonDisabledListIndex(elementsRef.current, {\n startingIndex: nextIndex,\n decrement: backwardKeys.includes(event.key),\n disabledIndices\n });\n }\n }\n if (nextIndex !== highlightedIndex && !isIndexOutOfListBounds(elementsRef.current, nextIndex)) {\n if (stopEventPropagation) {\n event.stopPropagation();\n }\n if (preventedKeys.has(event.key)) {\n event.preventDefault();\n }\n onHighlightedIndexChange(nextIndex, true);\n\n // Wait for FocusManager `returnFocus` to execute.\n queueMicrotask(() => {\n elementsRef.current[nextIndex]?.focus();\n });\n }\n });\n const props = {\n ref: mergedRef,\n onFocus(event) {\n const element = rootRef.current;\n const target = getTarget(event.nativeEvent);\n if (!element || target == null || !isNativeInput(target)) {\n return;\n }\n target.setSelectionRange(0, target.value.length ?? 0);\n },\n onKeyDown\n };\n return {\n props,\n highlightedIndex,\n onHighlightedIndexChange,\n elementsRef,\n disabledIndices,\n onMapChange,\n relayKeyboardEvent: onKeyDown\n };\n}\nfunction isModifierKeySet(event, ignoredModifierKeys) {\n for (const key of MODIFIER_KEYS.values()) {\n if (ignoredModifierKeys.includes(key)) {\n continue;\n }\n if (event.getModifierState(key)) {\n return true;\n }\n }\n return false;\n}","'use client';\n\nimport * as React from 'react';\nimport { EMPTY_ARRAY, EMPTY_OBJECT } from '@base-ui/utils/empty';\nimport { CompositeList } from \"../list/CompositeList.mjs\";\nimport { useCompositeRoot } from \"./useCompositeRoot.mjs\";\nimport { CompositeRootContext } from \"./CompositeRootContext.mjs\";\nimport { useRenderElement } from \"../../useRenderElement.mjs\";\nimport { useDirection } from \"../../direction-context/DirectionContext.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n/**\n * @internal\n */\nexport function CompositeRoot(componentProps) {\n const {\n render,\n className,\n style,\n refs = EMPTY_ARRAY,\n props = EMPTY_ARRAY,\n state = EMPTY_OBJECT,\n stateAttributesMapping,\n highlightedIndex: highlightedIndexProp,\n onHighlightedIndexChange: onHighlightedIndexChangeProp,\n orientation,\n grid,\n loopFocus,\n onLoop,\n enableHomeAndEndKeys,\n onMapChange: onMapChangeProp,\n stopEventPropagation = true,\n rootRef,\n disabledIndices,\n modifierKeys,\n highlightItemOnHover = false,\n tag = 'div',\n ...elementProps\n } = componentProps;\n const direction = useDirection();\n const {\n props: defaultProps,\n highlightedIndex,\n onHighlightedIndexChange,\n elementsRef,\n onMapChange: onMapChangeUnwrapped,\n relayKeyboardEvent\n } = useCompositeRoot({\n grid,\n loopFocus,\n onLoop,\n orientation,\n highlightedIndex: highlightedIndexProp,\n onHighlightedIndexChange: onHighlightedIndexChangeProp,\n rootRef,\n stopEventPropagation,\n enableHomeAndEndKeys,\n direction,\n disabledIndices,\n modifierKeys\n });\n const element = useRenderElement(tag, componentProps, {\n state,\n ref: refs,\n props: [defaultProps, ...props, elementProps],\n stateAttributesMapping\n });\n const contextValue = React.useMemo(() => ({\n highlightedIndex,\n onHighlightedIndexChange,\n highlightItemOnHover,\n relayKeyboardEvent\n }), [highlightedIndex, onHighlightedIndexChange, highlightItemOnHover, relayKeyboardEvent]);\n return /*#__PURE__*/_jsx(CompositeRootContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/_jsx(CompositeList, {\n elementsRef: elementsRef,\n onMapChange: newMap => {\n onMapChangeProp?.(newMap);\n onMapChangeUnwrapped(newMap);\n },\n children: element\n })\n });\n}","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { EMPTY_ARRAY } from '@base-ui/utils/empty';\nimport { CompositeRoot } from \"../../internals/composite/root/CompositeRoot.mjs\";\nimport { tabsStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useTabsRootContext } from \"../root/TabsRootContext.mjs\";\nimport { TabsListContext } from \"./TabsListContext.mjs\";\n\n/**\n * Groups the individual tab buttons.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Tabs](https://base-ui.com/react/components/tabs)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const TabsList = /*#__PURE__*/React.forwardRef(function TabsList(componentProps, forwardedRef) {\n const {\n activateOnFocus = false,\n className,\n loopFocus = true,\n render,\n style,\n ...elementProps\n } = componentProps;\n const {\n onValueChange,\n orientation,\n value,\n setTabMap,\n tabActivationDirection\n } = useTabsRootContext();\n const [highlightedTabIndex, setHighlightedTabIndex] = React.useState(0);\n const [tabsListElement, setTabsListElement] = React.useState(null);\n const indicatorUpdateListenersRef = React.useRef(new Set());\n const tabResizeObserverElementsRef = React.useRef(new Set());\n const resizeObserverRef = React.useRef(null);\n useIsoLayoutEffect(() => {\n if (typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n const resizeObserver = new ResizeObserver(() => {\n indicatorUpdateListenersRef.current.forEach(listener => {\n listener();\n });\n });\n resizeObserverRef.current = resizeObserver;\n if (tabsListElement) {\n resizeObserver.observe(tabsListElement);\n }\n tabResizeObserverElementsRef.current.forEach(element => {\n resizeObserver.observe(element);\n });\n return () => {\n resizeObserver.disconnect();\n resizeObserverRef.current = null;\n };\n }, [tabsListElement]);\n const registerIndicatorUpdateListener = useStableCallback(listener => {\n indicatorUpdateListenersRef.current.add(listener);\n return () => {\n indicatorUpdateListenersRef.current.delete(listener);\n };\n });\n const registerTabResizeObserverElement = useStableCallback(element => {\n tabResizeObserverElementsRef.current.add(element);\n resizeObserverRef.current?.observe(element);\n return () => {\n tabResizeObserverElementsRef.current.delete(element);\n resizeObserverRef.current?.unobserve(element);\n };\n });\n const onTabActivation = useStableCallback((newValue, eventDetails) => {\n if (newValue !== value) {\n onValueChange(newValue, eventDetails);\n }\n });\n const state = {\n orientation,\n tabActivationDirection\n };\n const defaultProps = {\n 'aria-orientation': orientation === 'vertical' ? 'vertical' : undefined,\n role: 'tablist'\n };\n const tabsListContextValue = React.useMemo(() => ({\n activateOnFocus,\n highlightedTabIndex,\n registerIndicatorUpdateListener,\n registerTabResizeObserverElement,\n onTabActivation,\n setHighlightedTabIndex,\n tabsListElement\n }), [activateOnFocus, highlightedTabIndex, registerIndicatorUpdateListener, registerTabResizeObserverElement, onTabActivation, setHighlightedTabIndex, tabsListElement]);\n return /*#__PURE__*/_jsx(TabsListContext.Provider, {\n value: tabsListContextValue,\n children: /*#__PURE__*/_jsx(CompositeRoot, {\n render: render,\n className: className,\n style: style,\n state: state,\n refs: [forwardedRef, setTabsListElement],\n props: [defaultProps, elementProps],\n stateAttributesMapping: tabsStateAttributesMapping,\n highlightedIndex: highlightedTabIndex,\n enableHomeAndEndKeys: true,\n loopFocus: loopFocus,\n orientation: orientation,\n onHighlightedIndexChange: setHighlightedTabIndex,\n onMapChange: setTabMap,\n disabledIndices: EMPTY_ARRAY\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") TabsList.displayName = \"TabsList\";","\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n"],"names":["Label","className","props"],"mappings":"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","ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]}
@@ -1,11 +0,0 @@
1
- self.__BUILD_MANIFEST = {
2
- "__rewrites": {
3
- "afterFiles": [],
4
- "beforeFiles": [],
5
- "fallback": []
6
- },
7
- "sortedPages": [
8
- "/_app",
9
- "/_error"
10
- ]
11
- };self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
@@ -1 +0,0 @@
1
- self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},18967,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={DecodeError:function(){return P},MiddlewareNotFoundError:function(){return O},MissingStaticPage:function(){return h},NormalizeError:function(){return E},PageNotFoundError:function(){return b},SP:function(){return m},ST:function(){return y},WEB_VITALS:function(){return i},execOnce:function(){return u},getDisplayName:function(){return l},getLocationOrigin:function(){return c},getURL:function(){return f},isAbsoluteUrl:function(){return a},isResSent:function(){return d},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return N}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function u(e){let r,t=!1;return(...n)=>(t||(t=!0,r=e(...n)),r)}let s=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,a=e=>s.test(e);function c(){let{protocol:e,hostname:r,port:t}=window.location;return`${e}//${r}${t?":"+t:""}`}function f(){let{href:e}=window.location,r=c();return e.substring(r.length)}function l(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function d(e){return e.finished||e.headersSent}function p(e){let r=e.split("?");return r[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(r[1]?`?${r.slice(1).join("?")}`:"")}async function g(e,r){let t=r.res||r.ctx&&r.ctx.res;if(!e.getInitialProps)return r.ctx&&r.Component?{pageProps:await g(r.Component,r.ctx)}:{};let n=await e.getInitialProps(r);if(t&&d(t))return n;if(!n)throw Object.defineProperty(Error(`"${l(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let m="u">typeof performance,y=m&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class P extends Error{}class E extends Error{}class b extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class h extends Error{constructor(e,r){super(),this.message=`Failed to load static file for page: ${e} ${r}`}}class O extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function N(e){return JSON.stringify({message:e.message,stack:e.stack})}},98183,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={assign:function(){return a},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return s}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});function i(e){let r={};for(let[t,n]of e.entries()){let e=r[t];void 0===e?r[t]=n:Array.isArray(e)?e.push(n):r[t]=[e,n]}return r}function u(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function s(e){let r=new URLSearchParams;for(let[t,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)r.append(t,u(e));else r.set(t,u(n));return r}function a(e,...r){for(let t of r){for(let r of t.keys())e.delete(r);for(let[r,n]of t.entries())e.append(r,n)}return e}}]);