From 8c53014714f3973af58c1f279ebf204ad22d6e89 Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Sun, 23 Nov 2025 16:41:14 +0800 Subject: [PATCH] 0.0.6.0 --- .next/dev/build-manifest.json | 27 +- .next/dev/fallback-build-manifest.json | 27 +- .next/dev/logs/next-development.log | 4132 +---------------- .next/dev/prerender-manifest.json | 6 +- .next/dev/server/app-paths-manifest.json | 15 +- ...s_go-new_chinese-family-tree_735c6a78._.js | 222 +- ...-new_chinese-family-tree_735c6a78._.js.map | 4 +- ...s_go-new_chinese-family-tree_ae245aad._.js | 312 +- ...-new_chinese-family-tree_ae245aad._.js.map | 4 +- .../ssr/[root-of-the-server]__a5d92604._.js | 2 +- .../[root-of-the-server]__a5d92604._.js.map | 2 +- .../ssr/[root-of-the-server]__b37c7274._.js | 6 +- .../[root-of-the-server]__b37c7274._.js.map | 2 +- .next/dev/server/middleware-build-manifest.js | 27 +- .next/dev/server/next-font-manifest.js | 2 +- .next/dev/server/next-font-manifest.json | 36 - .next/dev/server/pages-manifest.json | 6 +- ...s_go-new_chinese-family-tree_65759bc9._.js | 2 +- ...-new_chinese-family-tree_65759bc9._.js.map | 2 +- ...tree_app_globals_css_bad6b30c._.single.css | 286 +- ..._app_globals_css_bad6b30c._.single.css.map | 2 +- ...s_go-new_chinese-family-tree_c5040fe9._.js | 228 +- ...-new_chinese-family-tree_c5040fe9._.js.map | 4 +- ...s_go-new_chinese-family-tree_c77f613d._.js | 312 +- ...-new_chinese-family-tree_c77f613d._.js.map | 4 +- .../[root-of-the-server]__6d150df4._.css | 286 +- .../[root-of-the-server]__6d150df4._.css.map | 2 +- .../dev/static/development/_buildManifest.js | 3 - .next/dev/trace | 18 + README.md | 2 +- app/layout.tsx | 6 +- app/members/page.tsx | 52 +- app/page.tsx | 52 +- components/site-header.tsx | 2 +- 34 files changed, 780 insertions(+), 5315 deletions(-) diff --git a/.next/dev/build-manifest.json b/.next/dev/build-manifest.json index 307b311b..449755ae 100644 --- a/.next/dev/build-manifest.json +++ b/.next/dev/build-manifest.json @@ -1,31 +1,6 @@ { "pages": { - "/_app": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_973712af._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_1a0ae50c._.js", - "static/chunks/4e98a_next_app_020fddc2.js", - "static/chunks/[next]_entry_page-loader_ts_97d2bbab._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__dda05d7f._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__app_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__app_424607fa._.js" - ], - "/_error": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_1a19caea._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_c302a28c._.js", - "static/chunks/4e98a_next_error_53e529e4.js", - "static/chunks/[next]_entry_page-loader_ts_faadefb0._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__d6f1a546._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__error_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__error_4e6cc585._.js" - ] + "/_app": [] }, "devFiles": [], "polyfillFiles": [ diff --git a/.next/dev/fallback-build-manifest.json b/.next/dev/fallback-build-manifest.json index a1f738c4..11c117c6 100644 --- a/.next/dev/fallback-build-manifest.json +++ b/.next/dev/fallback-build-manifest.json @@ -1,31 +1,6 @@ { "pages": { - "/_app": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_973712af._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_1a0ae50c._.js", - "static/chunks/4e98a_next_app_020fddc2.js", - "static/chunks/[next]_entry_page-loader_ts_97d2bbab._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__dda05d7f._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__app_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__app_424607fa._.js" - ], - "/_error": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_1a19caea._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_c302a28c._.js", - "static/chunks/4e98a_next_error_53e529e4.js", - "static/chunks/[next]_entry_page-loader_ts_faadefb0._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__d6f1a546._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__error_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__error_4e6cc585._.js" - ] + "/_app": [] }, "devFiles": [], "polyfillFiles": [], diff --git a/.next/dev/logs/next-development.log b/.next/dev/logs/next-development.log index 0398384b..daddcdcd 100644 --- a/.next/dev/logs/next-development.log +++ b/.next/dev/logs/next-development.log @@ -1,4094 +1,38 @@ -[00:00:00.984] Server LOG ✓ Ready in 662ms -[00:00:06.629] Server LOG ○ Compiling /tree ... -[00:00:09.927] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:00:10.099] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:00:10.099] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:00:10.100] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868252618} -[00:00:11.441] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:00:12.054] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:00:12.926] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:00:15.250] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:01:33.692] Server LOG ✓ Compiled in 70ms -[00:03:29.078] Server LOG ✓ Compiled in 64ms -[00:03:39.729] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:03:53.735] Server LOG ✓ Compiled in 88ms -[00:04:34.301] Server LOG ✓ Compiled in 58ms -[00:04:56.089] Server LOG ✓ Compiled in 55ms -[00:04:56.168] Browser ERROR The final argument passed to %s changed size between renders. The order and size of this array must remain constant. - -Previous: %s -Incoming: %s useEffect [[object Object], cmialsibs0005mwsq43k4szij, (id)=>router.push(`/members/${id}`)] [[object Object], cmialsibs0005mwsq43k4szij, (id)=>router.push(`/members/${id}`), [object Map]] -[00:05:09.548] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:05:09.682] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:05:09.691] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:05:09.718] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:05:09.718] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:05:09.718] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868552230} -[00:05:09.729] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:06:33.660] Server LOG ✓ Compiled in 57ms -[00:07:16.646] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:07:16.825] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:07:16.918] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:07:16.949] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:07:16.986] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:07:16.986] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:07:16.986] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868679448} -[00:07:16.992] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:07:17.002] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:08:30.127] Server LOG ✓ Compiled in 55ms -[00:08:40.238] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:08:53.647] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:09:18.182] Server LOG ✓ Compiled in 51ms -[00:09:52.236] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:09:53.848] Server LOG ✓ Compiled in 68ms -[00:09:55.622] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:09:55.737] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:09:55.751] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:09:55.788] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:09:55.788] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:09:55.788] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868838247} -[00:09:55.801] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:09:55.818] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:11:00.016] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:11:00.355] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:11:00.495] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:11:00.495] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:11:00.495] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868902983} -[00:11:00.496] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:11:00.504] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:11:00.543] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:11:42.119] Server LOG ✓ Compiled in 53ms -[00:11:52.274] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:11:52.395] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:11:52.401] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:11:52.426] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:11:52.426] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:11:52.426] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868954915} -[00:11:52.435] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:12:00.502] Server LOG ✓ Compiled in 54ms -[00:12:05.614] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:12:05.731] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:12:05.737] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:12:05.749] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:12:05.749] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:12:05.749] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868968240} -[00:12:05.782] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:12:26.960] Server LOG ✓ Compiled in 52ms -[00:12:34.199] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:12:34.346] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:12:34.346] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:12:34.346] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763868996839} -[00:12:34.348] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:12:34.357] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:12:34.388] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:12:53.410] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:12:53.507] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:12:53.528] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:12:53.561] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:12:53.561] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:12:53.561] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869016038} -[00:12:53.570] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:12:53.578] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:13:25.754] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:13:42.730] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:14:23.577] Server LOG ✓ Compiled in 52ms -[00:14:28.860] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:14:28.982] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:14:28.988] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:14:28.998] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:14:28.998] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:14:28.998] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869111491} -[00:14:29.024] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:15:57.760] Server LOG ✓ Compiled in 50ms -[00:16:01.887] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:05.604] Server LOG ○ Compiling / ... -[00:16:06.046] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869208539} -[00:16:06.305] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:06.329] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:12.749] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:12.769] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:12.828] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869215313} -[00:16:15.270] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869217760} -[00:16:15.480] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:15.495] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:25.829] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/timeline?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/timeline","o":"http://localhost:3000/timeline?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869228261} -[00:16:25.829] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:25.829] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:25.829] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:25.999] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:26.021] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:26.122] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:26.122] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:26.122] Browser LOG 迁徙数据: {"lines":[{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[121.48,31.22]],"fromName":"济南","toName":"上海"},{"coords":[[117.12,36.65],[114.07,22.62]],"fromName":"济南","toName":"深圳"},{"coords":[[117.12,36.65],[120.19,30.26]],"fromName":"济南","toName":"杭州"},{"coords":[[117.12,36.65],[104.06,30.67]],"fromName":"济南","toName":"成都"},{"coords":[[117.12,36.65],[120.62,31.32]],"fromName":"济南","toName":"苏州"},{"coords":[[117.12,36.65],[108.95,34.27]],"fromName":"济南","toName":"西安"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"},{"coords":[[117.12,36.65],[117.12,36.65]],"fromName":"济南","toName":"济南"}],"migrations":[{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"to":"山东省济南市历下区","year":1945},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"参加过抗日战争,新中国成立后在政府部门工作。","birthDate":"1910-01-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsics000jmwsqor0s7zo5","cmialside000nmwsqca5r0uer"],"courtesyName":null,"createdAt":"2025-11-22T18:09:15.986Z","deathDate":"1985-06-15","email":null,"fatherId":"cmialsibs0005mwsq43k4szij","fullName":"王建国","gender":"MALE","generation":2,"generationName":"建","givenName":"建国","id":"cmialsic20009mwsqvt4atneq","isLunarDate":false,"motherId":"cmialsibv0007mwsq4wp2snri","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsic4000bmwsqvbnwl254"],"spouseMotherName":null,"surname":"王","tags":["抗战老兵","公务员"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.051Z"},"from":"山东省济南市历城区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"to":"山东省济南市历下区","year":1950},{"father":{"address":"山东省济南市历下区解放路123号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,从事机械制造行业。","birthDate":"1945-04-18","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsie4000xmwsqks6c6leq","cmialsie90011mwsqjjemjwvo"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.012Z","deathDate":null,"email":"wangming@example.com","fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王明","gender":"MALE","generation":3,"generationName":"明","givenName":"明","id":"cmialsics000jmwsqor0s7zo5","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsicx000lmwsqn3pf9oxl"],"spouseMotherName":null,"surname":"王","tags":["工程师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.078Z"},"from":"山东省济南市历下区","person":{"address":"上海市浦东新区陆家嘴环路1000号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"金融分析师,在投资银行工作。","birthDate":"1978-03-22","birthPlace":"上海市浦东新区","burialPlace":null,"childrenIds":["cmialsif5001hmwsq73qlvevi"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.065Z","deathDate":null,"email":"wanglei@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王磊","gender":"MALE","generation":4,"generationName":"浩","givenName":"磊","id":"cmialsie90011mwsqjjemjwvo","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["金融","在世","上海"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.107Z"},"to":"上海市浦东新区","year":1978},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在中学任教。","birthDate":"1950-09-12","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsieb0013mwsqm5gvz7nb"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.034Z","deathDate":null,"email":null,"fatherId":"cmialsic20009mwsqvt4atneq","fullName":"王亮","gender":"MALE","generation":3,"generationName":"明","givenName":"亮","id":"cmialside000nmwsqca5r0uer","isLunarDate":false,"motherId":"cmialsic4000bmwsqvbnwl254","phone":"13800138003","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.082Z"},"from":"山东省济南市历下区","person":{"address":"广东省深圳市南山区科技园","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"创业者,经营科技公司。","birthDate":"1980-11-08","birthPlace":"广东省深圳市","burialPlace":null,"childrenIds":["cmialsif8001jmwsqd0l63xdr"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.067Z","deathDate":null,"email":"wangchao@example.com","fatherId":"cmialside000nmwsqca5r0uer","fullName":"王超","gender":"MALE","generation":4,"generationName":"浩","givenName":"超","id":"cmialsieb0013mwsqm5gvz7nb","isLunarDate":false,"motherId":null,"phone":"13900139004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["创业者","在世","深圳"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.109Z"},"to":"广东省深圳市","year":1980},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"浙江省杭州市西湖区文三路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,在浙江大学附属医院工作。","birthDate":"1982-05-15","birthPlace":"浙江省杭州市","burialPlace":null,"childrenIds":["cmialsifa001lmwsqnn36n2vw"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.070Z","deathDate":null,"email":"wangpeng@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王鹏","gender":"MALE","generation":4,"generationName":"浩","givenName":"鹏","id":"cmialsied0015mwsq5ra0dvh0","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139005","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["医生","在世","杭州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.111Z"},"to":"浙江省杭州市","year":1982},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"医生,继承父业。","birthDate":"1952-02-28","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsied0015mwsq5ra0dvh0","cmialsieg0017mwsq722tdoi2"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.037Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王强","gender":"MALE","generation":3,"generationName":"明","givenName":"强","id":"cmialsidh000pmwsqf4yxde7e","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138004","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsidl000rmwsqs7g5i5bn"],"spouseMotherName":null,"surname":"王","tags":["医生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.083Z"},"from":"山东省济南市历城区","person":{"address":"四川省成都市武侯区天府大道","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"教师,在大学任教。","birthDate":"1984-08-20","birthPlace":"四川省成都市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.073Z","deathDate":null,"email":"wangting@example.com","fatherId":"cmialsidh000pmwsqf4yxde7e","fullName":"王婷","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"婷","id":"cmialsieg0017mwsq722tdoi2","isLunarDate":false,"motherId":"cmialsidl000rmwsqs7g5i5bn","phone":"13900139006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["教师","在世","成都"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.073Z"},"to":"四川省成都市","year":1984},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1954-07-20","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiej0019mwsqlg217o0y"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.046Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王丽","gender":"FEMALE","generation":3,"generationName":"明","givenName":"丽","id":"cmialsidq000tmwsqgqrhn4yy","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138006","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.086Z"},"from":"山东省济南市历城区","person":{"address":"江苏省苏州市工业园区","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"护士,在医院工作。","birthDate":"1986-02-14","birthPlace":"江苏省苏州市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.075Z","deathDate":null,"email":"wangna@example.com","fatherId":"cmialsidq000tmwsqgqrhn4yy","fullName":"王娜","gender":"FEMALE","generation":4,"generationName":"浩","givenName":"娜","id":"cmialsiej0019mwsqlg217o0y","isLunarDate":false,"motherId":null,"phone":"13900139007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["护士","在世","苏州"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.075Z"},"to":"江苏省苏州市","year":1986},{"father":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"军人,服役20年后转业。","birthDate":"1956-12-08","birthPlace":"山东省济南市历城区","burialPlace":null,"childrenIds":["cmialsiek001bmwsq09fmj4pa"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.049Z","deathDate":null,"email":null,"fatherId":"cmialsicb000dmwsqg5eqkaxs","fullName":"王军","gender":"MALE","generation":3,"generationName":"明","givenName":"军","id":"cmialsidt000vmwsq3qajvszo","isLunarDate":false,"motherId":"cmialsice000fmwsqk6b8c4o9","phone":"13800138007","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["军人","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.088Z"},"from":"山东省济南市历城区","person":{"address":"陕西省西安市雁塔区高新路","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"工程师,在航天企业工作。","birthDate":"1988-07-30","birthPlace":"陕西省西安市","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.077Z","deathDate":null,"email":"wangtao@example.com","fatherId":"cmialsidt000vmwsq3qajvszo","fullName":"王涛","gender":"MALE","generation":4,"generationName":"浩","givenName":"涛","id":"cmialsiek001bmwsq09fmj4pa","isLunarDate":false,"motherId":null,"phone":"13900139008","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["工程师","在世","西安"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.077Z"},"to":"陕西省西安市","year":1988},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读大学生,就读于计算机科学专业。","birthDate":"2005-03-20","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.092Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王子轩","gender":"MALE","generation":5,"generationName":"子","givenName":"子轩","id":"cmialsif0001dmwsqgl23oojn","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.092Z"},"to":"山东省济南市高新区","year":2005},{"father":{"address":"山东省济南市高新区科技路456号","ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"软件工程师,在互联网公司工作。","birthDate":"1975-06-10","birthPlace":"山东省济南市历下区","burialPlace":null,"childrenIds":["cmialsif0001dmwsqgl23oojn","cmialsif2001fmwsqgomgevuk"],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.060Z","deathDate":null,"email":"wanghao@example.com","fatherId":"cmialsics000jmwsqor0s7zo5","fullName":"王浩","gender":"MALE","generation":4,"generationName":"浩","givenName":"浩","id":"cmialsie4000xmwsqks6c6leq","isLunarDate":false,"motherId":"cmialsicx000lmwsqn3pf9oxl","phone":"13900139001","photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":["cmialsie5000zmwsqdixp49to"],"spouseMotherName":null,"surname":"王","tags":["程序员","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.103Z"},"from":"山东省济南市历下区","person":{"address":null,"ancestralHome":"山东省济南市","artName":null,"avatarImageId":null,"avatarUrl":null,"bio":"在读高中生。","birthDate":"2008-07-15","birthPlace":"山东省济南市高新区","burialPlace":null,"childrenIds":[],"courtesyName":null,"createdAt":"2025-11-22T18:09:16.095Z","deathDate":null,"email":null,"fatherId":"cmialsie4000xmwsqks6c6leq","fullName":"王梓涵","gender":"FEMALE","generation":5,"generationName":"子","givenName":"梓涵","id":"cmialsif2001fmwsqgomgevuk","isLunarDate":false,"motherId":"cmialsie5000zmwsqdixp49to","phone":null,"photoIds":[],"posthumousName":null,"rank":null,"spouseFatherName":null,"spouseIds":[],"spouseMotherName":null,"surname":"王","tags":["学生","在世"],"telephone":null,"treeId":"cmialsibp0003mwsqddts8mnq","updatedAt":"2025-11-22T18:09:16.095Z"},"to":"山东省济南市高新区","year":2008}]} -[00:16:28.826] Browser WARN {} -[00:16:35.003] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:35.031] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:16:35.117] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869237583} -[00:17:26.370] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:41.965] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:17:42.133] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:17:42.133] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:17:42.133] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869304631} -[00:17:45.782] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:45.938] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:17:46.042] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:46.086] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:17:46.086] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:17:46.086] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869308562} -[00:17:46.157] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:17:46.303] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:46.400] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:48.193] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:49.623] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:50.502] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869312992} -[00:17:50.730] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:50.746] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:17:54.045] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:18:02.494] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:18:02.601] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:18:02.635] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:18:02.638] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:18:02.638] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:18:02.638] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869325123} -[00:18:02.660] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:18:02.666] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:18:02.815] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:18:43.646] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:18:43.761] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:18:43.763] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:18:43.810] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:18:43.954] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:18:45.123] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:18:45.123] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:18:45.123] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869367622} -[00:19:14.730] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:19:15.035] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:15.048] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:19:15.048] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:19:15.048] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869397448} -[00:19:15.053] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:15.106] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:19:18.745] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:19:18.904] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:19:18.904] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:19:18.904] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869401404} -[00:19:22.464] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:22.620] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:19:22.712] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:22.753] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:19:22.754] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:19:22.754] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869405251} -[00:19:22.770] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:19:22.914] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:22.933] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:25.610] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:26.043] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869408540} -[00:19:26.274] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:26.292] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:19:37.118] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:19:37.260] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:19:37.260] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:19:37.260] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869419759} -[00:20:04.900] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:05.097] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:20:05.220] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:05.260] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:20:05.261] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:20:05.261] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869447746} -[00:20:05.286] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:20:05.419] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:05.445] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:07.308] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:08.489] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869450987} -[00:20:08.726] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:08.745] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:14.811] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:20:43.046] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[00:20:43.246] Server LOG ✓ Compiled in 55ms -[00:20:43.939] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:20:44.241] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:20:44.241] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:20:44.241] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869486710} -[00:20:44.246] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:20:44.279] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:20:44.357] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:20:44.538] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:21:27.428] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:21:27.694] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:21:27.710] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:21:27.710] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:21:27.710] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869530163} -[00:21:27.719] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:21:27.792] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:21:28.002] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:23:19.413] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[00:23:19.585] Server LOG ✓ Compiled in 51ms -[00:23:20.328] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:23:20.765] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:23:20.765] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:23:20.765] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869643230} -[00:23:20.801] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:23:20.811] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:23:20.888] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:23:21.163] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:24:18.754] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:24:19.351] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:19.371] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:19.501] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:24:19.631] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:24:19.631] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:24:19.631] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869702087} -[00:24:26.595] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869709060} -[00:24:26.811] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:26.824] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:49.896] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:49.969] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:24:49.976] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsig90025mwsq0536dvgi color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsig90025mwsq0536dvgi","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869732436} -[00:24:50.188] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:24:50.206] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:25:09.979] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:25:09.994] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:25:10.073] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869752536} -[00:25:11.921] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869754359} -[00:25:12.130] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:25:12.244] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:25:31.807] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:27:09.470] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[00:27:09.643] Server LOG ✓ Compiled in 57ms -[00:27:10.483] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:27:10.860] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:27:10.860] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:27:10.860] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869873326} -[00:27:10.910] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:27:10.914] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:27:10.985] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:27:11.170] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:27:34.142] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[00:27:34.322] Server LOG ✓ Compiled in 56ms -[00:27:35.223] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:27:35.488] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:27:35.490] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:27:35.490] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:27:35.490] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763869897913} -[00:27:35.519] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:27:35.579] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:27:35.837] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:37:00.447] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:37:00.652] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:37:00.652] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:37:00.652] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870463084} -[00:37:00.781] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:00.790] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:37:00.855] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:37:01.037] Browser ERROR uncaughtError: Error: missing: cmialsig90025mwsq0536dvgi -[00:37:11.250] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:37:11.489] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:37:11.489] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:37:11.489] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870473928} -[00:37:11.508] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:11.517] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:37:11.666] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:37:14.902] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:14.954] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:37:14.991] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsig90025mwsq0536dvgi color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsig90025mwsq0536dvgi","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870477429} -[00:37:15.257] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:15.271] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:18.028] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:18.146] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870480551} -[00:37:18.159] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:37:18.485] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:18.499] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:20.489] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:20.505] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:20.646] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870483024} -[00:37:23.446] Browser ERROR uncaughtError: Error: missing: cmialsigu002jmwsq79bv66nn -[00:37:55.949] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:37:56.170] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:37:56.170] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[00:37:56.170] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870518601} -[00:37:56.235] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:37:56.267] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[00:37:56.310] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:38:13.296] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:13.350] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:38:13.390] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsifp001rmwsq5s2xsxhr color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsifp001rmwsq5s2xsxhr","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870535822} -[00:38:13.610] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:13.624] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:19.064] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:19.078] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:19.188] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsifl001nmwsqbi8bbu43","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870541599} -[00:38:22.896] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:38:23.113] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:38:23.114] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:38:23.114] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870545559} -[00:38:25.924] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:26.581] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:38:27.020] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:27.039] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:27.130] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:38:27.523] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:38:27.523] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:38:27.523] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870549967} -[00:38:29.425] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:30.349] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870552783} -[00:38:30.576] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:30.594] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:33.713] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:33.796] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:38:33.809] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsibv0007mwsq4wp2snri color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsibv0007mwsq4wp2snri","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870556240} -[00:38:34.025] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:34.041] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:38.246] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:38.264] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:38.362] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870560779} -[00:38:39.723] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmialsibp0003mwsqddts8mnq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870562159} -[00:38:39.983] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:38:39.999] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:24.372] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:24.502] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:24.537] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:24.583] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:24.642] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsicj000hmwsq40mk9gzx color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsicj000hmwsq40mk9gzx","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870967019} -[00:45:27.888] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:45:28.185] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:28.203] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:28.294] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:45:28.294] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members/cmialsicj000hmwsq40mk9gzx","route":"/members/[id]"} -[00:45:28.294] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmialsicj000hmwsq40mk9gzx color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmialsicj000hmwsq40mk9gzx","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870970744} -[00:45:31.706] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:31.779] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870974229} -[00:45:32.047] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:32.059] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:39.163] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:45:39.364] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:45:39.364] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} -[00:45:39.364] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870981807} -[00:45:39.370] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:39.387] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:41.845] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:45:42.034] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:45:42.034] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} -[00:45:42.034] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870984481} -[00:45:42.101] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:42.119] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:48.713] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:45:48.920] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:45:48.920] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} -[00:45:48.920] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870991370} -[00:45:49.101] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:49.121] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:50.818] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:50.886] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870993333} -[00:45:51.179] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:51.202] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:53.319] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:45:57.045] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:45:57.268] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:45:57.268] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:45:57.268] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763870999720} -[00:46:00.032] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:00.522] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:46:00.932] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:00.951] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:01.031] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:46:01.266] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:46:01.266] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:46:01.266] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871003633} -[00:46:02.948] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:07.278] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:46:07.485] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:46:07.485] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[00:46:07.485] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871009936} -[00:46:10.073] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:10.626] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[00:46:11.077] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:11.103] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:11.176] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:46:11.348] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[00:46:11.348] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[00:46:11.348] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871013799} -[00:46:14.176] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:15.210] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871017654} -[00:46:15.442] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:15.461] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:22.518] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:22.574] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:46:22.632] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib78dfc00256mfmixexh0ie color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib78dfc00256mfmixexh0ie","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871025055} -[00:46:22.887] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:22.901] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:29.255] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:29.266] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:46:29.432] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871031796} -[00:49:26.361] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:26.562] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:26.584] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:26.601] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:26.649] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:49:26.718] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib78dft002h6mfms73wo4om color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib78dft002h6mfms73wo4om","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871209098} -[00:49:30.284] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:30.296] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:30.454] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871212827} -[00:49:33.351] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:33.366] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:33.379] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:33.415] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:49:33.486] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib78dfu002j6mfmakr8q949 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib78dfu002j6mfmakr8q949","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871215892} -[00:49:37.430] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:37.443] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:37.601] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib78det001n6mfmva8du2yd&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871219971} -[00:49:40.902] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:40.918] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:40.935] Server LOG 🌳 GET /api/trees 返回数据: {} -[00:49:40.966] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[00:49:41.031] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib78dfu002j6mfmakr8q949 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib78dfu002j6mfmakr8q949","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763871223434} -[01:00:28.437] Server LOG ✓ Compiled in 92ms -[01:00:42.752] Server LOG ✓ Compiled in 53ms -[01:28:16.885] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:16.979] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib78det001n6mfmva8du2yd color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib78det001n6mfmva8du2yd","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873539428} -[01:28:17.155] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:17.167] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:19.309] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:19.319] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:19.330] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:19.576] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873541888} -[01:28:22.982] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:28:23.166] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:23.187] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:23.218] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:28:23.218] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[01:28:23.218] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873545705} -[01:28:26.252] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:28:26.486] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:28:26.486] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[01:28:26.486] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873548974} -[01:28:29.361] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:29.911] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:28:30.300] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:30.314] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:30.449] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:28:30.600] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:28:30.600] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[01:28:30.600] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873553038} -[01:28:32.909] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:34.197] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib7shkk000399035st8chmq color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib7shkk000399035st8chmq","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873556677} -[01:28:34.428] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:34.451] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:40.488] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:28:40.706] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:28:40.706] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[01:28:40.706] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873563194} -[01:28:43.365] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:43.888] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:28:44.365] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:44.385] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:44.555] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:28:44.908] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:28:44.908] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[01:28:44.908] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873567396} -[01:28:46.284] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:47.065] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib7shmp001n9903dk0zybg2 color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib7shmp001n9903dk0zybg2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873569544} -[01:28:47.298] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:47.320] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:53.910] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:53.957] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:28:54.004] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib7shno002j99033qb057l2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib7shno002j99033qb057l2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873576483} -[01:28:54.248] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:54.264] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:57.551] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:57.563] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:28:57.719] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib7shmp001n9903dk0zybg2&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib7shmp001n9903dk0zybg2&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873580129} -[01:29:35.297] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:29:35.309] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:29:35.319] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:29:35.372] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:29:35.435] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib7shno002j99033qb057l2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib7shno002j99033qb057l2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873617868} -[01:32:21.812] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:32:56.360] Server LOG ✓ Compiled in 59ms -[01:33:12.087] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:33:12.369] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:33:12.369] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[01:33:12.369] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873834843} -[01:33:15.178] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:15.683] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:33:16.330] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:16.345] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:16.405] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:33:16.767] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:33:16.767] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[01:33:16.767] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873839261} -[01:33:18.437] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:20.908] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:33:21.158] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:33:21.158] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[01:33:21.158] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873843653} -[01:33:24.285] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:24.822] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:33:25.385] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:25.421] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:25.493] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:33:25.574] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:33:25.574] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[01:33:25.574] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873847965} -[01:33:26.812] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:28.478] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873850918} -[01:33:28.662] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:28.680] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:40.622] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:40.697] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib7shno002j99033qb057l2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib7shno002j99033qb057l2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873863158} -[01:33:40.733] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:33:40.904] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:40.922] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:44.276] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:44.290] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:44.373] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873866859} -[01:33:49.378] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:49.393] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:49.406] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:49.438] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:33:49.509] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib7shno002j99033qb057l2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib7shno002j99033qb057l2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873871959} -[01:33:52.833] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:52.853] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:52.930] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873875411} -[01:33:54.016] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:54.029] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:54.041] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:33:54.169] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib7shnm002h9903kvssh49o color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib7shnm002h9903kvssh49o","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873876601} -[01:33:54.210] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:34:33.201] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:34:33.215] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:34:33.296] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2 color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib7shmp001n9903dk0zybg2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873915768} -[01:35:36.538] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:38.007] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:35:38.235] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:35:38.235] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/auth/signin","route":"/auth/signin"} -[01:35:38.235] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/auth/signin color: rgb(120, 120, 120) color: inherit {"dp":"/auth/signin","o":"http://localhost:3000/auth/signin","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873980814} -[01:35:41.267] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:41.788] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[01:35:42.550] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:42.568] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:42.630] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:35:43.056] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[01:35:43.056] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[01:35:43.056] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873985635} -[01:35:44.614] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:45.574] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763873988143} -[01:35:45.880] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:35:45.901] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:38:33.049] Server LOG ✓ Compiled in 144ms -[01:39:00.020] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:00.570] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:00.609] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhrs0005hhxlk83tffvl color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhrs0005hhxlk83tffvl","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874183181} -[01:39:00.623] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:39:00.862] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:00.893] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:10.582] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:10.619] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:10.678] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874193254} -[01:39:12.155] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:12.169] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:12.183] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:12.222] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:39:12.290] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhrs0005hhxlk83tffvl color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhrs0005hhxlk83tffvl","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874194829} -[01:39:26.488] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:26.503] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:26.585] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874209161} -[01:39:28.276] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:28.289] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:28.302] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:28.344] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:39:28.413] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhrv0007hhxl3q1knmo9 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhrv0007hhxl3q1knmo9","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874210951} -[01:39:31.525] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:31.546] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:31.633] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874214196} -[01:39:33.070] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:33.089] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:33.116] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:39:33.147] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:39:33.155] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhrz0009hhxlgs0r588g color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhrz0009hhxlgs0r588g","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874215692} -[01:39:36.181] Server LOG ✓ Compiled in 71ms -[01:40:04.891] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:04.909] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:04.985] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874247558} -[01:40:07.239] Server LOG ✓ Compiled in 65ms -[01:40:14.968] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:14.985] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:15.008] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:15.053] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[01:40:15.114] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874257641} -[01:40:22.997] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:23.012] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:40:23.092] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763874265671} -[01:41:27.554] Server LOG 🌳 GET /api/trees 返回数据: {} -[01:41:31.436] Server LOG ✓ Compiled in 144ms -[01:41:31.540] Browser ERROR ./Documents/go-new/chinese-family-tree/app/members/page.tsx:358:20 -Parsing ecmascript source code failed - 356 | - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' - 357 | -> 358 | ))} - | ^ - 359 | - 360 | - 361 | ))} - -Expected ' 7 | import { D3OrgChartFlow, type D3OrgChartRef } from "@/components/tree/d3-org-chart-flow" - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 | import { useFamily } from "@/context/family-context" - 9 | import { useRelationship } from "@/hooks/use-relationship" - 10 | import { Button } from "@/components/ui/button" - -The export D3OrgChartFlow was not found in module [project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-client] (ecmascript). -Did you mean to import default? -All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist. - -Import traces: - Client Component Browser: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component Browser] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] - - Client Component SSR: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component SSR] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] -[02:38:58.934] Browser ERROR ./Documents/go-new/chinese-family-tree/app/tree/page.tsx:7:1 -Export D3OrgChartFlow doesn't exist in target module - 5 | import { SiteHeader } from "@/components/site-header" - 6 | import { TreeLayout } from "@/components/tree/tree-layout" -> 7 | import { D3OrgChartFlow, type D3OrgChartRef } from "@/components/tree/d3-org-chart-flow" - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 | import { useFamily } from "@/context/family-context" - 9 | import { useRelationship } from "@/hooks/use-relationship" - 10 | import { Button } from "@/components/ui/button" - -The export D3OrgChartFlow was not found in module [project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript). -Did you mean to import default? -All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist. - -Import traces: - Client Component Browser: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component Browser] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] - - Client Component SSR: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component SSR] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] -[02:38:59.992] Browser ERROR ./Documents/go-new/chinese-family-tree/app/tree/page.tsx:7:1 -Export D3OrgChartFlow doesn't exist in target module - 5 | import { SiteHeader } from "@/components/site-header" - 6 | import { TreeLayout } from "@/components/tree/tree-layout" -> 7 | import { D3OrgChartFlow, type D3OrgChartRef } from "@/components/tree/d3-org-chart-flow" - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 | import { useFamily } from "@/context/family-context" - 9 | import { useRelationship } from "@/hooks/use-relationship" - 10 | import { Button } from "@/components/ui/button" - -The export D3OrgChartFlow was not found in module [project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-client] (ecmascript). -Did you mean to import default? -All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist. - -Import traces: - Client Component Browser: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component Browser] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] - - Client Component SSR: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component SSR] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] -[02:38:59.992] Browser ERROR ./Documents/go-new/chinese-family-tree/app/tree/page.tsx:7:1 -Export D3OrgChartFlow doesn't exist in target module - 5 | import { SiteHeader } from "@/components/site-header" - 6 | import { TreeLayout } from "@/components/tree/tree-layout" -> 7 | import { D3OrgChartFlow, type D3OrgChartRef } from "@/components/tree/d3-org-chart-flow" - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 | import { useFamily } from "@/context/family-context" - 9 | import { useRelationship } from "@/hooks/use-relationship" - 10 | import { Button } from "@/components/ui/button" - -The export D3OrgChartFlow was not found in module [project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript). -Did you mean to import default? -All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist. - -Import traces: - Client Component Browser: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component Browser] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] - - Client Component SSR: - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Client Component SSR] - ./Documents/go-new/chinese-family-tree/app/tree/page.tsx [Server Component] -[02:39:58.149] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:03.049] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:03.064] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:03.077] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:03.109] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:40:03.146] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877845753} -[02:40:05.079] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:05.095] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:05.234] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877847783} -[02:40:07.656] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:07.669] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:07.681] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:07.714] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:40:07.739] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhso000thhxl6jztirc0 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhso000thhxl6jztirc0","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877850347} -[02:40:50.747] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:50.853] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:50.870] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:50.988] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877893535} -[02:40:56.133] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:56.151] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:56.174] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:56.196] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:40:56.231] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877898837} -[02:40:57.862] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:57.877] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:40:57.979] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=traditional color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=traditional","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877900564} -[02:41:01.627] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:41:01.627] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:41:18.939] Server LOG ✓ Compiled in 59ms -[02:41:26.982] Server LOG ✓ Compiled in 55ms -[02:41:37.068] Server LOG ✓ Compiled in 54ms -[02:41:39.455] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:41:40.105] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:40.131] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:41:40.155] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:41:40.155] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:41:40.155] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877942777} -[02:41:40.160] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:41:46.321] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:46.342] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:41:46.403] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877949025} -[02:41:46.624] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:46.638] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:48.648] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:48.664] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:41:48.788] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877951357} -[02:42:43.045] Server LOG ✓ Compiled in 68ms -[02:44:09.971] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:12.201] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:12.217] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:12.232] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:12.253] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:44:12.292] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878094906} -[02:44:14.210] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:14.224] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:14.375] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878096918} -[02:44:16.922] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:44:17.541] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:44:17.541] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:44:17.541] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878099687} -[02:44:17.601] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:17.610] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:44:17.643] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:44:19.933] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:44:20.558] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:20.565] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:44:20.597] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:44:20.597] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:44:20.597] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878103224} -[02:44:20.601] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:44:23.149] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:23.183] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:44:23.229] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878105855} -[02:44:23.447] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:23.461] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:39.584] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:39.675] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:39.707] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:44:39.817] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878122370} -[02:44:42.320] Server LOG ✓ Compiled in 62ms -[02:44:53.802] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:03.777] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:45:04.010] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:45:04.010] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:45:04.010] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878146627} -[02:45:04.141] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:45:04.809] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:45:04.845] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:04.864] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:10.067] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:10.116] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:45:10.149] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: false -[02:45:10.149] Browser LOG Navigating to member detail -[02:45:10.149] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878152770} -[02:45:10.369] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:10.385] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:29.972] Server LOG ✓ Compiled in 67ms -[02:45:30.942] Browser ERROR uncaughtError: ReferenceError: useCallback is not defined -[02:45:36.924] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[02:45:37.142] Server LOG ✓ Compiled in 76ms -[02:45:38.356] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878179669} -[02:45:39.173] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:45:39.429] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:45:40.165] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:45:40.165] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:45:40.165] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878182127} -[02:45:40.201] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:45:40.223] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:40.236] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:41.382] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:41.396] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:45:41.556] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878184102} -[02:45:46.385] Server LOG ✓ Compiled in 67ms -[02:45:59.154] Server LOG ✓ Compiled in 61ms -[02:46:52.354] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:53.982] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:53.995] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:54.007] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:54.075] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:46:54.121] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: false -[02:46:54.121] Browser LOG Navigating to member detail -[02:46:54.121] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878256699} -[02:46:56.433] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:56.457] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:46:56.620] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878259156} -[02:46:59.318] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:47:00.267] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:47:00.267] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:47:00.267] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878262878} -[02:47:00.287] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:47:00.297] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:47:00.361] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:47:04.937] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:47:04.937] Browser LOG Calling handleMemberClick -[02:47:07.106] Browser LOG D3 onMemberClick triggered: cmib8zhtl001hhhxl289f3j07 relationMode: true -[02:47:07.106] Browser LOG Calling handleMemberClick -[02:47:07.106] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:47:07.106] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:47:33.835] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:47:36.151] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:47:36.151] Browser LOG Calling handleMemberClick -[02:48:12.951] Server LOG ✓ Compiled in 67ms -[02:48:13.023] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:48:13.091] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:48:26.810] Server LOG ✓ Compiled in 59ms -[02:48:36.973] Server LOG ✓ Compiled in 58ms -[02:48:44.991] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:48:47.623] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:48:47.623] Browser LOG Calling handleMemberClick -[02:48:49.485] Browser LOG D3 onMemberClick triggered: cmib8zhtm001jhhxlxi4lvq62 relationMode: true -[02:48:49.485] Browser LOG Calling handleMemberClick -[02:48:49.485] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:48:49.485] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:48:54.970] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:48:55.315] Browser ERROR unhandledRejection: Error: Failed to load chunk /_next/static/chunks/%5Bturbopack%5D_browser_dev_hmr-client_hmr-client_ts_4e597f91._.js from module [turbopack]/browser/dev/hmr-client/hmr-client.ts [app-client] (ecmascript, async loader) -[02:48:55.315] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:48:55.315] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:48:55.315] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878377809} -[02:48:55.315] Browser ERROR uncaughtError: Error: Failed to load chunk /_next/static/chunks/3032b_dexie_2a245be4._.js from module [project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/dist/compiled/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js [app-client] (ecmascript) -[02:48:58.757] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:48:59.039] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:48:59.045] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:48:59.077] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:48:59.077] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:48:59.077] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878381691} -[02:48:59.101] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:49:07.764] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:49:07.764] Browser LOG Calling handleMemberClick -[02:49:09.321] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[02:49:09.321] Browser LOG Calling handleMemberClick -[02:49:09.321] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:49:09.321] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:49:18.297] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:49:27.693] Server LOG ✓ Compiled in 78ms -[02:49:36.999] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:49:37.211] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:49:37.211] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:49:37.211] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878419846} -[02:49:37.244] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:49:37.250] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:49:37.313] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:49:38.569] Server LOG ✓ Compiled in 84ms -[02:49:41.707] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[02:49:41.707] Browser LOG Calling handleMemberClick -[02:49:43.763] Browser LOG D3 onMemberClick triggered: cmib8zhse000jhhxlt3ppgfn2 relationMode: true -[02:49:43.763] Browser LOG Calling handleMemberClick -[02:49:43.763] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:49:43.763] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:50:18.634] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:26.235] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878468810} -[02:50:26.388] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:26.438] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:29.606] Server LOG ✓ Compiled in 57ms -[02:50:42.719] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:42.735] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:42.948] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878485448} -[02:50:46.017] Server LOG ✓ Compiled in 87ms -[02:50:47.612] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:50:47.612] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:50:52.575] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:52.617] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:50:52.662] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhrv0007hhxl3q1knmo9 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhrv0007hhxl3q1knmo9","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878495289} -[02:50:52.879] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:52.893] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:55.115] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:55.135] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:50:55.279] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878497835} -[02:51:07.002] Server LOG ✓ Compiled in 86ms -[02:51:08.825] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:08.825] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:18.698] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:51:23.878] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:51:23.878] Browser LOG Calling handleMemberClick -[02:51:25.782] Browser LOG D3 onMemberClick triggered: cmib8zhto001lhhxlkizg2ig6 relationMode: true -[02:51:25.782] Browser LOG Calling handleMemberClick -[02:51:25.782] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:25.782] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:33.931] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:51:34.998] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:51:35.218] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:51:35.227] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:51:35.287] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:51:35.412] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:51:35.412] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:51:35.412] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878537950} -[02:51:37.507] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[02:51:37.507] Browser LOG Calling handleMemberClick -[02:51:40.341] Browser LOG D3 onMemberClick triggered: cmib8zhto001lhhxlkizg2ig6 relationMode: true -[02:51:40.341] Browser LOG Calling handleMemberClick -[02:51:40.341] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:40.341] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:47.335] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:51:48.143] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:51:48.150] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:51:48.203] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:51:48.203] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:51:48.203] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878550843} -[02:51:48.266] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:51:52.851] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[02:51:52.851] Browser LOG Calling handleMemberClick -[02:51:55.134] Browser LOG D3 onMemberClick triggered: cmib8zhtm001jhhxlxi4lvq62 relationMode: true -[02:51:55.134] Browser LOG Calling handleMemberClick -[02:51:55.134] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:51:55.134] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:52:22.116] Server LOG ✓ Compiled in 76ms -[02:52:32.544] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:34.653] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:52:35.392] Server LOG ✓ Compiled in 2ms -[02:52:35.568] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:35.576] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:52:35.576] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:52:35.576] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878598197} -[02:52:35.580] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:52:35.635] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:52:35.855] Browser LOG Updating node styles, selectedMembers: [] -[02:52:35.855] Browser LOG Found foreignObjects: 42 -[02:52:37.358] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:37.390] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:52:37.442] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: false -[02:52:37.443] Browser LOG Navigating to member detail -[02:52:37.443] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhs5000dhhxlo39he5la","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878600076} -[02:52:37.677] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:37.697] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:40.045] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:40.059] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:40.319] Browser LOG Updating node styles, selectedMembers: [] -[02:52:40.320] Browser LOG Found foreignObjects: 42 -[02:52:40.320] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878602777} -[02:52:42.643] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[02:52:42.643] Browser LOG Calling handleMemberClick -[02:52:44.502] Server LOG ✓ Compiled in 59ms -[02:52:45.982] Browser LOG D3 onMemberClick triggered: cmib8zhtm001jhhxlxi4lvq62 relationMode: true -[02:52:45.982] Browser LOG Calling handleMemberClick -[02:52:45.982] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:52:45.982] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:52:56.389] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:59.404] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:52:59.586] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:52:59.586] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:52:59.586] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878622228} -[02:52:59.683] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:52:59.711] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:52:59.760] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:52:59.990] Browser LOG Updating node styles, selectedMembers: [] -[02:52:59.990] Browser LOG Found foreignObjects: 42 -[02:52:59.990] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:52:59.990] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:53:02.104] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:53:02.104] Browser LOG Calling handleMemberClick -[02:53:08.155] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:53:10.468] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:53:10.468] Browser LOG Calling handleMemberClick -[02:53:12.114] Browser LOG D3 onMemberClick triggered: cmib8zhto001lhhxlkizg2ig6 relationMode: true -[02:53:12.114] Browser LOG Calling handleMemberClick -[02:53:12.114] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:53:12.114] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:53:23.455] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:53:41.138] Server LOG ✓ Compiled in 78ms -[02:53:49.885] Server LOG ✓ Compiled in 62ms -[02:54:00.458] Server LOG ✓ Compiled in 66ms -[02:54:12.640] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:54:13.460] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:54:13.460] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:54:13.460] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878696071} -[02:54:13.462] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:13.469] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:54:13.515] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:54:13.717] Browser LOG Updating node styles, selectedMembers: [] -[02:54:13.717] Browser LOG Found foreignObjects: 42 -[02:54:13.717] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:54:13.717] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:54:17.773] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:54:17.773] Browser LOG Calling handleMemberClick -[02:54:19.420] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[02:54:19.420] Browser LOG Calling handleMemberClick -[02:54:19.420] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:54:19.420] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:54:24.698] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:24.774] Browser LOG D3 onMemberClick triggered: cmib8zhsq000vhhxl2whod7u2 relationMode: false -[02:54:24.774] Browser LOG Navigating to member detail -[02:54:24.774] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsq000vhhxl2whod7u2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsq000vhhxl2whod7u2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878707417} -[02:54:24.793] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:54:24.998] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:25.014] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:26.847] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:26.859] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:54:27.073] Browser LOG Updating node styles, selectedMembers: [] -[02:54:27.073] Browser LOG Found foreignObjects: 42 -[02:54:27.073] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:54:27.073] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:54:27.073] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878709583} -[02:54:29.746] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[02:54:29.746] Browser LOG Calling handleMemberClick -[02:54:31.476] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[02:54:31.476] Browser LOG Calling handleMemberClick -[02:54:31.476] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:54:31.476] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:55:11.355] Server LOG ✓ Compiled in 70ms -[02:55:24.215] Server LOG ✓ Compiled in 66ms -[02:55:27.273] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:55:28.314] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:55:28.601] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:55:28.601] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:55:28.601] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878771244} -[02:55:28.617] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:55:28.627] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:55:28.725] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:55:28.958] Browser LOG Updating node styles, selectedMembers: [] -[02:55:28.958] Browser LOG Found foreignObjects: 42 -[02:55:28.958] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:55:28.958] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:55:42.067] Server LOG ✓ Compiled in 69ms -[02:55:51.682] Server LOG ✓ Compiled in 57ms -[02:56:00.890] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:56:00.890] Browser LOG Calling handleMemberClick -[02:56:02.499] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[02:56:02.499] Browser LOG Calling handleMemberClick -[02:56:02.499] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:56:02.499] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:57:12.696] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:57:22.974] Server LOG ✓ Compiled in 71ms -[02:57:32.482] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:57:32.871] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[02:57:33.728] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[02:57:33.728] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[02:57:33.728] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878896377} -[02:57:33.816] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:57:33.832] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[02:57:33.887] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:57:34.223] Browser LOG Updating node styles, selectedMembers: [] -[02:57:34.223] Browser LOG Found foreignObjects: 42 -[02:57:34.223] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:57:34.223] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:57:40.972] Server LOG ✓ Compiled in 73ms -[02:57:50.182] Server LOG ✓ Compiled in 65ms -[02:58:02.009] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:58:02.010] Browser LOG Calling handleMemberClick -[02:58:03.279] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[02:58:03.279] Browser LOG Calling handleMemberClick -[02:58:03.279] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:58:03.279] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:58:05.817] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht50017hhxldt6nnba6 -[02:58:09.511] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:58:09.592] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[02:58:09.604] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: false -[02:58:09.604] Browser LOG Navigating to member detail -[02:58:09.604] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878932244} -[02:58:09.819] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:58:09.901] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:58:11.454] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:58:11.469] Server LOG 🌳 GET /api/trees 返回数据: {} -[02:58:11.649] Browser LOG Updating node styles, selectedMembers: [] -[02:58:11.649] Browser LOG Found foreignObjects: 42 -[02:58:11.649] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[02:58:11.649] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[02:58:11.649] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763878934195} -[02:58:14.144] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[02:58:14.144] Browser LOG Calling handleMemberClick -[02:58:18.361] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[02:58:18.361] Browser LOG Calling handleMemberClick -[02:58:18.361] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:58:18.361] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[02:58:20.642] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht50017hhxldt6nnba6 -[02:59:35.205] Server LOG ✓ Compiled in 68ms -[02:59:46.319] Server LOG ✓ Compiled in 63ms -[03:00:32.515] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:00:33.412] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879076061} -[03:00:33.625] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:00:33.641] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:00:44.063] Server LOG ✓ Compiled in 62ms -[03:01:04.660] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:01:04.676] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:01:04.865] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879107407} -[03:01:07.651] Browser LOG Updating node styles, selectedMembers: [] -[03:01:07.651] Browser LOG Found foreignObjects: 42 -[03:01:07.651] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[03:01:07.651] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[03:01:09.384] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:01:09.384] Browser LOG Calling handleMemberClick -[03:01:10.885] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[03:01:10.885] Browser LOG Calling handleMemberClick -[03:01:10.885] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:10.885] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:12.416] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht50017hhxldt6nnba6 -[03:01:18.982] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:01:18.982] Browser LOG Calling handleMemberClick -[03:01:19.691] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:01:19.691] Browser LOG Calling handleMemberClick -[03:01:19.691] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:19.691] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:21.945] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht20013hhxl039l48mr -[03:01:28.912] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:01:29.109] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:01:29.109] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:01:29.109] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879131766} -[03:01:29.186] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:01:29.191] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:01:29.262] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:01:29.475] Browser LOG Updating node styles, selectedMembers: [] -[03:01:29.475] Browser LOG Found foreignObjects: 42 -[03:01:29.475] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[03:01:29.475] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[03:01:29.476] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[03:01:33.529] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:01:33.529] Browser LOG Calling handleMemberClick -[03:01:35.030] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:01:35.030] Browser LOG Calling handleMemberClick -[03:01:35.030] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:35.030] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:01:36.713] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht20013hhxl039l48mr -[03:02:39.152] Server LOG ✓ Compiled in 58ms -[03:02:50.830] Server LOG ✓ Compiled in 61ms -[03:02:57.285] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:03:00.714] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:03:01.573] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:03:01.579] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:03:01.586] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:03:01.586] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:03:01.586] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879224231} -[03:03:01.653] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:03:01.991] Browser LOG Updating node styles, selectedMembers: [] -[03:03:01.991] Browser LOG Found foreignObjects: 42 -[03:03:01.991] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false -[03:03:01.991] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false -[03:03:04.716] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:03:04.716] Browser LOG Calling handleMemberClick -[03:03:06.318] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:03:06.318] Browser LOG Calling handleMemberClick -[03:03:06.318] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:03:06.318] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:03:07.823] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht40015hhxlblc0udh0 -[03:03:33.334] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:03:36.873] Server LOG ✓ Compiled in 67ms -[03:03:54.025] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:03:54.025] Browser LOG Calling handleMemberClick -[03:03:55.539] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:03:55.539] Browser LOG Calling handleMemberClick -[03:03:55.539] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:03:55.539] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:03:57.344] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht40015hhxlblc0udh0 -[03:03:57.344] Browser LOG Found foreignObjects for clearing: 42 -[03:03:57.344] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:03:57.344] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:03:57.344] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:03:57.344] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:03:57.344] Browser LOG Found foreignObjects for clearing: 42 -[03:03:57.344] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : true -[03:03:57.344] Browser LOG Clearing styles for cmib8zht40015hhxlblc0udh0 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:03:57.344] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:03:57.344] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : false -[03:04:25.228] Server LOG ✓ Compiled in 60ms -[03:04:33.693] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:04:34.054] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:04:34.876] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:04:34.876] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:04:34.876] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879317531} -[03:04:34.888] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:04:34.895] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:04:34.956] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:04:38.761] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:04:39.658] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:04:39.658] Browser LOG Calling handleMemberClick -[03:04:40.723] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:04:40.723] Browser LOG Calling handleMemberClick -[03:04:40.723] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:04:40.723] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:04:42.250] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht40015hhxlblc0udh0 -[03:04:42.250] Browser LOG Found foreignObjects for clearing: 42 -[03:04:42.250] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:04:42.250] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:04:42.250] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:04:42.250] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:04:42.250] Browser LOG Found foreignObjects for clearing: 42 -[03:04:42.250] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : true -[03:04:42.250] Browser LOG Clearing styles for cmib8zht40015hhxlblc0udh0 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:04:42.250] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:04:42.250] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : false -[03:05:58.492] Server LOG ✓ Compiled in 76ms -[03:06:13.468] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:13.902] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:06:13.966] Server LOG ✓ Compiled in 1ms -[03:06:14.813] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:06:14.813] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:06:14.813] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879417503} -[03:06:14.865] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:14.874] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:06:14.926] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:06:20.323] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:06:20.323] Browser LOG Calling handleMemberClick -[03:06:21.712] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:06:21.712] Browser LOG Calling handleMemberClick -[03:06:21.712] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:21.712] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:24.398] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht20013hhxl039l48mr -[03:06:24.398] Browser LOG Found foreignObjects for clearing: 42 -[03:06:24.398] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:06:24.398] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:24.398] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:24.398] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:06:24.398] Browser LOG Found foreignObjects for clearing: 42 -[03:06:24.398] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : true -[03:06:24.398] Browser LOG Clearing styles for cmib8zht20013hhxl039l48mr color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:24.398] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:24.398] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : false -[03:06:28.528] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:28.574] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:06:28.595] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: false -[03:06:28.595] Browser LOG Navigating to member detail -[03:06:28.595] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhsa000hhhxlm0bt3ny3","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879431300} -[03:06:28.825] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:28.846] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:30.353] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:30.367] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:06:30.523] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879433151} -[03:06:32.756] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:06:32.756] Browser LOG Calling handleMemberClick -[03:06:41.277] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:06:41.277] Browser LOG Calling handleMemberClick -[03:06:41.277] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:41.277] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:44.230] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht20013hhxl039l48mr -[03:06:44.230] Browser LOG Found foreignObjects for clearing: 40 -[03:06:44.230] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:06:44.230] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:44.230] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:44.230] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:06:44.230] Browser LOG Found foreignObjects for clearing: 40 -[03:06:44.230] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : true -[03:06:44.230] Browser LOG Clearing styles for cmib8zht20013hhxl039l48mr color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:44.230] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:44.230] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : false -[03:06:49.941] Browser LOG D3 onMemberClick triggered: cmib8zhs5000dhhxlo39he5la relationMode: true -[03:06:49.941] Browser LOG Calling handleMemberClick -[03:06:55.442] Browser LOG D3 onMemberClick triggered: cmib8zht10011hhxla6g9be98 relationMode: true -[03:06:55.442] Browser LOG Calling handleMemberClick -[03:06:55.442] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:55.442] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:06:59.079] Browser LOG Clearing styles for: cmib8zhs5000dhhxlo39he5la cmib8zht10011hhxla6g9be98 -[03:06:59.079] Browser LOG Found foreignObjects for clearing: 40 -[03:06:59.079] Browser LOG Found cardDiv for cmib8zhs5000dhhxlo39he5la : true -[03:06:59.079] Browser LOG Clearing styles for cmib8zhs5000dhhxlo39he5la color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:59.079] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:59.079] Browser LOG Found cardDiv for cmib8zhs5000dhhxlo39he5la : false -[03:06:59.079] Browser LOG Found foreignObjects for clearing: 40 -[03:06:59.079] Browser LOG Found cardDiv for cmib8zht10011hhxla6g9be98 : true -[03:06:59.079] Browser LOG Clearing styles for cmib8zht10011hhxla6g9be98 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:06:59.079] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:06:59.079] Browser LOG Found cardDiv for cmib8zht10011hhxla6g9be98 : false -[03:08:11.006] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:08:12.963] Browser LOG D3 onMemberClick triggered: cmib8zhso000thhxl6jztirc0 relationMode: true -[03:08:12.963] Browser LOG Calling handleMemberClick -[03:08:15.331] Browser LOG D3 onMemberClick triggered: cmib8zhtl001hhhxl289f3j07 relationMode: true -[03:08:15.331] Browser LOG Calling handleMemberClick -[03:08:15.331] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:08:15.331] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:08:17.484] Browser LOG Clearing styles for: cmib8zhso000thhxl6jztirc0 cmib8zhtl001hhhxl289f3j07 -[03:08:17.484] Browser LOG Found foreignObjects for clearing: 40 -[03:08:17.484] Browser LOG Found cardDiv for cmib8zhso000thhxl6jztirc0 : true -[03:08:17.484] Browser LOG Clearing styles for cmib8zhso000thhxl6jztirc0 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:08:17.484] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:08:17.484] Browser LOG Found cardDiv for cmib8zhso000thhxl6jztirc0 : false -[03:08:17.484] Browser LOG Found foreignObjects for clearing: 40 -[03:08:17.484] Browser LOG Found cardDiv for cmib8zhtl001hhhxl289f3j07 : true -[03:08:17.484] Browser LOG Clearing styles for cmib8zhtl001hhhxl289f3j07 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:08:17.484] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:08:17.484] Browser LOG Found cardDiv for cmib8zhtl001hhhxl289f3j07 : false -[03:08:44.832] Server LOG ✓ Compiled in 71ms -[03:08:55.724] Server LOG ✓ Compiled in 59ms -[03:09:06.171] Server LOG ✓ Compiled in 65ms -[03:09:08.679] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:09:11.585] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:09:11.785] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:09:11.785] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:09:11.785] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879594497} -[03:09:11.963] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:09:11.994] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:09:12.002] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:09:23.503] Server LOG ✓ Compiled in 58ms -[03:09:34.889] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:09:34.900] Browser LOG Calling handleMemberClick -[03:09:36.557] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:09:36.557] Browser LOG Calling handleMemberClick -[03:09:36.557] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:09:36.557] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:09:38.041] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht20013hhxl039l48mr -[03:09:38.041] Browser LOG Found foreignObjects for clearing: 42 -[03:09:38.041] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:09:38.041] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:09:38.041] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:09:38.041] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:09:38.041] Browser LOG Found foreignObjects for clearing: 42 -[03:09:38.041] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : true -[03:09:38.041] Browser LOG Clearing styles for cmib8zht20013hhxl039l48mr color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:09:38.041] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:09:38.041] Browser LOG Found cardDiv for cmib8zht20013hhxl039l48mr : false -[03:09:44.621] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:09:46.527] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:09:47.411] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:09:47.411] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:09:47.411] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879630113} -[03:09:49.246] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:09:49.428] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:09:49.435] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:09:49.490] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:09:49.493] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:09:49.493] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:09:49.493] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879632172} -[03:09:52.761] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:09:52.761] Browser LOG Calling handleMemberClick -[03:09:54.123] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:09:54.123] Browser LOG Calling handleMemberClick -[03:09:54.123] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:09:54.123] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:09:55.763] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht40015hhxlblc0udh0 -[03:09:55.763] Browser LOG Found foreignObjects for clearing: 42 -[03:09:55.763] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:09:55.763] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:09:55.763] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:09:55.763] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:09:55.763] Browser LOG Found foreignObjects for clearing: 42 -[03:09:55.763] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : true -[03:09:55.763] Browser LOG Clearing styles for cmib8zht40015hhxlblc0udh0 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:09:55.763] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:09:55.763] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : false -[03:10:11.525] Server LOG ✓ Compiled in 58ms -[03:10:21.707] Server LOG ✓ Compiled in 53ms -[03:10:31.222] Server LOG ✓ Compiled in 52ms -[03:10:40.324] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:10:43.182] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:10:43.382] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:10:43.392] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:10:43.395] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:10:43.395] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:10:43.395] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879686093} -[03:10:43.450] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:10:45.968] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:10:45.968] Browser LOG Calling handleMemberClick -[03:10:48.752] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:10:48.752] Browser LOG Calling handleMemberClick -[03:10:48.752] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:10:48.752] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:10:50.260] Browser LOG Clearing styles for: cmib8zhsa000hhhxlm0bt3ny3 cmib8zht40015hhxlblc0udh0 -[03:10:50.260] Browser LOG Found foreignObjects for clearing: 42 -[03:10:50.260] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : true -[03:10:50.260] Browser LOG Clearing styles for cmib8zhsa000hhhxlm0bt3ny3 color: #ec4899 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:10:50.260] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:10:50.260] Browser LOG Found cardDiv for cmib8zhsa000hhhxlm0bt3ny3 : false -[03:10:50.260] Browser LOG Found foreignObjects for clearing: 42 -[03:10:50.260] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : true -[03:10:50.260] Browser LOG Clearing styles for cmib8zht40015hhxlblc0udh0 color: #3b82f6 before boxShadow: rgb(191, 219, 254) 0px 0px 0px 4px -[03:10:50.260] Browser LOG After clearing, boxShadow: rgba(0, 0, 0, 0.1) 0px 2px 8px -[03:10:50.260] Browser LOG Found cardDiv for cmib8zht40015hhxlblc0udh0 : false -[03:11:13.186] Server LOG ✓ Compiled in 54ms -[03:11:28.210] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:11:32.254] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:11:33.002] Server LOG ✓ Compiled in 125ms -[03:11:33.221] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:11:33.221] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:11:33.221] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879735919} -[03:11:33.243] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:11:33.254] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:11:33.328] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:11:49.573] Server LOG ✓ Compiled in 58ms -[03:11:59.548] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:11:59.548] Browser LOG Calling handleMemberClick -[03:12:01.035] Browser LOG D3 onMemberClick triggered: cmib8zht20013hhxl039l48mr relationMode: true -[03:12:01.035] Browser LOG Calling handleMemberClick -[03:12:01.035] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:12:01.035] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:12:50.966] Server LOG ✓ Compiled in 61ms -[03:12:56.448] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:13:01.211] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:13:01.211] Browser LOG Calling handleMemberClick -[03:13:03.734] Browser LOG D3 onMemberClick triggered: cmib8zhsk000phhxl0b7ow8vz relationMode: true -[03:13:03.734] Browser LOG Calling handleMemberClick -[03:13:03.734] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:13:03.734] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:13:07.148] Server LOG ✓ Compiled in 60ms -[03:13:38.373] Server LOG ✓ Compiled in 59ms -[03:13:42.540] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:13:44.492] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:13:45.367] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:13:45.367] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:13:45.367] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879868052} -[03:13:45.368] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:13:45.374] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:13:45.428] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:13:45.670] Browser LOG Updating check icons, selectedMembers: [] -[03:13:45.670] Browser LOG Found foreignObjects: 42 -[03:13:45.670] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:13:45.670] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:13:45.670] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:13:45.671] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:13:45.671] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:13:45.671] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:13:45.671] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:13:45.671] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:13:45.671] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:13:45.671] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:13:45.671] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:13:45.671] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:13:45.671] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:13:48.981] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:13:49.812] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:13:49.812] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:13:49.812] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879872520} -[03:13:49.816] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:13:49.856] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:13:49.872] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:13:50.134] Browser LOG Updating check icons, selectedMembers: [] -[03:13:50.134] Browser LOG Found foreignObjects: 42 -[03:13:50.134] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:13:50.134] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:13:50.134] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:13:54.891] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:13:54.891] Browser LOG Calling handleMemberClick -[03:13:56.951] Browser LOG D3 onMemberClick triggered: cmib8zhsk000phhxl0b7ow8vz relationMode: true -[03:13:56.951] Browser LOG Calling handleMemberClick -[03:13:56.951] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:13:56.951] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:14:44.538] Server LOG ✓ Compiled in 62ms -[03:14:44.625] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:44.625] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:57.779] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:14:58.111] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:14:59.005] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:14:59.005] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:14:59.005] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763879941683} -[03:14:59.018] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:14:59.024] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:14:59.072] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG Updating check icons, selectedMembers: [] -[03:14:59.392] Browser LOG Found foreignObjects: 42 -[03:14:59.392] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:14:59.392] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:14:59.392] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:15:04.378] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:15:04.378] Browser LOG Calling handleMemberClick -[03:15:05.795] Browser LOG D3 onMemberClick triggered: cmib8zhsk000phhxl0b7ow8vz relationMode: true -[03:15:05.795] Browser LOG Calling handleMemberClick -[03:15:05.795] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:15:05.795] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:15:46.690] Server LOG ✓ Compiled in 64ms -[03:15:46.777] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:15:46.777] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:09.045] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:16:12.195] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:16:13.080] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:16:13.087] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:16:13.149] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:16:13.149] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:16:13.149] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880015862} -[03:16:13.155] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG Updating check icons, selectedMembers: [] -[03:16:13.526] Browser LOG Found foreignObjects: 42 -[03:16:13.526] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:13.526] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:13.526] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:15.480] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:15.480] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:15.480] Browser LOG Updating check icons, selectedMembers: [] -[03:16:15.480] Browser LOG Found foreignObjects: 42 -[03:16:15.480] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:15.480] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:15.480] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:16:17.412] Browser LOG Calling handleMemberClick -[03:16:17.412] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:17.412] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:17.412] Browser LOG Updating check icons, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] -[03:16:17.412] Browser LOG Found foreignObjects: 42 -[03:16:17.412] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: true nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: true nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:17.412] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:17.412] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:17.412] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:19.165] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:16:19.165] Browser LOG Calling handleMemberClick -[03:16:19.165] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:19.165] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:19.165] Browser LOG Updating check icons, selectedMembers: [] -[03:16:19.165] Browser LOG Found foreignObjects: 42 -[03:16:19.165] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:19.165] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:19.165] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:19.165] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:19.165] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:19.165] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:19.166] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:19.166] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:19.166] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:16:19.166] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:16:50.434] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:16:50.601] Server LOG ✓ Compiled in 152ms -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:50.703] Browser LOG Updating check icons, selectedMembers: [] -[03:16:50.703] Browser LOG Found foreignObjects: 42 -[03:16:50.703] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:50.703] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:50.703] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:16:52.351] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:16:52.351] Browser LOG Calling handleMemberClick -[03:16:52.351] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:52.351] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:16:52.351] Browser LOG Updating check icons, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] -[03:16:52.351] Browser LOG Found foreignObjects: 42 -[03:16:52.351] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: true nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: true nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:52.351] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:52.351] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG D3 onMemberClick triggered: cmib8zht40015hhxlblc0udh0 relationMode: true -[03:16:54.051] Browser LOG Calling handleMemberClick -[03:16:54.051] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:54.051] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:54.051] Browser LOG Updating check icons, selectedMembers: [] -[03:16:54.051] Browser LOG Found foreignObjects: 42 -[03:16:54.051] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhrs0005hhxlk83tffvl isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhrz0009hhxlgs0r588g isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhs5000dhhxlo39he5la isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhsa000hhhxlm0bt3ny3 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhse000jhhxlt3ppgfn2 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhsj000nhhxlg7s8axjz isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhsk000phhxl0b7ow8vz isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhso000thhxl6jztirc0 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhsq000vhhxl2whod7u2 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhsx000xhhxlpbjrwykn isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht10011hhxla6g9be98 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht20013hhxl039l48mr isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht40015hhxlblc0udh0 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht50017hhxldt6nnba6 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht70019hhxlg7l25qh6 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zht8001bhhxlzoa6z9y2 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhti001dhhxlzhzwnmmv isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhtj001fhhxlq9zssb2u isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhtl001hhhxl289f3j07 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhtm001jhhxlxi4lvq62 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: true -[03:16:54.051] Browser LOG Node: cmib8zhto001lhhxlkizg2ig6 isSelected: false nameDiv found: false -[03:16:54.051] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:54.051] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:16:54.051] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:16:54.051] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:17:17.559] Server LOG ✓ Compiled in 76ms -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:17.738] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:17:48.099] Server LOG ✓ Compiled in 75ms -[03:18:09.299] Server LOG ✓ Compiled in 65ms -[03:18:15.627] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:18:15.627] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: true -[03:18:16.785] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:18:16.785] Browser LOG Calling handleMemberClick -[03:18:16.785] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:18:16.785] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:18:16.785] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:18:16.785] Browser LOG D3OrgChartFlow render, selectedMembers: ["cmib8zhsa000hhhxlm0bt3ny3"] relationMode: true -[03:18:19.541] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[03:18:19.541] Browser LOG Calling handleMemberClick -[03:18:19.541] Browser ERROR uncaughtError: ReferenceError: result is not defined -[03:18:22.586] Server LOG ✓ Compiled in 153ms -[03:18:32.971] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:18:33.916] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:18:33.920] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:18:33.920] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:18:33.920] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880156641} -[03:18:33.933] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:18:33.999] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:34.270] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:42.561] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:18:43.526] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:18:43.529] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:18:43.529] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:18:43.529] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880166258} -[03:18:43.532] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:18:43.587] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:43.847] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:18:52.176] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:18:52.176] Browser LOG Calling handleMemberClick -[03:18:54.505] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[03:18:54.505] Browser LOG Calling handleMemberClick -[03:18:54.505] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:18:54.505] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:20:32.190] Server LOG ✓ Compiled in 67ms -[03:21:10.607] Server LOG ✓ Compiled in 68ms -[03:21:22.614] Server LOG ✓ Compiled in 56ms -[03:22:14.338] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:22:15.041] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:22:15.294] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:22:15.294] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:22:15.294] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880377954} -[03:22:15.666] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:22:16.410] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:22:16.433] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:22:16.447] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:16.752] Browser LOG D3OrgChartFlow render, selectedMembers: [] relationMode: false -[03:22:19.511] Browser LOG D3 onMemberClick triggered: cmib8zhsa000hhhxlm0bt3ny3 relationMode: true -[03:22:19.511] Browser LOG Calling handleMemberClick -[03:22:20.916] Browser LOG D3 onMemberClick triggered: cmib8zht50017hhxldt6nnba6 relationMode: true -[03:22:20.916] Browser LOG Calling handleMemberClick -[03:22:20.916] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:22:20.916] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. -[03:24:17.097] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:20.170] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880502881} -[03:24:20.384] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:20.397] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:40.172] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:43.817] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:24:43.951] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:43.971] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:24:44.035] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:24:44.149] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:24:44.149] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} -[03:24:44.149] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/relationship-test color: rgb(120, 120, 120) color: inherit {"dp":"/relationship-test","o":"http://localhost:3000/relationship-test","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880526774} -[03:24:54.641] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:26:19.787] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:26:20.322] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:26:20.561] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:26:20.561] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} -[03:26:20.561] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880623246} -[03:26:20.637] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:26:20.645] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:26:20.727] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:26:26.242] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:26:26.377] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:26:26.377] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} -[03:26:26.377] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880629096} -[03:26:26.414] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:26:26.423] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:26:26.490] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:26:29.431] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880632150} -[03:26:29.684] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:26:29.814] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:03.759] Server LOG ✓ Compiled in 96ms -[03:27:03.783] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:03.802] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:03.842] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:10.420] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:11.403] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/relationship-test?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/relationship-test","o":"http://localhost:3000/relationship-test?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880673574} -[03:27:11.465] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:11.477] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:17.487] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:17.562] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:17.624] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880680308} -[03:27:43.540] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:44.439] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/settings color: rgb(120, 120, 120) color: inherit {"dp":"/settings","o":"http://localhost:3000/settings","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880707155} -[03:27:44.442] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:44.518] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:27:44.671] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:44.697] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:44.732] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:44.763] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:49.008] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:49.035] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:27:49.147] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880711830} -[03:28:05.001] Server LOG ✓ Compiled in 71ms -[03:28:05.268] Browser ERROR uncaughtError: ReferenceError: Calculator is not defined -[03:28:05.942] Browser ERROR uncaughtError: ReferenceError: Calculator is not defined -[03:28:05.942] Browser ERROR uncaughtError: ReferenceError: Calculator is not defined -[03:28:14.117] Server ERROR ⨯ ReferenceError: Calculator is not defined -[03:28:14.790] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:28:14.985] Browser ERROR uncaughtError: ReferenceError: Calculator is not defined -[03:28:14.985] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:28:14.985] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[03:28:14.985] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880737710} -[03:29:03.514] Server ERROR ⨯ ReferenceError: Calculator is not defined -[03:29:04.075] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:29:05.488] Browser ERROR uncaughtError: Error: Switched to client rendering because the server rendering errored: - -Calculator is not defined -[03:29:05.488] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:29:05.488] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[03:29:05.488] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880787124} -[03:29:05.488] Browser ERROR uncaughtError: ReferenceError: Calculator is not defined -[03:29:32.979] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:32.992] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:33.508] Server LOG ✓ Compiled in 251ms -[03:29:36.701] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:36.702] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/relationship-test color: rgb(120, 120, 120) color: inherit {"dp":"/relationship-test","o":"http://localhost:3000/relationship-test","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880815863} -[03:29:36.707] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:36.707] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:36.730] Server WARN ⚠ Fast Refresh had to perform a full reload due to a runtime error. -[03:29:36.977] Server LOG ✓ Compiled in 0ms -[03:29:38.126] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:29:38.185] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:29:38.486] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold -[03:29:38.580] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:29:38.581] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"} -[03:29:38.581] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880821278} -[03:29:38.909] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:29:38.942] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:29:38.992] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} -[03:29:39.049] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:29:39.090] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:29:40.128] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:29:40.156] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:29:40.249] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} -[03:29:40.342] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:29:40.342] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} -[03:29:40.342] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree?treeId=cmib8zhrq0003hhxlvnsi96nh","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880821839} -[03:29:40.495] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:29:40.511] Server LOG 🌳 GET /api/trees 返回数据: {} -[03:29:40.942] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit -[03:29:40.942] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} -[03:29:40.942] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/relationship-test color: rgb(120, 120, 120) color: inherit {"dp":"/relationship-test","o":"http://localhost:3000/relationship-test","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763880822804} -[03:29:40.942] Browser ERROR A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used: - -- A server/client branch `if (typeof window !== 'undefined')`. -- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called. -- Date formatting in a user's locale which doesn't match the server. -- External changing data without sending a snapshot of it along with the HTML. -- Invalid HTML tag nesting. - -It can also happen if the client has a browser extension installed which messes with the HTML before React loaded. - -%s%s https://react.dev/link/hydration-mismatch - - ... -
- ... - - - - - - - - - - - \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n \n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n \n \n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 332, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1221, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/db.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\"\nimport type { FamilyMember } from \"@/types/family\"\n\nexport interface GlobalSettings {\n key: string\n value: any\n}\n\nexport interface StoredImage {\n id: string\n blob: Blob\n mimeType: string\n createdAt: string\n}\n\nexport interface ActivityLog {\n id: string\n action: \"create\" | \"update\" | \"delete\" | \"import\" | \"export\"\n entityType: \"member\" | \"photo\" | \"story\" | \"settings\"\n entityId?: string\n entityName?: string\n changes?: any\n timestamp: string\n userId?: string\n userName?: string\n}\n\nexport class FamilyTreeDB extends Dexie {\n members!: Table\n settings!: Table\n images!: Table\n activityLogs!: Table\n\n constructor() {\n super(\"FamilyTreeDB\")\n this.version(1).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n })\n this.version(2).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n activityLogs: \"id, timestamp, action, entityType, entityId\",\n })\n }\n}\n\nexport const db = new FamilyTreeDB()\n"],"names":[],"mappings":";;;;;;AAAA;;AA2BO,MAAM,qBAAqB,+PAAK;IACrC,QAA6B;IAC7B,SAAgC;IAChC,OAA2B;IAC3B,aAAiC;IAEjC,aAAc;QACZ,KAAK,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;QACV;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;YACR,cAAc;QAChB;IACF;AACF;AAEO,MAAM,KAAK,IAAI"}}, {"offset": {"line": 1254, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { db } from \"@/lib/db\"\nimport { CircleUser, CircleUserRound } from \"lucide-react\"\nimport type { Gender } from \"@/types/family\"\n\ninterface AvatarDisplayProps {\n imageId?: string\n fallbackUrl?: string\n fallbackText?: string\n gender?: Gender\n className?: string\n}\n\nexport function AvatarDisplay({ imageId, fallbackUrl, fallbackText, gender, className }: AvatarDisplayProps) {\n const [blobUrl, setBlobUrl] = useState(undefined)\n\n useEffect(() => {\n if (imageId) {\n db.images.get(imageId).then((image) => {\n if (image) {\n const url = URL.createObjectURL(image.blob)\n setBlobUrl(url)\n return () => URL.revokeObjectURL(url)\n }\n })\n } else {\n setBlobUrl(undefined)\n }\n }, [imageId])\n\n // 如果有头像,显示头像\n if (blobUrl) {\n return (\n \n \n {fallbackText}\n \n )\n }\n\n // 没有头像,显示性别图标\n return (\n \n \n {gender === 'FEMALE' ? (\n \n ) : (\n \n )}\n \n \n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AAAA;AALA;;;;;;AAgBO,SAAS,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAsB;IACzG,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,uYAAQ,EAAqB;IAE3D,IAAA,wYAAS,EAAC;QACR,IAAI,SAAS;YACX,sKAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC3B,IAAI,OAAO;oBACT,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;oBAC1C,WAAW;oBACX,OAAO,IAAM,IAAI,eAAe,CAAC;gBACnC;YACF;QACF,OAAO;YACL,WAAW;QACb;IACF,GAAG;QAAC;KAAQ;IAEZ,aAAa;IACb,IAAI,SAAS;QACX,qBACE,oaAAC,4LAAM;YAAC,WAAW;;8BACjB,oaAAC,iMAAW;oBAAC,KAAK;;;;;;8BAClB,oaAAC,oMAAc;oBAAC,WAAU;8BAA+B;;;;;;;;;;;;IAG/D;IAEA,cAAc;IACd,qBACE,oaAAC,4LAAM;QAAC,WAAW;kBACjB,cAAA,oaAAC,oMAAc;YAAC,WAAU;sBACvB,WAAW,yBACV,oaAAC,8XAAe;gBAAC,WAAU;;;;;qCAE3B,oaAAC,2WAAU;gBAAC,WAAU;;;;;;;;;;;;;;;;AAKhC"}}, {"offset": {"line": 1347, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,oaAAC,qbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,oaAAC,wbAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,yKAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,oaAAC,qbAAoB;gBAAC,OAAO;0BAC3B,cAAA,oaAAC,sXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,oaAAC,ubAAsB;kBACrB,cAAA,oaAAC,wbAAuB;YACtB,aAAU;YACV,WAAW,IAAA,yKAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,oaAAC;;;;;8BACD,oaAAC,ybAAwB;oBACvB,WAAW,IAAA,yKAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,oaAAC;;;;;;;;;;;;;;;;AAIT;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,oaAAC;gBAAK,WAAU;0BACd,cAAA,oaAAC,8bAA6B;8BAC5B,cAAA,oaAAC,gWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,oaAAC,ybAAwB;0BAAE;;;;;;;;;;;;AAGjC;AAEA,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,oaAAC,0bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,oaAAC,+bAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,gXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;AAEA,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,oaAAC,icAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,sXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC"}}, {"offset": {"line": 1580, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/slider.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '@/lib/utils'\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n )\n\n return (\n \n \n \n \n {Array.from({ length: _values.length }, (_, index) => (\n \n ))}\n \n )\n}\n\nexport { Slider }\n"],"names":[],"mappings":";;;;;AAEA;AACA;AAEA;AALA;;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,MAAM,CAAC,EACP,MAAM,GAAG,EACT,GAAG,OAC+C;IAClD,MAAM,UAAU,sYAAa,CAC3B,IACE,MAAM,OAAO,CAAC,SACV,QACA,MAAM,OAAO,CAAC,gBACZ,eACA;YAAC;YAAK;SAAI,EAClB;QAAC;QAAO;QAAc;QAAK;KAAI;IAGjC,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,cAAc;QACd,OAAO;QACP,KAAK;QACL,KAAK;QACL,WAAW,IAAA,yKAAE,EACX,uOACA;QAED,GAAG,KAAK;;0BAET,oaAAC,sbAAqB;gBACpB,aAAU;gBACV,WACE;0BAGF,cAAA,oaAAC,sbAAqB;oBACpB,aAAU;oBACV,WACE;;;;;;;;;;;YAIL,MAAM,IAAI,CAAC;gBAAE,QAAQ,QAAQ,MAAM;YAAC,GAAG,CAAC,GAAG,sBAC1C,oaAAC,sbAAqB;oBACpB,aAAU;oBAEV,WAAU;mBADL;;;;;;;;;;;AAMf"}}, - {"offset": {"line": 1650, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 对每个世代的成员进行排序\n const sortedMembers = [...members].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖') || a.generation === 1\n const bIsFounder = b.tags?.includes('始祖') || b.generation === 1\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序\n return (a.birthDate || \"\").localeCompare(b.birthDate || \"\")\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedMembers.forEach(member => {\n // 跳过已经作为配偶处理过的成员\n if (processedSpouses.has(member.id)) return\n \n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

\n
\n
\n \n setQuery(e.target.value)}\n />\n
\n 0 ? \"secondary\" : \"outline\"}\n size=\"icon\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"relative\"\n >\n \n {activeFilterCount > 0 && (\n \n )}\n \n \n \n \n
\n
\n\n {/* Filter Bar */}\n {showFilters && (\n
\n
\n

高级筛选

\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n \n \n {generationRange[0]} - {generationRange[1]} 世\n \n
\n setGenerationRange(val as [number, number])}\n className=\"py-4\"\n />\n
\n
\n
\n )}\n
\n\n {filteredMembers.length === 0 ? (\n
\n 没有找到匹配的成员。\n
\n ) : (\n
\n {membersByGeneration.map(({ generation, members }) => (\n
\n
\n

第 {generation} 世

\n 共 {members.length} 人\n
\n
\n
\n {members.map((member) => {\n // 判断是否是配偶:\n // 1. 没有父母ID\n // 2. 有配偶ID\n // 3. 不是始祖(没有'始祖'标签)\n const isFounder = member.tags?.includes('始祖')\n const isSpouse = !member.fatherId && !member.motherId && \n member.spouseIds && member.spouseIds.length > 0 && \n !isFounder\n \n // 获取配偶信息\n const spouse = isSpouse && member.spouseIds?.[0] ? allMembers.find(m => m.id === member.spouseIds[0]) : null\n const spouseName = spouse ? spouse.fullName : null\n \n return (\n
\n \n \n \n
\n \n {/* 在世/去世标识 */}\n {member.deathDate && (\n
\n )}\n {!member.deathDate && (\n
\n )}\n
\n
\n
\n

\n {member.fullName}\n {member.courtesyName && (\n \n 字 {member.courtesyName}\n \n )}\n

\n
\n {isFounder ? (\n

\n 家族始祖\n

\n ) : isSpouse && spouseName ? (\n

\n {spouseName}的配偶\n

\n ) : (\n

\n {member.generationName ? `字辈: ${member.generationName}` : \"未录入字辈\"}\n

\n )}\n \n {/* 籍贯和生卒年并排 */}\n
\n

{member.ancestralHome || \"籍贯未知\"}

\n \n {/* 生卒年和年龄 */}\n {(member.birthDate || member.deathDate) && (\n
\n
\n {member.birthDate && new Date(member.birthDate).getFullYear()}\n {member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`}\n {!member.deathDate && member.birthDate && ' - '}\n
\n {(() => {\n if (!member.birthDate) return null\n const birthYear = new Date(member.birthDate).getFullYear()\n const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear()\n const age = deathYear - birthYear\n return (\n
\n {member.deathDate ? `享年${age}岁` : `${age}岁`}\n
\n )\n })()}\n
\n )}\n
\n \n {member.tags && member.tags.length > 0 && (\n
\n {member.tags.map((tag) => (\n \n {tag}\n \n ))}\n
\n )}\n
\n \n \n \n {\n setHighlightedMemberId(member.id)\n router.push('/tree')\n }}\n title=\"在族谱图中定位\"\n >\n \n \n
\n )\n })}\n
\n
\n ))}\n
\n )}\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}] + {"offset": {"line": 1650, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 区分家族成员和配偶\n const familyMembers = members.filter(m => {\n // 家族成员:有父母关系 或 明确标记为始祖\n const isFounder = m.tags?.includes('始祖')\n const hasFamilyParents = m.fatherId || m.motherId\n \n // 如果有父母关系,肯定是家族成员\n if (hasFamilyParents) return true\n \n // 如果明确标记为始祖,是家族成员\n if (isFounder) return true\n \n // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况)\n if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true\n \n // 其他情况(如第1世但有配偶且没有父母的)是配偶身份\n return false\n })\n \n // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低)\n const sortedFamilyMembers = [...familyMembers].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖')\n const bIsFounder = b.tags?.includes('始祖')\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序(早出生的在前 = 年龄大的在前)\n const aDate = a.birthDate || \"9999-12-31\"\n const bDate = b.birthDate || \"9999-12-31\"\n return aDate.localeCompare(bDate)\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedFamilyMembers.forEach(member => {\n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n } else {\n // 没有配偶,添加空白占位符\n result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any)\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

\n
\n
\n \n setQuery(e.target.value)}\n />\n
\n 0 ? \"secondary\" : \"outline\"}\n size=\"icon\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"relative\"\n >\n \n {activeFilterCount > 0 && (\n \n )}\n \n \n \n \n
\n
\n\n {/* Filter Bar */}\n {showFilters && (\n
\n
\n

高级筛选

\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n \n \n {generationRange[0]} - {generationRange[1]} 世\n \n
\n setGenerationRange(val as [number, number])}\n className=\"py-4\"\n />\n
\n
\n
\n )}\n
\n\n {filteredMembers.length === 0 ? (\n
\n 没有找到匹配的成员。\n
\n ) : (\n
\n {membersByGeneration.map(({ generation, members }) => (\n
\n
\n

第 {generation} 世

\n 共 {members.length} 人\n
\n
\n
\n {members.map((member) => {\n // 检查是否是占位符\n if ((member as any).isPlaceholder) {\n return
\n }\n \n // 判断是否是配偶:\n // 1. 没有父母ID\n // 2. 有配偶ID\n // 3. 不是始祖(没有'始祖'标签)\n const isFounder = member.tags?.includes('始祖')\n const isSpouse = !member.fatherId && !member.motherId && \n member.spouseIds && member.spouseIds.length > 0 && \n !isFounder\n \n // 获取配偶信息\n const spouse = isSpouse && member.spouseIds?.[0] ? allMembers.find(m => m.id === member.spouseIds[0]) : null\n const spouseName = spouse ? spouse.fullName : null\n \n return (\n
\n \n \n \n
\n \n {/* 在世/去世标识 */}\n {member.deathDate && (\n
\n )}\n {!member.deathDate && (\n
\n )}\n
\n
\n
\n

\n {member.fullName}\n {member.courtesyName && (\n \n 字 {member.courtesyName}\n \n )}\n

\n
\n {isFounder ? (\n

\n 家族始祖\n

\n ) : isSpouse && spouseName ? (\n

\n {spouseName}的配偶\n

\n ) : (\n

\n {member.generationName ? `字辈: ${member.generationName}` : \"未录入字辈\"}\n

\n )}\n \n {/* 籍贯和生卒年并排 */}\n
\n

{member.ancestralHome || \"籍贯未知\"}

\n \n {/* 生卒年和年龄 */}\n {(member.birthDate || member.deathDate) && (\n
\n
\n {member.birthDate && new Date(member.birthDate).getFullYear()}\n {member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`}\n {!member.deathDate && member.birthDate && ' - '}\n
\n {(() => {\n if (!member.birthDate) return null\n const birthYear = new Date(member.birthDate).getFullYear()\n const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear()\n const age = deathYear - birthYear\n return (\n
\n {member.deathDate ? `享年${age}岁` : `${age}岁`}\n
\n )\n })()}\n
\n )}\n
\n \n {member.tags && member.tags.length > 0 && (\n
\n {member.tags.map((tag) => (\n \n {tag}\n \n ))}\n
\n )}\n
\n \n \n \n {\n setHighlightedMemberId(member.id)\n router.push('/tree')\n }}\n title=\"在族谱图中定位\"\n >\n \n \n
\n )\n })}\n
\n
\n ))}\n
\n )}\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}] } \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js index 882d93a3..5056e39a 100644 --- a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js @@ -588,7 +588,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, @@ -3246,13 +3246,13 @@ function DashboardPage() { columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex flex-col space-y-4", + className: "flex flex-col space-y-1", children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex items-center justify-center gap-3 py-2", + className: "flex items-center justify-center gap-3", children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-5xl font-serif font-bold text-primary tracking-wider", + className: "text-3xl font-serif font-bold text-primary tracking-tight", children: "1" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", @@ -3260,19 +3260,19 @@ function DashboardPage() { columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-4xl font-bold text-muted-foreground", + className: "text-2xl font-bold text-muted-foreground", children: ":" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 249, + lineNumber: 247, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-5xl font-serif font-bold text-primary tracking-wider", + className: "text-3xl font-serif font-bold text-primary tracking-tight", children: stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 250, + lineNumber: 248, columnNumber: 19 }, this) ] @@ -3282,116 +3282,16 @@ function DashboardPage() { columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "text-center text-xs text-muted-foreground/80 font-medium -mt-2", - children: "男性 : 女性" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 254, - columnNumber: 17 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "space-y-2", + className: "text-center text-xs text-muted-foreground/80 font-medium mt-1", children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex items-center justify-between text-xs", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-primary/80 font-medium flex items-center gap-1", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "w-2 h-2 rounded-full bg-primary/60" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 262, - columnNumber: 23 - }, this), - "男性 ", - stats.maleCount - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 261, - columnNumber: 21 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-primary/80 font-medium flex items-center gap-1", - children: [ - "女性 ", - stats.femaleCount, - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "w-2 h-2 rounded-full bg-primary/60" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 267, - columnNumber: 23 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 265, - columnNumber: 21 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 260, - columnNumber: 19 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-3 bg-background/60 border border-border/50 rounded-full overflow-hidden flex", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-full bg-primary/70 transition-all duration-500 flex items-center justify-center", - style: { - width: `${stats.totalMembers > 0 ? stats.maleCount / stats.totalMembers * 100 : 0}%` - }, - children: stats.totalMembers > 0 && stats.maleCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-[10px] text-primary-foreground font-bold px-1", - children: [ - Math.round(stats.maleCount / stats.totalMembers * 100), - "%" - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 276, - columnNumber: 25 - }, this) - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 271, - columnNumber: 21 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-full bg-primary/40 transition-all duration-500 flex items-center justify-center", - style: { - width: `${stats.totalMembers > 0 ? stats.femaleCount / stats.totalMembers * 100 : 0}%` - }, - children: stats.totalMembers > 0 && stats.femaleCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-[10px] text-primary-foreground font-bold px-1", - children: [ - Math.round(stats.femaleCount / stats.totalMembers * 100), - "%" - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 286, - columnNumber: 25 - }, this) - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 281, - columnNumber: 21 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 270, - columnNumber: 19 - }, this) + "男性 ", + stats.maleCount, + " · 女性 ", + stats.femaleCount ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 259, + lineNumber: 252, columnNumber: 17 }, this) ] @@ -3410,7 +3310,7 @@ function DashboardPage() { className: "absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-primary/50 via-primary to-primary/50 opacity-0 group-hover:opacity-100 transition-opacity" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 295, + lineNumber: 257, columnNumber: 13 }, this) ] @@ -3440,7 +3340,7 @@ function DashboardPage() { children: "最近更新" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 302, + lineNumber: 264, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3448,7 +3348,7 @@ function DashboardPage() { children: "近期纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 303, + lineNumber: 265, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3456,7 +3356,7 @@ function DashboardPage() { children: "统计图表" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 304, + lineNumber: 266, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3464,13 +3364,13 @@ function DashboardPage() { children: "迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 305, + lineNumber: 267, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 301, + lineNumber: 263, columnNumber: 13 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"], { @@ -3485,24 +3385,24 @@ function DashboardPage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 309, + lineNumber: 271, columnNumber: 22 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 308, + lineNumber: 270, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 307, + lineNumber: 269, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 300, + lineNumber: 262, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -3521,20 +3421,20 @@ function DashboardPage() { children: "近期修谱动态" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 318, + lineNumber: 280, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardDescription"], { children: "记录家族成员的最新变动与修订" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 319, + lineNumber: 281, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 317, + lineNumber: 279, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardContent"], { @@ -3552,20 +3452,20 @@ function DashboardPage() { className: "h-full w-px bg-border group-last:hidden" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 328, + lineNumber: 290, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: `absolute top-2 h-2 w-2 rounded-full ring-4 ring-background ${activity.action === 'create' ? 'bg-green-500' : activity.action === 'update' ? 'bg-blue-500' : activity.action === 'delete' ? 'bg-red-500' : 'bg-purple-500'}` }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 329, + lineNumber: 291, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 327, + lineNumber: 289, columnNumber: 29 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3579,7 +3479,7 @@ function DashboardPage() { children: activity.action === 'create' ? '创建' : activity.action === 'update' ? '更新' : activity.action === 'delete' ? '删除' : '导入' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 338, + lineNumber: 300, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3587,7 +3487,7 @@ function DashboardPage() { children: activity.entityName || '未知' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 348, + lineNumber: 310, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3595,13 +3495,13 @@ function DashboardPage() { children: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$date$2d$fns$40$4$2e$1$2e$0$2f$node_modules$2f$date$2d$fns$2f$format$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$locals$3e$__["format"])(new Date(activity.timestamp), 'MM-dd HH:mm') }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 349, + lineNumber: 311, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 337, + lineNumber: 299, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -3614,47 +3514,47 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 353, + lineNumber: 315, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 336, + lineNumber: 298, columnNumber: 29 }, this) ] }, activity.id, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 326, + lineNumber: 288, columnNumber: 27 }, this)) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "text-center text-muted-foreground py-8", children: "暂无修谱记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 363, + lineNumber: 325, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 323, + lineNumber: 285, columnNumber: 21 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 322, + lineNumber: 284, columnNumber: 19 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 321, + lineNumber: 283, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 316, + lineNumber: 278, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3670,19 +3570,19 @@ function DashboardPage() { className: "h-5 w-5" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 376, + lineNumber: 338, columnNumber: 23 }, this), "本月祭祖/纪念" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 375, + lineNumber: 337, columnNumber: 21 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 374, + lineNumber: 336, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardContent"], { @@ -3705,7 +3605,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 388, + lineNumber: 350, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3713,13 +3613,13 @@ function DashboardPage() { children: anniversary.day }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 391, + lineNumber: 353, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 387, + lineNumber: 349, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3734,7 +3634,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 394, + lineNumber: 356, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -3749,24 +3649,24 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 397, + lineNumber: 359, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 393, + lineNumber: 355, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 386, + lineNumber: 348, columnNumber: 29 }, this) }, `${anniversary.member.id}-${anniversary.type}`, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 385, + lineNumber: 347, columnNumber: 27 }, this); }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3774,34 +3674,34 @@ function DashboardPage() { children: "本月暂无纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 407, + lineNumber: 369, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 380, + lineNumber: 342, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 373, + lineNumber: 335, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 372, + lineNumber: 334, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 315, + lineNumber: 277, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 314, + lineNumber: 276, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -3817,20 +3717,20 @@ function DashboardPage() { children: "近期纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 421, + lineNumber: 383, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardDescription"], { children: "未来三个月内的生日和忌日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 422, + lineNumber: 384, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 420, + lineNumber: 382, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardContent"], { @@ -3892,7 +3792,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 478, + lineNumber: 440, columnNumber: 37 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3900,13 +3800,13 @@ function DashboardPage() { children: event.date.getDate() }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 479, + lineNumber: 441, columnNumber: 37 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 477, + lineNumber: 439, columnNumber: 35 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3921,7 +3821,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 482, + lineNumber: 444, columnNumber: 37 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -3936,34 +3836,34 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 485, + lineNumber: 447, columnNumber: 37 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 481, + lineNumber: 443, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 476, + lineNumber: 438, columnNumber: 33 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 475, + lineNumber: 437, columnNumber: 31 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 474, + lineNumber: 436, columnNumber: 29 }, this) }, `${event.member.id}-${event.type}-${index}`, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 473, + lineNumber: 435, columnNumber: 27 }, this); }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3971,29 +3871,29 @@ function DashboardPage() { children: "未来三个月暂无纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 497, + lineNumber: 459, columnNumber: 23 }, this); })() }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 425, + lineNumber: 387, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 424, + lineNumber: 386, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 419, + lineNumber: 381, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 418, + lineNumber: 380, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -4003,12 +3903,12 @@ function DashboardPage() { members: Object.values(treeData.members) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 509, + lineNumber: 471, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 508, + lineNumber: 470, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -4024,20 +3924,20 @@ function DashboardPage() { children: "家族迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 516, + lineNumber: 478, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardDescription"], { children: "记录家族成员的籍贯分布" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 517, + lineNumber: 479, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 515, + lineNumber: 477, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardContent"], { @@ -4066,7 +3966,7 @@ function DashboardPage() { children: location }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 541, + lineNumber: 503, columnNumber: 29 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -4077,13 +3977,13 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 542, + lineNumber: 504, columnNumber: 29 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 540, + lineNumber: 502, columnNumber: 27 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4098,7 +3998,7 @@ function DashboardPage() { children: member.fullName }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 550, + lineNumber: 512, columnNumber: 35 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4110,36 +4010,36 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 551, + lineNumber: 513, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 549, + lineNumber: 511, columnNumber: 33 }, this) }, member.id, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 548, + lineNumber: 510, columnNumber: 31 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 546, + lineNumber: 508, columnNumber: 27 }, this) ] }, location, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 539, + lineNumber: 501, columnNumber: 25 }, this)) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "text-center py-12 text-muted-foreground", children: "暂无迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 559, + lineNumber: 521, columnNumber: 23 }, this); }, [ @@ -4147,29 +4047,29 @@ function DashboardPage() { ]) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 520, + lineNumber: 482, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 519, + lineNumber: 481, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 514, + lineNumber: 476, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 513, + lineNumber: 475, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 299, + lineNumber: 261, columnNumber: 9 }, this) ] @@ -4200,7 +4100,7 @@ function StatCard({ title, value, subtitle, icon }) { children: title }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 584, + lineNumber: 546, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4208,13 +4108,13 @@ function StatCard({ title, value, subtitle, icon }) { children: icon }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 585, + lineNumber: 547, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 583, + lineNumber: 545, columnNumber: 9 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4225,7 +4125,7 @@ function StatCard({ title, value, subtitle, icon }) { children: value }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 590, + lineNumber: 552, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4233,32 +4133,32 @@ function StatCard({ title, value, subtitle, icon }) { children: subtitle }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 591, + lineNumber: 553, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 589, + lineNumber: 551, columnNumber: 9 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 582, + lineNumber: 544, columnNumber: 7 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-primary/50 via-primary to-primary/50 opacity-0 group-hover:opacity-100 transition-opacity" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 594, + lineNumber: 556, columnNumber: 7 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 581, + lineNumber: 543, columnNumber: 5 }, this); } diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js.map b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js.map index 62054243..1729a677 100644 --- a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js.map +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_ae245aad._.js.map @@ -4,12 +4,12 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,oaAAC,ybAAwB;QACvB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf"}}, {"offset": {"line": 57, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 332, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 332, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1221, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/scroll-area.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\n\nimport { cn } from '@/lib/utils'\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n {children}\n \n \n \n \n )\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport { ScrollArea, ScrollBar }\n"],"names":[],"mappings":";;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OACmD;IACtD,qBACE,oaAAC,6bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,YAAY;QACzB,GAAG,KAAK;;0BAET,oaAAC,icAA4B;gBAC3B,aAAU;gBACV,WAAU;0BAET;;;;;;0BAEH,oaAAC;;;;;0BACD,oaAAC,+bAA0B;;;;;;;;;;;AAGjC;AAEA,SAAS,UAAU,EACjB,SAAS,EACT,cAAc,UAAU,EACxB,GAAG,OACkE;IACrE,qBACE,oaAAC,4cAAuC;QACtC,aAAU;QACV,aAAa;QACb,WAAW,IAAA,yKAAE,EACX,sDACA,gBAAgB,cACd,8CACF,gBAAgB,gBACd,gDACF;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,wcAAmC;YAClC,aAAU;YACV,WAAU;;;;;;;;;;;AAIlB"}}, {"offset": {"line": 1291, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/tabs.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '@/lib/utils'\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n"],"names":[],"mappings":";;;;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,KAAK,EACZ,SAAS,EACT,GAAG,OAC6C;IAChD,qBACE,oaAAC,mbAAkB;QACjB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,uBAAuB;QACpC,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,SAAS,EAChB,SAAS,EACT,GAAG,OAC6C;IAChD,qBACE,oaAAC,mbAAkB;QACjB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,uGACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,mqBACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,uBAAuB;QACpC,GAAG,KAAK;;;;;;AAGf"}}, {"offset": {"line": 1357, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/dashboard/statistics-charts.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport * as echarts from \"echarts\"\nimport type { FamilyMember } from \"@/types/family\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from \"@/components/ui/card\"\n\ninterface StatisticsChartsProps {\n members: FamilyMember[]\n}\n\nexport function StatisticsCharts({ members }: StatisticsChartsProps) {\n const genderChartRef = useRef(null)\n const generationChartRef = useRef(null)\n const ageDistributionRef = useRef(null)\n const birthYearChartRef = useRef(null)\n\n useEffect(() => {\n if (!genderChartRef.current || members.length === 0) return\n\n // 性别分布饼图\n const genderChart = echarts.init(genderChartRef.current)\n const genderData = {\n male: members.filter(m => m.gender === 'MALE').length,\n female: members.filter(m => m.gender === 'FEMALE').length,\n other: members.filter(m => m.gender === 'OTHER').length,\n }\n\n genderChart.setOption({\n title: {\n text: '性别分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} 人 ({d}%)'\n },\n legend: {\n bottom: 10,\n left: 'center'\n },\n series: [\n {\n type: 'pie',\n radius: ['40%', '70%'],\n center: ['50%', '50%'],\n avoidLabelOverlap: false,\n itemStyle: {\n borderRadius: 10,\n borderColor: '#fff',\n borderWidth: 2\n },\n label: {\n show: false\n },\n emphasis: {\n label: {\n show: true,\n fontSize: 16,\n fontWeight: 'bold'\n }\n },\n data: [\n { value: genderData.male, name: '男性', itemStyle: { color: '#3b82f6' } },\n { value: genderData.female, name: '女性', itemStyle: { color: '#ec4899' } },\n ...(genderData.other > 0 ? [{ value: genderData.other, name: '其他', itemStyle: { color: '#8b5cf6' } }] : [])\n ]\n }\n ]\n })\n\n return () => {\n genderChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!generationChartRef.current || members.length === 0) return\n\n // 世代分布柱状图\n const generationChart = echarts.init(generationChartRef.current)\n const generationData = new Map()\n \n members.forEach(m => {\n const gen = m.generation || 0\n generationData.set(gen, (generationData.get(gen) || 0) + 1)\n })\n\n const sortedGenerations = Array.from(generationData.entries()).sort((a, b) => a[0] - b[0])\n\n generationChart.setOption({\n title: {\n text: '世代分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'shadow'\n },\n formatter: '{b}世: {c} 人'\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n top: '15%',\n containLabel: true\n },\n xAxis: {\n type: 'category',\n data: sortedGenerations.map(([gen]) => `第${gen}世`),\n axisLabel: {\n rotate: 45\n }\n },\n yAxis: {\n type: 'value',\n name: '人数'\n },\n series: [\n {\n type: 'bar',\n data: sortedGenerations.map(([, count]) => count),\n itemStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: '#83bff6' },\n { offset: 0.5, color: '#188df0' },\n { offset: 1, color: '#188df0' }\n ])\n },\n emphasis: {\n itemStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: '#2378f7' },\n { offset: 0.7, color: '#2378f7' },\n { offset: 1, color: '#83bff6' }\n ])\n }\n }\n }\n ]\n })\n\n return () => {\n generationChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!ageDistributionRef.current || members.length === 0) return\n\n // 年龄分布图\n const ageChart = echarts.init(ageDistributionRef.current)\n const currentYear = new Date().getFullYear()\n \n const ageGroups = {\n '0-18': 0,\n '19-35': 0,\n '36-50': 0,\n '51-65': 0,\n '66+': 0,\n '已故': 0\n }\n\n members.forEach(m => {\n if (m.deathDate) {\n ageGroups['已故']++\n } else if (m.birthDate) {\n const age = currentYear - new Date(m.birthDate).getFullYear()\n if (age <= 18) ageGroups['0-18']++\n else if (age <= 35) ageGroups['19-35']++\n else if (age <= 50) ageGroups['36-50']++\n else if (age <= 65) ageGroups['51-65']++\n else ageGroups['66+']++\n }\n })\n\n ageChart.setOption({\n title: {\n text: '年龄分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} 人 ({d}%)'\n },\n legend: {\n bottom: 10,\n left: 'center'\n },\n series: [\n {\n type: 'pie',\n radius: '60%',\n center: ['50%', '50%'],\n data: Object.entries(ageGroups)\n .filter(([, count]) => count > 0)\n .map(([name, value]) => ({ name, value })),\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n }\n }\n }\n ]\n })\n\n return () => {\n ageChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!birthYearChartRef.current || members.length === 0) return\n\n // 出生年份趋势图\n const birthYearChart = echarts.init(birthYearChartRef.current)\n const birthYearData = new Map()\n \n members.forEach(m => {\n if (m.birthDate) {\n const year = new Date(m.birthDate).getFullYear()\n if (year >= 1900) { // 只统计1900年以后的\n const decade = Math.floor(year / 10) * 10\n birthYearData.set(decade, (birthYearData.get(decade) || 0) + 1)\n }\n }\n })\n\n const sortedYears = Array.from(birthYearData.entries()).sort((a, b) => a[0] - b[0])\n\n birthYearChart.setOption({\n title: {\n text: '出生年代分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'axis',\n formatter: '{b}年代: {c} 人'\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n top: '15%',\n containLabel: true\n },\n xAxis: {\n type: 'category',\n data: sortedYears.map(([year]) => `${year}s`),\n axisLabel: {\n rotate: 45\n }\n },\n yAxis: {\n type: 'value',\n name: '人数'\n },\n series: [\n {\n type: 'line',\n data: sortedYears.map(([, count]) => count),\n smooth: true,\n areaStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: 'rgba(99, 102, 241, 0.5)' },\n { offset: 1, color: 'rgba(99, 102, 241, 0.1)' }\n ])\n },\n lineStyle: {\n color: '#6366f1',\n width: 2\n },\n itemStyle: {\n color: '#6366f1'\n }\n }\n ]\n })\n\n return () => {\n birthYearChart.dispose()\n }\n }, [members])\n\n return (\n
\n \n \n 性别分布\n 家族成员性别比例\n \n \n
\n \n \n\n \n \n 世代分布\n 各世代人数统计\n \n \n
\n \n \n\n \n \n 年龄分布\n 按年龄段划分的人数\n \n \n
\n \n \n\n \n \n 出生年代分布\n 各年代出生人数趋势\n \n \n
\n \n \n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1898, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,oaAAC,qbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;AAEA,SAAS,cAAc,EACrB,GAAG,OACkD;IACrD,qBAAO,oaAAC,wbAAuB;QAAC,aAAU;QAAkB,GAAG,KAAK;;;;;;AACtE;AAEA,SAAS,aAAa,EACpB,GAAG,OACiD;IACpD,qBAAO,oaAAC,ubAAsB;QAAC,aAAU;QAAiB,GAAG,KAAK;;;;;;AACpE;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,GAAG,OACkD;IACrD,qBACE,oaAAC,wbAAuB;QACtB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,0JACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,kBAAkB,IAAI,EACtB,GAAG,OAGJ;IACC,qBACE,oaAAC;QAAa,aAAU;;0BACtB,oaAAC;;;;;0BACD,oaAAC,wbAAuB;gBACtB,aAAU;gBACV,WAAW,IAAA,yKAAE,EACX,+WACA;gBAED,GAAG,KAAK;;oBAER;oBACA,iCACC,oaAAC,sbAAqB;wBACpB,aAAU;wBACV,WAAU;;0CAEV,oaAAC,oVAAK;;;;;0CACN,oaAAC;gCAAK,WAAU;0CAAU;;;;;;;;;;;;;;;;;;;;;;;;AAMtC;AAEA,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,oaAAC;QACC,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,gDAAgD;QAC7D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,oaAAC;QACC,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,0DACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,sCAAsC;QACnD,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,kBAAkB,EACzB,SAAS,EACT,GAAG,OACsD;IACzD,qBACE,oaAAC,4bAA2B;QAC1B,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,iCAAiC;QAC9C,GAAG,KAAK;;;;;;AAGf"}}, {"offset": {"line": 2080, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,oaAAC,qbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,oaAAC,wbAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,yKAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,oaAAC,qbAAoB;gBAAC,OAAO;0BAC3B,cAAA,oaAAC,sXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,oaAAC,ubAAsB;kBACrB,cAAA,oaAAC,wbAAuB;YACtB,aAAU;YACV,WAAW,IAAA,yKAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,oaAAC;;;;;8BACD,oaAAC,ybAAwB;oBACvB,WAAW,IAAA,yKAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,oaAAC;;;;;;;;;;;;;;;;AAIT;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,oaAAC;gBAAK,WAAU;0BACd,cAAA,oaAAC,8bAA6B;8BAC5B,cAAA,oaAAC,gWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,oaAAC,ybAAwB;0BAAE;;;;;;;;;;;;AAGjC;AAEA,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,oaAAC,0bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,oaAAC,+bAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,gXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;AAEA,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,oaAAC,icAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,sXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC"}}, {"offset": {"line": 2313, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/collaborator-dialog.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { useSession } from \"next-auth/react\"\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\"\nimport { Users, Mail, Trash2, Plus, Shield, Eye, Edit } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface Collaborator {\n id: string\n userId: string\n role: \"EDITOR\" | \"VIEWER\"\n invitedAt: string\n user: {\n id: string\n name: string | null\n email: string\n avatar: string | null\n }\n}\n\nexport function CollaboratorDialog() {\n const { data: session } = useSession()\n const { currentTree } = useFamily()\n const { showConfirm, showAlert } = useDialog()\n const [open, setOpen] = useState(false)\n const [collaborators, setCollaborators] = useState([])\n const [isInviting, setIsInviting] = useState(false)\n const [email, setEmail] = useState(\"\")\n const [role, setRole] = useState<\"EDITOR\" | \"VIEWER\">(\"VIEWER\")\n const [password, setPassword] = useState(\"\")\n const [error, setError] = useState(\"\")\n const [success, setSuccess] = useState(\"\")\n\n // 加载协作者\n useEffect(() => {\n if (open && currentTree?.id) {\n loadCollaborators()\n }\n }, [open, currentTree?.id])\n\n const loadCollaborators = async () => {\n if (!currentTree?.id) return\n \n try {\n const res = await fetch(`/api/trees/${currentTree.id}/collaborators`)\n if (res.ok) {\n const data = await res.json()\n setCollaborators(data.collaborators)\n }\n } catch (err) {\n console.error(\"加载协作者失败:\", err)\n }\n }\n\n const handleInvite = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!currentTree?.id) return\n\n setIsInviting(true)\n setError(\"\")\n setSuccess(\"\")\n\n try {\n const res = await fetch(`/api/trees/${currentTree.id}/invite`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n role,\n password: password || undefined,\n }),\n })\n\n const data = await res.json()\n\n if (!res.ok) {\n throw new Error(data.error || \"邀请失败\")\n }\n\n setSuccess(data.message)\n setEmail(\"\")\n setPassword(\"\")\n loadCollaborators()\n } catch (err: any) {\n setError(err.message)\n } finally {\n setIsInviting(false)\n }\n }\n\n const handleRemove = async (userId: string) => {\n if (!currentTree?.id) return\n \n const confirmed = await showConfirm(\"确定要移除此协作者吗?\", \"移除协作者\")\n if (!confirmed) return\n\n try {\n const res = await fetch(`/api/trees/${currentTree.id}/collaborators?userId=${userId}`, {\n method: 'DELETE',\n })\n\n if (!res.ok) throw new Error('移除失败')\n\n loadCollaborators()\n } catch (err) {\n console.error(err)\n await showAlert(\"移除失败\", \"错误\")\n }\n }\n\n if (!currentTree) return null\n if (currentTree.ownerId !== session?.user?.id) return null\n\n return (\n \n \n \n \n \n \n 协作管理 - {currentTree.name}\n \n 邀请其他用户协作编辑或查看您的家族树。\n \n \n \n
\n {/* 邀请表单 */}\n
\n
\n
\n \n setEmail(e.target.value)}\n required\n />\n
\n
\n \n \n
\n
\n \n
\n setPassword(e.target.value)}\n minLength={6}\n className=\"flex-1\"\n />\n \n
\n

如果是现有用户,此密码将被忽略。

\n
\n
\n\n {error && (\n \n 错误\n {error}\n \n )}\n\n {success && (\n \n 成功\n {success}\n \n )}\n
\n\n {/* 协作者列表 */}\n
\n

现有协作者

\n {collaborators.length === 0 ? (\n
\n 暂无协作者\n
\n ) : (\n
\n {collaborators.map((collab) => (\n \n
\n \n \n {collab.user.name?.charAt(0).toUpperCase() || collab.user.email.charAt(0).toUpperCase()}\n \n \n
\n
{collab.user.name || \"用户\"}
\n
{collab.user.email}
\n
\n
\n
\n \n {collab.role === 'EDITOR' ? '编辑者' : '查看者'}\n \n handleRemove(collab.userId)}\n >\n \n \n
\n
\n ))}\n
\n )}\n
\n
\n \n \n )\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 2877, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\nimport Link from \"next/link\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { UserPlus, Network, Map, Calendar, Users, ArrowRight, Clock, Search, BookOpen, BarChart3, Calculator } from \"lucide-react\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useMemo, useState, useEffect, useRef } from \"react\"\nimport { StatisticsCharts } from \"@/components/dashboard/statistics-charts\"\nimport { format } from \"date-fns\"\nimport { useSession } from \"next-auth/react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { CollaboratorDialog } from \"@/components/tree/collaborator-dialog\"\n\ninterface ActivityLog {\n id: string\n action: string\n entityType: string\n entityId?: string | null\n entityName?: string | null\n timestamp: string\n user?: {\n name?: string | null\n email?: string | null\n }\n}\n\nexport default function DashboardPage() {\n const { treeData, isLoading, currentTree } = useFamily()\n const { data: session } = useSession()\n const [recentActivities, setRecentActivities] = useState([])\n \n // 加载最近的操作日志\n useEffect(() => {\n if (currentTree?.id && session?.user?.id) {\n fetch(`/api/trees/${currentTree.id}/activity-logs?limit=10`)\n .then(res => {\n if (!res.ok) {\n throw new Error('获取活动日志失败')\n }\n return res.json()\n })\n .then(data => {\n if (data.logs) {\n setRecentActivities(data.logs)\n }\n })\n .catch(err => {\n console.error('获取活动日志失败:', err)\n setRecentActivities([])\n })\n } else {\n setRecentActivities([])\n }\n }, [currentTree?.id, session?.user?.id])\n \n // 计算统计数据\n const stats = useMemo(() => {\n const members = Object.values(treeData.members)\n const totalMembers = members.length\n \n // 在世和已故人数\n const livingMembers = members.filter(m => !m.deathDate).length\n const deceasedMembers = members.filter(m => m.deathDate).length\n \n // 性别统计\n const maleCount = members.filter(m => m.gender === 'MALE').length\n const femaleCount = members.filter(m => m.gender === 'FEMALE').length\n \n // 计算最大代数(处理空数组的情况)\n const generations = members.map(m => m.generation || 0)\n const maxGeneration = generations.length > 0 ? Math.max(...generations) : 0\n \n // 计算最早出生年份\n const birthYears = members\n .map(m => m.birthDate ? new Date(m.birthDate).getFullYear() : null)\n .filter(y => y !== null) as number[]\n const earliestYear = birthYears.length > 0 ? Math.min(...birthYears) : new Date().getFullYear()\n const yearsSpan = birthYears.length > 0 ? new Date().getFullYear() - earliestYear : 0\n \n // 计算平均寿命(只统计已故成员)\n const deceasedWithAge = members.filter(m => m.birthDate && m.deathDate)\n const totalAge = deceasedWithAge.reduce((sum, m) => {\n const birthYear = new Date(m.birthDate!).getFullYear()\n const deathYear = new Date(m.deathDate!).getFullYear()\n return sum + (deathYear - birthYear)\n }, 0)\n const averageLifespan = deceasedWithAge.length > 0 \n ? Math.round(totalAge / deceasedWithAge.length) \n : 0\n \n return {\n totalMembers,\n livingMembers,\n deceasedMembers,\n maleCount,\n femaleCount,\n maxGeneration,\n yearsSpan,\n earliestYear,\n averageLifespan\n }\n }, [treeData])\n \n // 获取最近的成员(按ID排序,取最新的5个)\n const recentMembers = useMemo(() => {\n return Object.values(treeData.members)\n .sort((a, b) => parseInt(b.id) - parseInt(a.id))\n .slice(0, 5)\n }, [treeData])\n \n // 获取本月纪念日(生日和忌日)\n const monthlyAnniversaries = useMemo(() => {\n const currentMonth = new Date().getMonth() + 1\n const members = Object.values(treeData.members)\n \n const anniversaries: Array<{\n member: any\n type: 'birth' | 'death'\n date: string\n day: number\n }> = []\n \n members.forEach(member => {\n // 检查生日\n if (member.birthDate) {\n const birthMonth = new Date(member.birthDate).getMonth() + 1\n const birthDay = new Date(member.birthDate).getDate()\n if (birthMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'birth',\n date: member.birthDate,\n day: birthDay\n })\n }\n }\n \n // 检查忌日\n if (member.deathDate) {\n const deathMonth = new Date(member.deathDate).getMonth() + 1\n const deathDay = new Date(member.deathDate).getDate()\n if (deathMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'death',\n date: member.deathDate,\n day: deathDay\n })\n }\n }\n })\n \n // 按日期排序\n return anniversaries.sort((a, b) => a.day - b.day).slice(0, 5)\n }, [treeData])\n return (\n
\n \n\n
\n
\n
\n
\n

\n {currentTree?.name || '家族族谱'}\n

\n {currentTree?.currentUserRole && (\n \n {currentTree.currentUserRole === 'OWNER' ? '所有者' : \n currentTree.currentUserRole === 'EDITOR' ? '编辑者' : '查看者'}\n \n )}\n
\n

\n {currentTree?.description || '记录家族历史,传承家族文化'}\n {stats.maxGeneration > 0 && ` · 第 ${stats.maxGeneration} 代传人`}\n

\n
\n
\n {session && currentTree?.ownerId === session.user?.id && (\n \n )}\n {(currentTree?.currentUserRole === \"OWNER\" || currentTree?.currentUserRole === \"EDITOR\") && (\n \n \n \n )}\n
\n
\n\n
\n } \n />\n } \n />\n } \n />\n 0 ? Math.round(stats.livingMembers / stats.totalMembers * 100) : 0}%`} \n icon={} \n />\n 0 ? `${stats.averageLifespan} 岁` : '暂无数据'} \n subtitle={`已统计 ${stats.deceasedMembers} 人`} \n icon={} \n />\n \n \n
\n

性别比例

\n
\n \n
\n
\n
\n
\n \n 1\n \n :\n \n {stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0'}\n \n
\n
\n 男性 : 女性\n
\n \n {/* 双色进度条 */}\n
\n
\n \n \n 男性 {stats.maleCount}\n \n \n 女性 {stats.femaleCount}\n \n \n
\n
\n
0 ? (stats.maleCount / stats.totalMembers * 100) : 0}%` }}\n >\n {stats.totalMembers > 0 && stats.maleCount > 0 && (\n \n {Math.round(stats.maleCount / stats.totalMembers * 100)}%\n \n )}\n
\n
0 ? (stats.femaleCount / stats.totalMembers * 100) : 0}%` }}\n >\n {stats.totalMembers > 0 && stats.femaleCount > 0 && (\n \n {Math.round(stats.femaleCount / stats.totalMembers * 100)}%\n \n )}\n
\n
\n
\n
\n
\n
\n \n
\n\n \n
\n \n 最近更新\n 近期纪念日\n 统计图表\n 迁徙记录\n \n \n \n \n
\n\n \n
\n \n \n 近期修谱动态\n 记录家族成员的最新变动与修订\n \n \n \n
\n {recentActivities.length > 0 ? (\n recentActivities.map((activity, i) => (\n
\n
\n
\n
\n
\n
\n
\n \n {activity.action === 'create' ? '创建' :\n activity.action === 'update' ? '更新' :\n activity.action === 'delete' ? '删除' : '导入'}\n \n {activity.entityName || '未知'}\n \n {format(new Date(activity.timestamp), 'MM-dd HH:mm')}\n \n
\n

\n {activity.action === 'create' && '新增了家族成员'}\n {activity.action === 'update' && '更新了成员信息'}\n {activity.action === 'delete' && '删除了成员'}\n {activity.action === 'import' && '导入了家族数据'}\n

\n
\n
\n ))\n ) : (\n
\n 暂无修谱记录\n
\n )}\n
\n
\n
\n
\n\n
\n \n \n \n \n 本月祭祖/纪念\n \n \n \n {monthlyAnniversaries.length > 0 ? (\n monthlyAnniversaries.map((anniversary, index) => {\n const yearsAgo = new Date().getFullYear() - new Date(anniversary.date).getFullYear()\n return (\n \n
\n
\n \n {new Date(anniversary.date).getMonth() + 1}月\n \n {anniversary.day}\n
\n
\n

\n {anniversary.member.fullName} {anniversary.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {anniversary.member.generation} 世 · 距今 {yearsAgo} 年\n {anniversary.type === 'death' && ' · 已故'}\n

\n
\n
\n \n )\n })\n ) : (\n
\n 本月暂无纪念日\n
\n )}\n
\n
\n
\n
\n
\n\n {/* 近期纪念日标签页 */}\n \n \n \n 近期纪念日\n 未来三个月内的生日和忌日\n \n \n
\n {(() => {\n const now = new Date()\n const threeMonthsLater = new Date(now.getFullYear(), now.getMonth() + 3, now.getDate())\n const members = Object.values(treeData.members)\n const upcomingEvents: Array<{\n member: any\n type: 'birth' | 'death'\n date: Date\n originalDate: string\n }> = []\n\n members.forEach(member => {\n // 生日\n if (member.birthDate) {\n const birthDate = new Date(member.birthDate)\n const thisYearBirth = new Date(now.getFullYear(), birthDate.getMonth(), birthDate.getDate())\n if (thisYearBirth >= now && thisYearBirth <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'birth',\n date: thisYearBirth,\n originalDate: member.birthDate\n })\n }\n }\n\n // 忌日\n if (member.deathDate) {\n const deathDate = new Date(member.deathDate)\n const thisYearDeath = new Date(now.getFullYear(), deathDate.getMonth(), deathDate.getDate())\n if (thisYearDeath >= now && thisYearDeath <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'death',\n date: thisYearDeath,\n originalDate: member.deathDate\n })\n }\n }\n })\n\n upcomingEvents.sort((a, b) => a.date.getTime() - b.date.getTime())\n\n return upcomingEvents.length > 0 ? (\n upcomingEvents.map((event, index) => {\n const yearsAgo = now.getFullYear() - new Date(event.originalDate).getFullYear()\n return (\n \n \n \n
\n
\n {event.date.getMonth() + 1}月\n {event.date.getDate()}\n
\n
\n

\n {event.member.fullName} {event.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {event.member.generation} 世 · {yearsAgo} 年\n {event.type === 'death' && ' · 已故'}\n

\n
\n
\n
\n
\n \n )\n })\n ) : (\n
\n 未来三个月暂无纪念日\n
\n )\n })()}\n
\n
\n
\n
\n\n {/* 统计图表标签页 */}\n \n \n \n\n {/* 迁徙记录标签页 */}\n \n \n \n 家族迁徙记录\n 记录家族成员的籍贯分布\n \n \n
\n {useMemo(() => {\n const members = Object.values(treeData.members)\n const locationGroups: Record = {}\n\n members.forEach(member => {\n if (member.ancestralHome) {\n if (!locationGroups[member.ancestralHome]) {\n locationGroups[member.ancestralHome] = []\n }\n locationGroups[member.ancestralHome].push(member)\n }\n })\n\n const sortedLocations = Object.entries(locationGroups)\n .sort((a, b) => b[1].length - a[1].length)\n\n return sortedLocations.length > 0 ? (\n sortedLocations.map(([location, locationMembers]) => (\n
\n
\n

{location}

\n \n {locationMembers.length} 人\n \n
\n
\n {locationMembers.map((member: any) => (\n \n
\n

{member.fullName}

\n

第 {member.generation} 世

\n
\n \n ))}\n
\n
\n ))\n ) : (\n
\n 暂无迁徙记录\n
\n )\n }, [treeData])}\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nfunction StatCard({\n title,\n value,\n subtitle,\n icon,\n}: { title: string; value: string; subtitle: string; icon: React.ReactNode }) {\n return (\n \n \n
\n

{title}

\n
\n {icon}\n
\n
\n
\n {value}\n

{subtitle}

\n
\n
\n
\n \n )\n}\n"],"names":[],"mappings":";;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAhBA;;;;;;;;;;;;;;;AA+Be,SAAS;IACtB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAA,iMAAS;IACtD,MAAM,EAAE,MAAM,OAAO,EAAE,GAAG,IAAA,qaAAU;IACpC,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,IAAA,uYAAQ,EAAgB,EAAE;IAE1E,YAAY;IACZ,IAAA,wYAAS,EAAC;QACR,IAAI,aAAa,MAAM,SAAS,MAAM,IAAI;YACxC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,uBAAuB,CAAC,EACxD,IAAI,CAAC,CAAA;gBACJ,IAAI,CAAC,IAAI,EAAE,EAAE;oBACX,MAAM,IAAI,MAAM;gBAClB;gBACA,OAAO,IAAI,IAAI;YACjB,GACC,IAAI,CAAC,CAAA;gBACJ,IAAI,KAAK,IAAI,EAAE;oBACb,oBAAoB,KAAK,IAAI;gBAC/B;YACF,GACC,KAAK,CAAC,CAAA;gBACL,QAAQ,KAAK,CAAC,aAAa;gBAC3B,oBAAoB,EAAE;YACxB;QACJ,OAAO;YACL,oBAAoB,EAAE;QACxB;IACF,GAAG;QAAC,aAAa;QAAI,SAAS,MAAM;KAAG;IAEvC,SAAS;IACT,MAAM,QAAQ,IAAA,sYAAO,EAAC;QACpB,MAAM,UAAU,OAAO,MAAM,CAAC,SAAS,OAAO;QAC9C,MAAM,eAAe,QAAQ,MAAM;QAEnC,UAAU;QACV,MAAM,gBAAgB,QAAQ,MAAM,CAAC,CAAA,IAAK,CAAC,EAAE,SAAS,EAAE,MAAM;QAC9D,MAAM,kBAAkB,QAAQ,MAAM,CAAC,CAAA,IAAK,EAAE,SAAS,EAAE,MAAM;QAE/D,OAAO;QACP,MAAM,YAAY,QAAQ,MAAM,CAAC,CAAA,IAAK,EAAE,MAAM,KAAK,QAAQ,MAAM;QACjE,MAAM,cAAc,QAAQ,MAAM,CAAC,CAAA,IAAK,EAAE,MAAM,KAAK,UAAU,MAAM;QAErE,mBAAmB;QACnB,MAAM,cAAc,QAAQ,GAAG,CAAC,CAAA,IAAK,EAAE,UAAU,IAAI;QACrD,MAAM,gBAAgB,YAAY,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI,eAAe;QAE1E,WAAW;QACX,MAAM,aAAa,QAChB,GAAG,CAAC,CAAA,IAAK,EAAE,SAAS,GAAG,IAAI,KAAK,EAAE,SAAS,EAAE,WAAW,KAAK,MAC7D,MAAM,CAAC,CAAA,IAAK,MAAM;QACrB,MAAM,eAAe,WAAW,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI,cAAc,IAAI,OAAO,WAAW;QAC7F,MAAM,YAAY,WAAW,MAAM,GAAG,IAAI,IAAI,OAAO,WAAW,KAAK,eAAe;QAEpF,kBAAkB;QAClB,MAAM,kBAAkB,QAAQ,MAAM,CAAC,CAAA,IAAK,EAAE,SAAS,IAAI,EAAE,SAAS;QACtE,MAAM,WAAW,gBAAgB,MAAM,CAAC,CAAC,KAAK;YAC5C,MAAM,YAAY,IAAI,KAAK,EAAE,SAAS,EAAG,WAAW;YACpD,MAAM,YAAY,IAAI,KAAK,EAAE,SAAS,EAAG,WAAW;YACpD,OAAO,MAAM,CAAC,YAAY,SAAS;QACrC,GAAG;QACH,MAAM,kBAAkB,gBAAgB,MAAM,GAAG,IAC7C,KAAK,KAAK,CAAC,WAAW,gBAAgB,MAAM,IAC5C;QAEJ,OAAO;YACL;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;QACF;IACF,GAAG;QAAC;KAAS;IAEb,wBAAwB;IACxB,MAAM,gBAAgB,IAAA,sYAAO,EAAC;QAC5B,OAAO,OAAO,MAAM,CAAC,SAAS,OAAO,EAClC,IAAI,CAAC,CAAC,GAAG,IAAM,SAAS,EAAE,EAAE,IAAI,SAAS,EAAE,EAAE,GAC7C,KAAK,CAAC,GAAG;IACd,GAAG;QAAC;KAAS;IAEb,iBAAiB;IACjB,MAAM,uBAAuB,IAAA,sYAAO,EAAC;QACnC,MAAM,eAAe,IAAI,OAAO,QAAQ,KAAK;QAC7C,MAAM,UAAU,OAAO,MAAM,CAAC,SAAS,OAAO;QAE9C,MAAM,gBAKD,EAAE;QAEP,QAAQ,OAAO,CAAC,CAAA;YACd,OAAO;YACP,IAAI,OAAO,SAAS,EAAE;gBACpB,MAAM,aAAa,IAAI,KAAK,OAAO,SAAS,EAAE,QAAQ,KAAK;gBAC3D,MAAM,WAAW,IAAI,KAAK,OAAO,SAAS,EAAE,OAAO;gBACnD,IAAI,eAAe,cAAc;oBAC/B,cAAc,IAAI,CAAC;wBACjB;wBACA,MAAM;wBACN,MAAM,OAAO,SAAS;wBACtB,KAAK;oBACP;gBACF;YACF;YAEA,OAAO;YACP,IAAI,OAAO,SAAS,EAAE;gBACpB,MAAM,aAAa,IAAI,KAAK,OAAO,SAAS,EAAE,QAAQ,KAAK;gBAC3D,MAAM,WAAW,IAAI,KAAK,OAAO,SAAS,EAAE,OAAO;gBACnD,IAAI,eAAe,cAAc;oBAC/B,cAAc,IAAI,CAAC;wBACjB;wBACA,MAAM;wBACN,MAAM,OAAO,SAAS;wBACtB,KAAK;oBACP;gBACF;YACF;QACF;QAEA,QAAQ;QACR,OAAO,cAAc,IAAI,CAAC,CAAC,GAAG,IAAM,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG;IAC9D,GAAG;QAAC;KAAS;IACb,qBACE,oaAAC;QAAI,WAAU;;0BACb,oaAAC,kMAAU;;;;;0BAEX,oaAAC;gBAAK,WAAU;;kCACd,oaAAC;wBAAI,WAAU;;0CACb,oaAAC;;kDACC,oaAAC;wCAAI,WAAU;;0DACb,oaAAC;gDAAG,WAAU;0DACX,aAAa,QAAQ;;;;;;4CAEvB,aAAa,iCACZ,oaAAC;gDAAK,WAAW,CAAC,8EAA8E,EAC9F,YAAY,eAAe,KAAK,UAC5B,oDACA,YAAY,eAAe,KAAK,WAChC,8CACA,6CACJ;0DACC,YAAY,eAAe,KAAK,UAAU,QAC1C,YAAY,eAAe,KAAK,WAAW,QAAQ;;;;;;;;;;;;kDAI1D,oaAAC;wCAAE,WAAU;;4CACV,aAAa,eAAe;4CAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,aAAa,CAAC,IAAI,CAAC;;;;;;;;;;;;;0CAGjE,oaAAC;gCAAI,WAAU;;oCACZ,WAAW,aAAa,YAAY,QAAQ,IAAI,EAAE,oBACjD,oaAAC,0NAAkB;;;;;oCAEpB,CAAC,aAAa,oBAAoB,WAAW,aAAa,oBAAoB,QAAQ,mBACrF,oaAAC,6VAAI;wCAAC,MAAK;kDACT,cAAA,oaAAC,4LAAM;4CAAC,WAAU;;8DAChB,oaAAC,qWAAQ;oDAAC,WAAU;;;;;;gDAAY;;;;;;;;;;;;;;;;;;;;;;;;kCAQ1C,oaAAC;wBAAI,WAAU;;0CACb,oaAAC;gCACC,OAAM;gCACN,OAAO,MAAM,YAAY,CAAC,QAAQ;gCAClC,UAAU,CAAC,EAAE,EAAE,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,WAAW,EAAE;gCACzD,oBAAM,oaAAC,wVAAK;oCAAC,WAAU;;;;;;;;;;;0CAEzB,oaAAC;gCACC,OAAM;gCACN,OAAO,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC;gCAC7B,UAAU,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC,EAAE,CAAC;gCACtC,oBAAM,oaAAC,wVAAK;oCAAC,WAAU;;;;;;;;;;;0CAEzB,oaAAC;gCACC,OAAM;gCACN,OAAO,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC;gCACjC,UAAU,CAAC,MAAM,CAAC;gCAClB,oBAAM,oaAAC,8VAAO;oCAAC,WAAU;;;;;;;;;;;0CAE3B,oaAAC;gCACC,OAAM;gCACN,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,eAAe,EAAE;gCAC1D,UAAU,CAAC,IAAI,EAAE,MAAM,YAAY,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,aAAa,GAAG,MAAM,YAAY,GAAG,OAAO,EAAE,CAAC,CAAC;gCAC3G,oBAAM,oaAAC,wVAAK;oCAAC,WAAU;;;;;;;;;;;0CAEzB,oaAAC;gCACC,OAAM;gCACN,OAAO,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,GAAG;gCAClE,UAAU,CAAC,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,CAAC;gCAC1C,oBAAM,oaAAC,wVAAK;oCAAC,WAAU;;;;;;;;;;;0CAEzB,oaAAC,wLAAI;gCAAC,WAAU;;kDACd,oaAAC,+LAAW;wCAAC,WAAU;;0DACrB,oaAAC;gDAAI,WAAU;;kEACb,oaAAC;wDAAE,WAAU;kEAAsE;;;;;;kEACnF,oaAAC;wDAAI,WAAU;kEACb,cAAA,oaAAC,wVAAK;4DAAC,WAAU;;;;;;;;;;;;;;;;;0DAGrB,oaAAC;gDAAI,WAAU;;kEACb,oaAAC;wDAAI,WAAU;;0EACb,oaAAC;gEAAK,WAAU;0EAA4D;;;;;;0EAG5E,oaAAC;gEAAK,WAAU;0EAA2C;;;;;;0EAC3D,oaAAC;gEAAK,WAAU;0EACb,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,WAAW,GAAG,MAAM,SAAS,EAAE,OAAO,CAAC,KAAK;;;;;;;;;;;;kEAG9E,oaAAC;wDAAI,WAAU;kEAAiE;;;;;;kEAKhF,oaAAC;wDAAI,WAAU;;0EACb,oaAAC;gEAAI,WAAU;;kFACb,oaAAC;wEAAK,WAAU;;0FACd,oaAAC;gFAAK,WAAU;;;;;;4EAA4C;4EACxD,MAAM,SAAS;;;;;;;kFAErB,oaAAC;wEAAK,WAAU;;4EAAsD;4EAChE,MAAM,WAAW;0FACrB,oaAAC;gFAAK,WAAU;;;;;;;;;;;;;;;;;;0EAGpB,oaAAC;gEAAI,WAAU;;kFACb,oaAAC;wEACC,WAAU;wEACV,OAAO;4EAAE,OAAO,GAAG,MAAM,YAAY,GAAG,IAAK,MAAM,SAAS,GAAG,MAAM,YAAY,GAAG,MAAO,EAAE,CAAC,CAAC;wEAAC;kFAE/F,MAAM,YAAY,GAAG,KAAK,MAAM,SAAS,GAAG,mBAC3C,oaAAC;4EAAK,WAAU;;gFACb,KAAK,KAAK,CAAC,MAAM,SAAS,GAAG,MAAM,YAAY,GAAG;gFAAK;;;;;;;;;;;;kFAI9D,oaAAC;wEACC,WAAU;wEACV,OAAO;4EAAE,OAAO,GAAG,MAAM,YAAY,GAAG,IAAK,MAAM,WAAW,GAAG,MAAM,YAAY,GAAG,MAAO,EAAE,CAAC,CAAC;wEAAC;kFAEjG,MAAM,YAAY,GAAG,KAAK,MAAM,WAAW,GAAG,mBAC7C,oaAAC;4EAAK,WAAU;;gFACb,KAAK,KAAK,CAAC,MAAM,WAAW,GAAG,MAAM,YAAY,GAAG;gFAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDAQxE,oaAAC;wCAAI,WAAU;;;;;;;;;;;;;;;;;;kCAInB,oaAAC,wLAAI;wBAAC,cAAa;wBAAS,WAAU;;0CACpC,oaAAC;gCAAI,WAAU;;kDACb,oaAAC,4LAAQ;wCAAC,WAAU;;0DAClB,oaAAC,+LAAW;gDAAC,OAAM;0DAAS;;;;;;0DAC5B,oaAAC,+LAAW;gDAAC,OAAM;0DAAgB;;;;;;0DACnC,oaAAC,+LAAW;gDAAC,OAAM;0DAAa;;;;;;0DAChC,oaAAC,+LAAW;gDAAC,OAAM;0DAAY;;;;;;;;;;;;kDAEjC,oaAAC,6VAAI;wCAAC,MAAK;kDACT,cAAA,oaAAC,4LAAM;4CAAC,SAAQ;4CAAQ,MAAK;4CAAK,WAAU;;gDAA8B;8DACnE,oaAAC,2WAAU;oDAAC,WAAU;;;;;;;;;;;;;;;;;;;;;;;0CAKjC,oaAAC,+LAAW;gCAAC,OAAM;gCAAS,WAAU;0CACpC,cAAA,oaAAC;oCAAI,WAAU;;sDACb,oaAAC,wLAAI;4CAAC,WAAU;;8DACd,oaAAC,8LAAU;;sEACT,oaAAC,6LAAS;4DAAC,WAAU;sEAAa;;;;;;sEAClC,oaAAC,mMAAe;sEAAC;;;;;;;;;;;;8DAEnB,oaAAC,+LAAW;8DACV,cAAA,oaAAC,wMAAU;wDAAC,WAAU;kEACpB,cAAA,oaAAC;4DAAI,WAAU;sEACZ,iBAAiB,MAAM,GAAG,IACzB,iBAAiB,GAAG,CAAC,CAAC,UAAU,kBAC9B,oaAAC;oEAAsB,WAAU;;sFAC/B,oaAAC;4EAAI,WAAU;;8FACb,oaAAC;oFAAI,WAAU;;;;;;8FACf,oaAAC;oFAAI,WAAW,CAAC,2DAA2D,EAC1E,SAAS,MAAM,KAAK,WAAW,iBAC/B,SAAS,MAAM,KAAK,WAAW,gBAC/B,SAAS,MAAM,KAAK,WAAW,eAC/B,iBACA;;;;;;;;;;;;sFAEJ,oaAAC;4EAAI,WAAU;;8FACb,oaAAC;oFAAI,WAAU;;sGACb,oaAAC;4FAAK,WAAW,CAAC,iCAAiC,EACjD,SAAS,MAAM,KAAK,WAAW,gCAC/B,SAAS,MAAM,KAAK,WAAW,8BAC/B,SAAS,MAAM,KAAK,WAAW,4BAC/B,iCACA;sGACC,SAAS,MAAM,KAAK,WAAW,OAC/B,SAAS,MAAM,KAAK,WAAW,OAC/B,SAAS,MAAM,KAAK,WAAW,OAAO;;;;;;sGAEzC,oaAAC;4FAAK,WAAU;sGAAe,SAAS,UAAU,IAAI;;;;;;sGACtD,oaAAC;4FAAK,WAAU;sGACb,IAAA,8QAAM,EAAC,IAAI,KAAK,SAAS,SAAS,GAAG;;;;;;;;;;;;8FAG1C,oaAAC;oFAAE,WAAU;;wFACV,SAAS,MAAM,KAAK,YAAY;wFAChC,SAAS,MAAM,KAAK,YAAY;wFAChC,SAAS,MAAM,KAAK,YAAY;wFAChC,SAAS,MAAM,KAAK,YAAY;;;;;;;;;;;;;;mEA/B7B,SAAS,EAAE;;;;0FAqCvB,oaAAC;gEAAI,WAAU;0EAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;sDASlE,oaAAC;4CAAI,WAAU;sDACb,cAAA,oaAAC,wLAAI;gDAAC,WAAU;;kEACd,oaAAC,8LAAU;kEACT,cAAA,oaAAC,6LAAS;4DAAC,WAAU;;8EACnB,oaAAC,iWAAQ;oEAAC,WAAU;;;;;;gEAAY;;;;;;;;;;;;kEAIpC,oaAAC,+LAAW;wDAAC,WAAU;kEACpB,qBAAqB,MAAM,GAAG,IAC7B,qBAAqB,GAAG,CAAC,CAAC,aAAa;4DACrC,MAAM,WAAW,IAAI,OAAO,WAAW,KAAK,IAAI,KAAK,YAAY,IAAI,EAAE,WAAW;4DAClF,qBACE,oaAAC,6VAAI;gEAAC,MAAM,CAAC,SAAS,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE;0EAC7C,cAAA,oaAAC;oEAAI,WAAU;;sFACb,oaAAC;4EAAI,WAAU;;8FACb,oaAAC;oFAAK,WAAU;;wFACb,IAAI,KAAK,YAAY,IAAI,EAAE,QAAQ,KAAK;wFAAE;;;;;;;8FAE7C,oaAAC;oFAAK,WAAU;8FAAqB,YAAY,GAAG;;;;;;;;;;;;sFAEtD,oaAAC;4EAAI,WAAU;;8FACb,oaAAC;oFAAE,WAAU;;wFACV,YAAY,MAAM,CAAC,QAAQ;wFAAC;wFAAE,YAAY,IAAI,KAAK,UAAU,OAAO;;;;;;;8FAEvE,oaAAC;oFAAE,WAAU;;wFAAgC;wFACxC,YAAY,MAAM,CAAC,UAAU;wFAAC;wFAAS;wFAAS;wFAClD,YAAY,IAAI,KAAK,WAAW;;;;;;;;;;;;;;;;;;;+DAda,GAAG,YAAY,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,IAAI,EAAE;;;;;wDAoBxG,mBAEA,oaAAC;4DAAI,WAAU;sEAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAW5E,oaAAC,+LAAW;gCAAC,OAAM;gCAAgB,WAAU;0CAC3C,cAAA,oaAAC,wLAAI;oCAAC,WAAU;;sDACd,oaAAC,8LAAU;;8DACT,oaAAC,6LAAS;oDAAC,WAAU;8DAAa;;;;;;8DAClC,oaAAC,mMAAe;8DAAC;;;;;;;;;;;;sDAEnB,oaAAC,+LAAW;sDACV,cAAA,oaAAC;gDAAI,WAAU;0DACZ,CAAC;oDACA,MAAM,MAAM,IAAI;oDAChB,MAAM,mBAAmB,IAAI,KAAK,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK,GAAG,IAAI,OAAO;oDACpF,MAAM,UAAU,OAAO,MAAM,CAAC,SAAS,OAAO;oDAC9C,MAAM,iBAKD,EAAE;oDAEP,QAAQ,OAAO,CAAC,CAAA;wDACd,KAAK;wDACL,IAAI,OAAO,SAAS,EAAE;4DACpB,MAAM,YAAY,IAAI,KAAK,OAAO,SAAS;4DAC3C,MAAM,gBAAgB,IAAI,KAAK,IAAI,WAAW,IAAI,UAAU,QAAQ,IAAI,UAAU,OAAO;4DACzF,IAAI,iBAAiB,OAAO,iBAAiB,kBAAkB;gEAC7D,eAAe,IAAI,CAAC;oEAClB;oEACA,MAAM;oEACN,MAAM;oEACN,cAAc,OAAO,SAAS;gEAChC;4DACF;wDACF;wDAEA,KAAK;wDACL,IAAI,OAAO,SAAS,EAAE;4DACpB,MAAM,YAAY,IAAI,KAAK,OAAO,SAAS;4DAC3C,MAAM,gBAAgB,IAAI,KAAK,IAAI,WAAW,IAAI,UAAU,QAAQ,IAAI,UAAU,OAAO;4DACzF,IAAI,iBAAiB,OAAO,iBAAiB,kBAAkB;gEAC7D,eAAe,IAAI,CAAC;oEAClB;oEACA,MAAM;oEACN,MAAM;oEACN,cAAc,OAAO,SAAS;gEAChC;4DACF;wDACF;oDACF;oDAEA,eAAe,IAAI,CAAC,CAAC,GAAG,IAAM,EAAE,IAAI,CAAC,OAAO,KAAK,EAAE,IAAI,CAAC,OAAO;oDAE/D,OAAO,eAAe,MAAM,GAAG,IAC7B,eAAe,GAAG,CAAC,CAAC,OAAO;wDACzB,MAAM,WAAW,IAAI,WAAW,KAAK,IAAI,KAAK,MAAM,YAAY,EAAE,WAAW;wDAC7E,qBACE,oaAAC,6VAAI;4DAAC,MAAM,CAAC,SAAS,EAAE,MAAM,MAAM,CAAC,EAAE,EAAE;sEACvC,cAAA,oaAAC,wLAAI;gEAAC,WAAU;0EACd,cAAA,oaAAC,+LAAW;oEAAC,WAAU;8EACrB,cAAA,oaAAC;wEAAI,WAAU;;0FACb,oaAAC;gFAAI,WAAU;;kGACb,oaAAC;wFAAK,WAAU;;4FAAW,MAAM,IAAI,CAAC,QAAQ,KAAK;4FAAE;;;;;;;kGACrD,oaAAC;wFAAK,WAAU;kGAAqB,MAAM,IAAI,CAAC,OAAO;;;;;;;;;;;;0FAEzD,oaAAC;gFAAI,WAAU;;kGACb,oaAAC;wFAAE,WAAU;;4FACV,MAAM,MAAM,CAAC,QAAQ;4FAAC;4FAAE,MAAM,IAAI,KAAK,UAAU,OAAO;;;;;;;kGAE3D,oaAAC;wFAAE,WAAU;;4FAAgC;4FACxC,MAAM,MAAM,CAAC,UAAU;4FAAC;4FAAM;4FAAS;4FACzC,MAAM,IAAI,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DAdS,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,OAAO;;;;;oDAsB/F,mBAEA,oaAAC;wDAAI,WAAU;kEAAwD;;;;;;gDAI3E,CAAC;;;;;;;;;;;;;;;;;;;;;;0CAOT,oaAAC,+LAAW;gCAAC,OAAM;gCAAa,WAAU;0CACxC,cAAA,oaAAC,2NAAgB;oCAAC,SAAS,OAAO,MAAM,CAAC,SAAS,OAAO;;;;;;;;;;;0CAI3D,oaAAC,+LAAW;gCAAC,OAAM;gCAAY,WAAU;0CACvC,cAAA,oaAAC,wLAAI;oCAAC,WAAU;;sDACd,oaAAC,8LAAU;;8DACT,oaAAC,6LAAS;oDAAC,WAAU;8DAAa;;;;;;8DAClC,oaAAC,mMAAe;8DAAC;;;;;;;;;;;;sDAEnB,oaAAC,+LAAW;sDACV,cAAA,oaAAC;gDAAI,WAAU;0DACZ,IAAA,sYAAO,EAAC;oDACP,MAAM,UAAU,OAAO,MAAM,CAAC,SAAS,OAAO;oDAC9C,MAAM,iBAAwC,CAAC;oDAE/C,QAAQ,OAAO,CAAC,CAAA;wDACd,IAAI,OAAO,aAAa,EAAE;4DACxB,IAAI,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,EAAE;gEACzC,cAAc,CAAC,OAAO,aAAa,CAAC,GAAG,EAAE;4DAC3C;4DACA,cAAc,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC;wDAC5C;oDACF;oDAEA,MAAM,kBAAkB,OAAO,OAAO,CAAC,gBACpC,IAAI,CAAC,CAAC,GAAG,IAAM,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM;oDAE3C,OAAO,gBAAgB,MAAM,GAAG,IAC9B,gBAAgB,GAAG,CAAC,CAAC,CAAC,UAAU,gBAAgB,iBAC9C,oaAAC;4DAAmB,WAAU;;8EAC5B,oaAAC;oEAAI,WAAU;;sFACb,oaAAC;4EAAG,WAAU;sFAAgC;;;;;;sFAC9C,oaAAC;4EAAK,WAAU;;gFACb,gBAAgB,MAAM;gFAAC;;;;;;;;;;;;;8EAG5B,oaAAC;oEAAI,WAAU;8EACZ,gBAAgB,GAAG,CAAC,CAAC,uBACpB,oaAAC,6VAAI;4EAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;sFACjC,cAAA,oaAAC;gFAAI,WAAU;;kGACb,oaAAC;wFAAE,WAAU;kGAAgC,OAAO,QAAQ;;;;;;kGAC5D,oaAAC;wFAAE,WAAU;;4FAAgC;4FAAG,OAAO,UAAU;4FAAC;;;;;;;;;;;;;2EAH5B,OAAO,EAAE;;;;;;;;;;;2DAT/C;;;;kFAoBZ,oaAAC;wDAAI,WAAU;kEAA0C;;;;;;gDAI7D,GAAG;oDAAC;iDAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAS/B;AAEA,SAAS,SAAS,EAChB,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACsE;IAC1E,qBACE,oaAAC,wLAAI;QAAC,WAAU;;0BACd,oaAAC,+LAAW;gBAAC,WAAU;;kCACrB,oaAAC;wBAAI,WAAU;;0CACb,oaAAC;gCAAE,WAAU;0CAAuE;;;;;;0CACpF,oaAAC;gCAAI,WAAU;0CACZ;;;;;;;;;;;;kCAGL,oaAAC;wBAAI,WAAU;;0CACb,oaAAC;gCAAK,WAAU;0CAAgE;;;;;;0CAChF,oaAAC;gCAAE,WAAU;0CAAgD;;;;;;;;;;;;;;;;;;0BAGjE,oaAAC;gBAAI,WAAU;;;;;;;;;;;;AAGrB"}}] + {"offset": {"line": 2877, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\nimport Link from \"next/link\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { UserPlus, Network, Map, Calendar, Users, ArrowRight, Clock, Search, BookOpen, BarChart3, Calculator } from \"lucide-react\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useMemo, useState, useEffect, useRef } from \"react\"\nimport { StatisticsCharts } from \"@/components/dashboard/statistics-charts\"\nimport { format } from \"date-fns\"\nimport { useSession } from \"next-auth/react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { CollaboratorDialog } from \"@/components/tree/collaborator-dialog\"\n\ninterface ActivityLog {\n id: string\n action: string\n entityType: string\n entityId?: string | null\n entityName?: string | null\n timestamp: string\n user?: {\n name?: string | null\n email?: string | null\n }\n}\n\nexport default function DashboardPage() {\n const { treeData, isLoading, currentTree } = useFamily()\n const { data: session } = useSession()\n const [recentActivities, setRecentActivities] = useState([])\n \n // 加载最近的操作日志\n useEffect(() => {\n if (currentTree?.id && session?.user?.id) {\n fetch(`/api/trees/${currentTree.id}/activity-logs?limit=10`)\n .then(res => {\n if (!res.ok) {\n throw new Error('获取活动日志失败')\n }\n return res.json()\n })\n .then(data => {\n if (data.logs) {\n setRecentActivities(data.logs)\n }\n })\n .catch(err => {\n console.error('获取活动日志失败:', err)\n setRecentActivities([])\n })\n } else {\n setRecentActivities([])\n }\n }, [currentTree?.id, session?.user?.id])\n \n // 计算统计数据\n const stats = useMemo(() => {\n const members = Object.values(treeData.members)\n const totalMembers = members.length\n \n // 在世和已故人数\n const livingMembers = members.filter(m => !m.deathDate).length\n const deceasedMembers = members.filter(m => m.deathDate).length\n \n // 性别统计\n const maleCount = members.filter(m => m.gender === 'MALE').length\n const femaleCount = members.filter(m => m.gender === 'FEMALE').length\n \n // 计算最大代数(处理空数组的情况)\n const generations = members.map(m => m.generation || 0)\n const maxGeneration = generations.length > 0 ? Math.max(...generations) : 0\n \n // 计算最早出生年份\n const birthYears = members\n .map(m => m.birthDate ? new Date(m.birthDate).getFullYear() : null)\n .filter(y => y !== null) as number[]\n const earliestYear = birthYears.length > 0 ? Math.min(...birthYears) : new Date().getFullYear()\n const yearsSpan = birthYears.length > 0 ? new Date().getFullYear() - earliestYear : 0\n \n // 计算平均寿命(只统计已故成员)\n const deceasedWithAge = members.filter(m => m.birthDate && m.deathDate)\n const totalAge = deceasedWithAge.reduce((sum, m) => {\n const birthYear = new Date(m.birthDate!).getFullYear()\n const deathYear = new Date(m.deathDate!).getFullYear()\n return sum + (deathYear - birthYear)\n }, 0)\n const averageLifespan = deceasedWithAge.length > 0 \n ? Math.round(totalAge / deceasedWithAge.length) \n : 0\n \n return {\n totalMembers,\n livingMembers,\n deceasedMembers,\n maleCount,\n femaleCount,\n maxGeneration,\n yearsSpan,\n earliestYear,\n averageLifespan\n }\n }, [treeData])\n \n // 获取最近的成员(按ID排序,取最新的5个)\n const recentMembers = useMemo(() => {\n return Object.values(treeData.members)\n .sort((a, b) => parseInt(b.id) - parseInt(a.id))\n .slice(0, 5)\n }, [treeData])\n \n // 获取本月纪念日(生日和忌日)\n const monthlyAnniversaries = useMemo(() => {\n const currentMonth = new Date().getMonth() + 1\n const members = Object.values(treeData.members)\n \n const anniversaries: Array<{\n member: any\n type: 'birth' | 'death'\n date: string\n day: number\n }> = []\n \n members.forEach(member => {\n // 检查生日\n if (member.birthDate) {\n const birthMonth = new Date(member.birthDate).getMonth() + 1\n const birthDay = new Date(member.birthDate).getDate()\n if (birthMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'birth',\n date: member.birthDate,\n day: birthDay\n })\n }\n }\n \n // 检查忌日\n if (member.deathDate) {\n const deathMonth = new Date(member.deathDate).getMonth() + 1\n const deathDay = new Date(member.deathDate).getDate()\n if (deathMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'death',\n date: member.deathDate,\n day: deathDay\n })\n }\n }\n })\n \n // 按日期排序\n return anniversaries.sort((a, b) => a.day - b.day).slice(0, 5)\n }, [treeData])\n return (\n
\n \n\n
\n
\n
\n
\n

\n {currentTree?.name || '家族族谱'}\n

\n {currentTree?.currentUserRole && (\n \n {currentTree.currentUserRole === 'OWNER' ? '所有者' : \n currentTree.currentUserRole === 'EDITOR' ? '编辑者' : '查看者'}\n \n )}\n
\n

\n {currentTree?.description || '记录家族历史,传承家族文化'}\n {stats.maxGeneration > 0 && ` · 第 ${stats.maxGeneration} 代传人`}\n

\n
\n
\n {session && currentTree?.ownerId === session.user?.id && (\n \n )}\n {(currentTree?.currentUserRole === \"OWNER\" || currentTree?.currentUserRole === \"EDITOR\") && (\n \n \n \n )}\n
\n
\n\n
\n } \n />\n } \n />\n } \n />\n 0 ? Math.round(stats.livingMembers / stats.totalMembers * 100) : 0}%`} \n icon={} \n />\n 0 ? `${stats.averageLifespan} 岁` : '暂无数据'} \n subtitle={`已统计 ${stats.deceasedMembers} 人`} \n icon={} \n />\n \n \n
\n

性别比例

\n
\n \n
\n
\n
\n
\n 1\n :\n \n {stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0'}\n \n
\n
\n 男性 {stats.maleCount} · 女性 {stats.femaleCount}\n
\n
\n
\n
\n \n
\n\n \n
\n \n 最近更新\n 近期纪念日\n 统计图表\n 迁徙记录\n \n \n \n \n
\n\n \n
\n \n \n 近期修谱动态\n 记录家族成员的最新变动与修订\n \n \n \n
\n {recentActivities.length > 0 ? (\n recentActivities.map((activity, i) => (\n
\n
\n
\n
\n
\n
\n
\n \n {activity.action === 'create' ? '创建' :\n activity.action === 'update' ? '更新' :\n activity.action === 'delete' ? '删除' : '导入'}\n \n {activity.entityName || '未知'}\n \n {format(new Date(activity.timestamp), 'MM-dd HH:mm')}\n \n
\n

\n {activity.action === 'create' && '新增了家族成员'}\n {activity.action === 'update' && '更新了成员信息'}\n {activity.action === 'delete' && '删除了成员'}\n {activity.action === 'import' && '导入了家族数据'}\n

\n
\n
\n ))\n ) : (\n
\n 暂无修谱记录\n
\n )}\n
\n
\n
\n
\n\n
\n \n \n \n \n 本月祭祖/纪念\n \n \n \n {monthlyAnniversaries.length > 0 ? (\n monthlyAnniversaries.map((anniversary, index) => {\n const yearsAgo = new Date().getFullYear() - new Date(anniversary.date).getFullYear()\n return (\n \n
\n
\n \n {new Date(anniversary.date).getMonth() + 1}月\n \n {anniversary.day}\n
\n
\n

\n {anniversary.member.fullName} {anniversary.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {anniversary.member.generation} 世 · 距今 {yearsAgo} 年\n {anniversary.type === 'death' && ' · 已故'}\n

\n
\n
\n \n )\n })\n ) : (\n
\n 本月暂无纪念日\n
\n )}\n
\n
\n
\n
\n
\n\n {/* 近期纪念日标签页 */}\n \n \n \n 近期纪念日\n 未来三个月内的生日和忌日\n \n \n
\n {(() => {\n const now = new Date()\n const threeMonthsLater = new Date(now.getFullYear(), now.getMonth() + 3, now.getDate())\n const members = Object.values(treeData.members)\n const upcomingEvents: Array<{\n member: any\n type: 'birth' | 'death'\n date: Date\n originalDate: string\n }> = []\n\n members.forEach(member => {\n // 生日\n if (member.birthDate) {\n const birthDate = new Date(member.birthDate)\n const thisYearBirth = new Date(now.getFullYear(), birthDate.getMonth(), birthDate.getDate())\n if (thisYearBirth >= now && thisYearBirth <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'birth',\n date: thisYearBirth,\n originalDate: member.birthDate\n })\n }\n }\n\n // 忌日\n if (member.deathDate) {\n const deathDate = new Date(member.deathDate)\n const thisYearDeath = new Date(now.getFullYear(), deathDate.getMonth(), deathDate.getDate())\n if (thisYearDeath >= now && thisYearDeath <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'death',\n date: thisYearDeath,\n originalDate: member.deathDate\n })\n }\n }\n })\n\n upcomingEvents.sort((a, b) => a.date.getTime() - b.date.getTime())\n\n return upcomingEvents.length > 0 ? (\n upcomingEvents.map((event, index) => {\n const yearsAgo = now.getFullYear() - new Date(event.originalDate).getFullYear()\n return (\n \n \n \n
\n
\n {event.date.getMonth() + 1}月\n {event.date.getDate()}\n
\n
\n

\n {event.member.fullName} {event.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {event.member.generation} 世 · {yearsAgo} 年\n {event.type === 'death' && ' · 已故'}\n

\n
\n
\n
\n
\n \n )\n })\n ) : (\n
\n 未来三个月暂无纪念日\n
\n )\n })()}\n
\n
\n
\n
\n\n {/* 统计图表标签页 */}\n \n \n \n\n {/* 迁徙记录标签页 */}\n \n \n \n 家族迁徙记录\n 记录家族成员的籍贯分布\n \n \n
\n {useMemo(() => {\n const members = Object.values(treeData.members)\n const locationGroups: Record = {}\n\n members.forEach(member => {\n if (member.ancestralHome) {\n if (!locationGroups[member.ancestralHome]) {\n locationGroups[member.ancestralHome] = []\n }\n locationGroups[member.ancestralHome].push(member)\n }\n })\n\n const sortedLocations = Object.entries(locationGroups)\n .sort((a, b) => b[1].length - a[1].length)\n\n return sortedLocations.length > 0 ? (\n sortedLocations.map(([location, locationMembers]) => (\n
\n
\n

{location}

\n \n {locationMembers.length} 人\n \n
\n
\n {locationMembers.map((member: any) => (\n \n
\n

{member.fullName}

\n

第 {member.generation} 世

\n
\n \n ))}\n
\n
\n ))\n ) : (\n
\n 暂无迁徙记录\n
\n )\n }, [treeData])}\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nfunction StatCard({\n title,\n value,\n subtitle,\n icon,\n}: { title: string; value: string; subtitle: string; icon: React.ReactNode }) {\n return (\n \n \n
\n

{title}

\n
\n {icon}\n
\n
\n
\n {value}\n

{subtitle}

\n
\n
\n
\n \n )\n}\n"],"names":[],"mappings":"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"}}] } \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js index 869d6043..727d355f 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js @@ -588,7 +588,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map index 364848e3..a2dd535a 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map @@ -4,7 +4,7 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,oaAAC,ybAAwB;QACvB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf"}}, {"offset": {"line": 57, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 332, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 332, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1221, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/db.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\"\nimport type { FamilyMember } from \"@/types/family\"\n\nexport interface GlobalSettings {\n key: string\n value: any\n}\n\nexport interface StoredImage {\n id: string\n blob: Blob\n mimeType: string\n createdAt: string\n}\n\nexport interface ActivityLog {\n id: string\n action: \"create\" | \"update\" | \"delete\" | \"import\" | \"export\"\n entityType: \"member\" | \"photo\" | \"story\" | \"settings\"\n entityId?: string\n entityName?: string\n changes?: any\n timestamp: string\n userId?: string\n userName?: string\n}\n\nexport class FamilyTreeDB extends Dexie {\n members!: Table\n settings!: Table\n images!: Table\n activityLogs!: Table\n\n constructor() {\n super(\"FamilyTreeDB\")\n this.version(1).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n })\n this.version(2).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n activityLogs: \"id, timestamp, action, entityType, entityId\",\n })\n }\n}\n\nexport const db = new FamilyTreeDB()\n"],"names":[],"mappings":";;;;;;AAAA;;AA2BO,MAAM,qBAAqB,+PAAK;IACrC,QAA6B;IAC7B,SAAgC;IAChC,OAA2B;IAC3B,aAAiC;IAEjC,aAAc;QACZ,KAAK,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;QACV;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;YACR,cAAc;QAChB;IACF;AACF;AAEO,MAAM,KAAK,IAAI"}}, {"offset": {"line": 1254, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { db } from '@/lib/db'\n\n// 全局图片缓存\nconst avatarCache = new Map()\n\nexport function useAvatarCache(avatarImageId?: string) {\n const [avatarUrl, setAvatarUrl] = useState(\n avatarImageId ? avatarCache.get(avatarImageId) : undefined\n )\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n if (!avatarImageId) {\n setAvatarUrl(undefined)\n return\n }\n\n // 如果缓存中已存在,直接使用\n const cached = avatarCache.get(avatarImageId)\n if (cached) {\n setAvatarUrl(cached)\n return\n }\n\n // 从数据库加载\n let isMounted = true\n setIsLoading(true)\n\n db.images\n .get(avatarImageId)\n .then((image) => {\n if (image && isMounted) {\n const url = URL.createObjectURL(image.blob)\n avatarCache.set(avatarImageId, url)\n setAvatarUrl(url)\n }\n })\n .catch((error) => {\n console.error('Failed to load avatar:', error)\n })\n .finally(() => {\n if (isMounted) {\n setIsLoading(false)\n }\n })\n\n return () => {\n isMounted = false\n }\n }, [avatarImageId])\n\n return { avatarUrl, isLoading }\n}\n\n// 清理缓存的工具函数(可选)\nexport function clearAvatarCache() {\n avatarCache.forEach((url) => URL.revokeObjectURL(url))\n avatarCache.clear()\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;;;AAEA,SAAS;AACT,MAAM,cAAc,IAAI;AAEjB,SAAS,eAAe,aAAsB;IACnD,MAAM,CAAC,WAAW,aAAa,GAAG,IAAA,uYAAQ,EACxC,gBAAgB,YAAY,GAAG,CAAC,iBAAiB;IAEnD,MAAM,CAAC,WAAW,aAAa,GAAG,IAAA,uYAAQ,EAAC;IAE3C,IAAA,wYAAS,EAAC;QACR,IAAI,CAAC,eAAe;YAClB,aAAa;YACb;QACF;QAEA,gBAAgB;QAChB,MAAM,SAAS,YAAY,GAAG,CAAC;QAC/B,IAAI,QAAQ;YACV,aAAa;YACb;QACF;QAEA,SAAS;QACT,IAAI,YAAY;QAChB,aAAa;QAEb,sKAAE,CAAC,MAAM,CACN,GAAG,CAAC,eACJ,IAAI,CAAC,CAAC;YACL,IAAI,SAAS,WAAW;gBACtB,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;gBAC1C,YAAY,GAAG,CAAC,eAAe;gBAC/B,aAAa;YACf;QACF,GACC,KAAK,CAAC,CAAC;YACN,QAAQ,KAAK,CAAC,0BAA0B;QAC1C,GACC,OAAO,CAAC;YACP,IAAI,WAAW;gBACb,aAAa;YACf;QACF;QAEF,OAAO;YACL,YAAY;QACd;IACF,GAAG;QAAC;KAAc;IAElB,OAAO;QAAE;QAAW;IAAU;AAChC;AAGO,SAAS;IACd,YAAY,OAAO,CAAC,CAAC,MAAQ,IAAI,eAAe,CAAC;IACjD,YAAY,KAAK;AACnB"}}, {"offset": {"line": 1315, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx"],"sourcesContent":["\"use client\"\n\nimport type { FamilyMember } from \"@/types/family\"\nimport { cn } from \"@/lib/utils\"\nimport { useAvatarCache } from \"@/hooks/use-avatar-cache\"\nimport { CircleUser, CircleUserRound, Heart } from \"lucide-react\"\n\ninterface FamilyNodeProps {\n member: FamilyMember\n spouse?: FamilyMember\n spouses?: FamilyMember[]\n isRoot?: boolean\n onSelect?: (member: FamilyMember) => void\n isHighlighted?: boolean\n relationMode?: boolean\n isSelected?: boolean\n}\n\n// 格式化日期显示(只显示年份)\nfunction formatYear(dateString?: string): string {\n if (!dateString) return ''\n const year = dateString.split('-')[0]\n return year\n}\n\n// 计算年龄\nfunction calculateAge(birthDate?: string, deathDate?: string): number | null {\n if (!birthDate) return null\n \n const birth = new Date(birthDate)\n const end = deathDate ? new Date(deathDate) : new Date()\n \n let age = end.getFullYear() - birth.getFullYear()\n const monthDiff = end.getMonth() - birth.getMonth()\n \n if (monthDiff < 0 || (monthDiff === 0 && end.getDate() < birth.getDate())) {\n age--\n }\n \n return age\n}\n\n// 单个人员卡片组件\nfunction PersonCard({ member, isRoot, isSpouse, onSelect, isHighlighted, relationMode, isSelected }: { member: FamilyMember; isRoot?: boolean; isSpouse?: boolean; onSelect?: (member: FamilyMember) => void; isHighlighted?: boolean; relationMode?: boolean; isSelected?: boolean }) {\n const { avatarUrl: avatarBlobUrl } = useAvatarCache(member?.avatarImageId)\n \n const birthYear = formatYear(member.birthDate)\n const deathYear = formatYear(member.deathDate)\n const age = calculateAge(member.birthDate, member.deathDate)\n \n const lifeSpan = birthYear\n ? deathYear\n ? `${birthYear}-${deathYear}`\n : `${birthYear}-`\n : ''\n \n const ageText = age !== null\n ? member.deathDate\n ? `享年${age}岁`\n : `${age}岁`\n : ''\n \n return (\n onSelect?.(member)}\n >\n
\n {member.generation}世\n
\n\n
\n {avatarBlobUrl ? (\n \n ) : (\n member.gender === 'FEMALE' ? (\n \n ) : (\n \n )\n )}\n
\n\n
\n
{member.surname} {member.givenName}
\n {member.courtesyName && (\n
字 {member.courtesyName}
\n )}\n {lifeSpan && (\n
\n {lifeSpan}\n
\n )}\n {ageText && (\n
\n {ageText}\n
\n )}\n {member.phone && (\n
\n 📱 {member.phone}\n
\n )}\n
\n\n {member.deathDate && (\n
\n )}\n
\n )\n}\n\nexport function FamilyNode({ member, spouse, spouses, isRoot, onSelect, isHighlighted, relationMode, isSelected }: FamilyNodeProps) {\n // 优先使用 spouses 数组,如果没有则使用单个 spouse\n const spouseList = spouses || (spouse ? [spouse] : [])\n \n if (spouseList.length === 0) {\n return \n }\n \n // 有配偶时,并排显示所有配偶\n return (\n
\n \n {spouseList.map((spouseMember, index) => (\n
\n \n \n
\n ))}\n
\n )\n}\n"],"names":[],"mappings":"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"}}, diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js b/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js index f1f2f10e..ae014da8 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js @@ -244,14 +244,14 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$ch ; ; const metadata = { - title: "华夏谱 (HuaXiaPu) - 家族树管理系统", - description: "现代中国家族树管理系统", + title: "华夏家谱 - 中国家族树管理系统", + description: "现代化的中国家族树管理系统,支持多用户协作、权限管理、数据导入导出等功能", generator: "v0.app", manifest: "/manifest.json", appleWebApp: { capable: true, statusBarStyle: "default", - title: "华夏谱" + title: "华夏家谱" }, icons: { icon: [ diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js.map b/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js.map index cb1136ff..9c0df482 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js.map +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__b37c7274._.js.map @@ -18,7 +18,7 @@ {"offset": {"line": 176, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const DialogProvider = registerClientReference(\n function() { throw new Error(\"Attempted to call DialogProvider() from the server but DialogProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx \",\n \"DialogProvider\",\n);\nexport const useDialog = registerClientReference(\n function() { throw new Error(\"Attempted to call useDialog() from the server but useDialog is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx \",\n \"useDialog\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;;;AACvE;;AACO,MAAM,iBAAiB,IAAA,8bAAuB,EACjD;IAAa,MAAM,IAAI,MAAM;AAA4O,GACzQ,4GACA;AAEG,MAAM,YAAY,IAAA,8bAAuB,EAC5C;IAAa,MAAM,IAAI,MAAM;AAAkO,GAC/P,4GACA","ignoreList":[0]}}, {"offset": {"line": 195, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const DialogProvider = registerClientReference(\n function() { throw new Error(\"Attempted to call DialogProvider() from the server but DialogProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx\",\n \"DialogProvider\",\n);\nexport const useDialog = registerClientReference(\n function() { throw new Error(\"Attempted to call useDialog() from the server but useDialog is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx\",\n \"useDialog\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;;;AACvE;;AACO,MAAM,iBAAiB,IAAA,8bAAuB,EACjD;IAAa,MAAM,IAAI,MAAM;AAA4O,GACzQ,wFACA;AAEG,MAAM,YAAY,IAAA,8bAAuB,EAC5C;IAAa,MAAM,IAAI,MAAM;AAAkO,GAC/P,wFACA","ignoreList":[0]}}, {"offset": {"line": 214, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}, - {"offset": {"line": 222, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/layout.tsx"],"sourcesContent":["import type React from \"react\"\nimport type { Metadata } from \"next\"\nimport { Geist, Geist_Mono } from \"next/font/google\"\nimport { Analytics } from \"@vercel/analytics/next\"\nimport \"./globals.css\"\nimport { FamilyProvider } from \"@/context/family-context\"\nimport { PWAProvider } from \"@/components/pwa/pwa-provider\"\nimport { SessionProvider } from \"@/components/providers/session-provider\"\nimport { DialogProvider } from \"@/components/ui/alert-dialog-custom\"\n\nconst _geist = Geist({ subsets: [\"latin\"] })\nconst _geistMono = Geist_Mono({ subsets: [\"latin\"] })\n\nexport const metadata: Metadata = {\n title: \"华夏谱 (HuaXiaPu) - 家族树管理系统\",\n description: \"现代中国家族树管理系统\",\n generator: \"v0.app\",\n manifest: \"/manifest.json\",\n appleWebApp: {\n capable: true,\n statusBarStyle: \"default\",\n title: \"华夏谱\",\n },\n icons: {\n icon: [\n {\n url: \"/icon-light-32x32.png\",\n media: \"(prefers-color-scheme: light)\",\n },\n {\n url: \"/icon-dark-32x32.png\",\n media: \"(prefers-color-scheme: dark)\",\n },\n {\n url: \"/icon.svg\",\n type: \"image/svg+xml\",\n },\n ],\n apple: \"/apple-icon.png\",\n },\n}\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode\n}>) {\n return (\n \n \n \n \n \n \n {children}\n \n \n \n \n \n \n \n )\n}\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AACA;AACA;AACA;;;;;;;;;;AAKO,MAAM,WAAqB;IAChC,OAAO;IACP,aAAa;IACb,WAAW;IACX,UAAU;IACV,aAAa;QACX,SAAS;QACT,gBAAgB;QAChB,OAAO;IACT;IACA,OAAO;QACL,MAAM;YACJ;gBACE,KAAK;gBACL,OAAO;YACT;YACA;gBACE,KAAK;gBACL,OAAO;YACT;YACA;gBACE,KAAK;gBACL,MAAM;YACR;SACD;QACD,OAAO;IACT;AACF;AAEe,SAAS,WAAW,EACjC,QAAQ,EAGR;IACA,qBACE,oaAAC;QAAK,MAAK;kBACT,cAAA,oaAAC;YAAK,WAAW,CAAC,qBAAqB,CAAC;;8BACtC,oaAAC,yNAAe;8BACd,cAAA,oaAAC,uNAAc;kCACb,cAAA,oaAAC,sMAAc;sCACb,cAAA,oaAAC,2MAAW;0CACT;;;;;;;;;;;;;;;;;;;;;8BAKT,oaAAC,iaAAS;;;;;;;;;;;;;;;;AAIlB"}}, + {"offset": {"line": 222, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/layout.tsx"],"sourcesContent":["import type React from \"react\"\nimport type { Metadata } from \"next\"\nimport { Geist, Geist_Mono } from \"next/font/google\"\nimport { Analytics } from \"@vercel/analytics/next\"\nimport \"./globals.css\"\nimport { FamilyProvider } from \"@/context/family-context\"\nimport { PWAProvider } from \"@/components/pwa/pwa-provider\"\nimport { SessionProvider } from \"@/components/providers/session-provider\"\nimport { DialogProvider } from \"@/components/ui/alert-dialog-custom\"\n\nconst _geist = Geist({ subsets: [\"latin\"] })\nconst _geistMono = Geist_Mono({ subsets: [\"latin\"] })\n\nexport const metadata: Metadata = {\n title: \"华夏家谱 - 中国家族树管理系统\",\n description: \"现代化的中国家族树管理系统,支持多用户协作、权限管理、数据导入导出等功能\",\n generator: \"v0.app\",\n manifest: \"/manifest.json\",\n appleWebApp: {\n capable: true,\n statusBarStyle: \"default\",\n title: \"华夏家谱\",\n },\n icons: {\n icon: [\n {\n url: \"/icon-light-32x32.png\",\n media: \"(prefers-color-scheme: light)\",\n },\n {\n url: \"/icon-dark-32x32.png\",\n media: \"(prefers-color-scheme: dark)\",\n },\n {\n url: \"/icon.svg\",\n type: \"image/svg+xml\",\n },\n ],\n apple: \"/apple-icon.png\",\n },\n}\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode\n}>) {\n return (\n \n \n \n \n \n \n {children}\n \n \n \n \n \n \n \n )\n}\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AACA;AACA;AACA;;;;;;;;;;AAKO,MAAM,WAAqB;IAChC,OAAO;IACP,aAAa;IACb,WAAW;IACX,UAAU;IACV,aAAa;QACX,SAAS;QACT,gBAAgB;QAChB,OAAO;IACT;IACA,OAAO;QACL,MAAM;YACJ;gBACE,KAAK;gBACL,OAAO;YACT;YACA;gBACE,KAAK;gBACL,OAAO;YACT;YACA;gBACE,KAAK;gBACL,MAAM;YACR;SACD;QACD,OAAO;IACT;AACF;AAEe,SAAS,WAAW,EACjC,QAAQ,EAGR;IACA,qBACE,oaAAC;QAAK,MAAK;kBACT,cAAA,oaAAC;YAAK,WAAW,CAAC,qBAAqB,CAAC;;8BACtC,oaAAC,yNAAe;8BACd,cAAA,oaAAC,uNAAc;kCACb,cAAA,oaAAC,sMAAc;sCACb,cAAA,oaAAC,2MAAW;0CACT;;;;;;;;;;;;;;;;;;;;;8BAKT,oaAAC,iaAAS;;;;;;;;;;;;;;;;AAIlB"}}, {"offset": {"line": 325, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next%4016.0.3_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.ts"],"sourcesContent":["module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['react-rsc']!.ReactJsxDevRuntime\n"],"names":["module","exports","require","vendored","ReactJsxDevRuntime"],"mappings":"AAAAA,OAAOC,OAAO,GACZC,QAAQ,4OACRC,QAAQ,CAAC,YAAY,CAAEC,kBAAkB","ignoreList":[0]}}, {"offset": {"line": 330, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/node_modules/.pnpm/%40vercel%2Banalytics%401.5.0_next%4016.0.3_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0__react%4019.2.0/node_modules/%40vercel/analytics/dist/next/index.mjs/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const Analytics = registerClientReference(\n function() { throw new Error(\"Attempted to call Analytics() from the server but Analytics is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@vercel+analytics@1.5.0_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@vercel/analytics/dist/next/index.mjs \",\n \"Analytics\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;AACvE;;AACO,MAAM,YAAY,IAAA,8bAAuB,EAC5C;IAAa,MAAM,IAAI,MAAM;AAAkO,GAC/P,0OACA","ignoreList":[0]}}, {"offset": {"line": 344, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/node_modules/.pnpm/%40vercel%2Banalytics%401.5.0_next%4016.0.3_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0__react%4019.2.0/node_modules/%40vercel/analytics/dist/next/index.mjs/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport const Analytics = registerClientReference(\n function() { throw new Error(\"Attempted to call Analytics() from the server but Analytics is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@vercel+analytics@1.5.0_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@vercel/analytics/dist/next/index.mjs\",\n \"Analytics\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;AACvE;;AACO,MAAM,YAAY,IAAA,8bAAuB,EAC5C;IAAa,MAAM,IAAI,MAAM;AAAkO,GAC/P,sNACA","ignoreList":[0]}}, diff --git a/.next/dev/server/middleware-build-manifest.js b/.next/dev/server/middleware-build-manifest.js index 4cf3b188..d3d026d7 100644 --- a/.next/dev/server/middleware-build-manifest.js +++ b/.next/dev/server/middleware-build-manifest.js @@ -1,31 +1,6 @@ globalThis.__BUILD_MANIFEST = { "pages": { - "/_app": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_973712af._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_1a0ae50c._.js", - "static/chunks/4e98a_next_app_020fddc2.js", - "static/chunks/[next]_entry_page-loader_ts_97d2bbab._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__dda05d7f._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__app_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__app_424607fa._.js" - ], - "/_error": [ - "static/chunks/4e98a_next_dist_compiled_662da5c2._.js", - "static/chunks/4e98a_next_dist_shared_lib_1a19caea._.js", - "static/chunks/4e98a_next_dist_client_99076394._.js", - "static/chunks/4e98a_next_dist_c302a28c._.js", - "static/chunks/4e98a_next_error_53e529e4.js", - "static/chunks/[next]_entry_page-loader_ts_faadefb0._.js", - "static/chunks/18ced_react-dom_797793fb._.js", - "static/chunks/a0629__pnpm_2ca28523._.js", - "static/chunks/[root-of-the-server]__d6f1a546._.js", - "static/chunks/Documents_go-new_chinese-family-tree_pages__error_2da965e7._.js", - "static/chunks/turbopack-Documents_go-new_chinese-family-tree_pages__error_4e6cc585._.js" - ] + "/_app": [] }, "devFiles": [], "polyfillFiles": [ diff --git a/.next/dev/server/next-font-manifest.js b/.next/dev/server/next-font-manifest.js index 1c798e44..081da19c 100644 --- a/.next/dev/server/next-font-manifest.js +++ b/.next/dev/server/next-font-manifest.js @@ -1 +1 @@ -self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/Documents/go-new/chinese-family-tree/app/_not-found/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/auth/signin/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/members/[id]/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/members/new/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/members/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/relationship/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/settings/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/timeline/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/tree/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}" \ No newline at end of file +self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/Documents/go-new/chinese-family-tree/app/members/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}" \ No newline at end of file diff --git a/.next/dev/server/next-font-manifest.json b/.next/dev/server/next-font-manifest.json index c6e6fcf6..b2bc2f12 100644 --- a/.next/dev/server/next-font-manifest.json +++ b/.next/dev/server/next-font-manifest.json @@ -1,21 +1,5 @@ { "app": { - "[project]/Documents/go-new/chinese-family-tree/app/_not-found/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/auth/signin/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/members/[id]/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/members/new/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], "[project]/Documents/go-new/chinese-family-tree/app/members/page": [ "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", "static/media/797e433ab948586e-s.p.dbea232f.woff2" @@ -23,26 +7,6 @@ "[project]/Documents/go-new/chinese-family-tree/app/page": [ "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/relationship/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/settings/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/timeline/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" - ], - "[project]/Documents/go-new/chinese-family-tree/app/tree/page": [ - "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", - "static/media/797e433ab948586e-s.p.dbea232f.woff2" ] }, "appUsingSizeAdjust": true, diff --git a/.next/dev/server/pages-manifest.json b/.next/dev/server/pages-manifest.json index 6ac637a7..9e26dfee 100644 --- a/.next/dev/server/pages-manifest.json +++ b/.next/dev/server/pages-manifest.json @@ -1,5 +1 @@ -{ - "/_app": "pages/_app.js", - "/_document": "pages/_document.js", - "/_error": "pages/_error.js" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js index 02f79b25..b9d10cf3 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js @@ -658,7 +658,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js.map index 87954667..f8514694 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js.map @@ -4,7 +4,7 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;KAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,mXAAC,4bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS"}}, {"offset": {"line": 67, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1307, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/db.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\"\nimport type { FamilyMember } from \"@/types/family\"\n\nexport interface GlobalSettings {\n key: string\n value: any\n}\n\nexport interface StoredImage {\n id: string\n blob: Blob\n mimeType: string\n createdAt: string\n}\n\nexport interface ActivityLog {\n id: string\n action: \"create\" | \"update\" | \"delete\" | \"import\" | \"export\"\n entityType: \"member\" | \"photo\" | \"story\" | \"settings\"\n entityId?: string\n entityName?: string\n changes?: any\n timestamp: string\n userId?: string\n userName?: string\n}\n\nexport class FamilyTreeDB extends Dexie {\n members!: Table\n settings!: Table\n images!: Table\n activityLogs!: Table\n\n constructor() {\n super(\"FamilyTreeDB\")\n this.version(1).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n })\n this.version(2).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n activityLogs: \"id, timestamp, action, entityType, entityId\",\n })\n }\n}\n\nexport const db = new FamilyTreeDB()\n"],"names":[],"mappings":";;;;;;AAAA;;AA2BO,MAAM,qBAAqB,kQAAK;IACrC,QAA6B;IAC7B,SAAgC;IAChC,OAA2B;IAC3B,aAAiC;IAEjC,aAAc;QACZ,KAAK,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;QACV;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;YACR,cAAc;QAChB;IACF;AACF;AAEO,MAAM,KAAK,IAAI"}}, {"offset": {"line": 1343, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { db } from '@/lib/db'\n\n// 全局图片缓存\nconst avatarCache = new Map()\n\nexport function useAvatarCache(avatarImageId?: string) {\n const [avatarUrl, setAvatarUrl] = useState(\n avatarImageId ? avatarCache.get(avatarImageId) : undefined\n )\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n if (!avatarImageId) {\n setAvatarUrl(undefined)\n return\n }\n\n // 如果缓存中已存在,直接使用\n const cached = avatarCache.get(avatarImageId)\n if (cached) {\n setAvatarUrl(cached)\n return\n }\n\n // 从数据库加载\n let isMounted = true\n setIsLoading(true)\n\n db.images\n .get(avatarImageId)\n .then((image) => {\n if (image && isMounted) {\n const url = URL.createObjectURL(image.blob)\n avatarCache.set(avatarImageId, url)\n setAvatarUrl(url)\n }\n })\n .catch((error) => {\n console.error('Failed to load avatar:', error)\n })\n .finally(() => {\n if (isMounted) {\n setIsLoading(false)\n }\n })\n\n return () => {\n isMounted = false\n }\n }, [avatarImageId])\n\n return { avatarUrl, isLoading }\n}\n\n// 清理缓存的工具函数(可选)\nexport function clearAvatarCache() {\n avatarCache.forEach((url) => URL.revokeObjectURL(url))\n avatarCache.clear()\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;;;;AAEA,SAAS;AACT,MAAM,cAAc,IAAI;AAEjB,SAAS,eAAe,aAAsB;;IACnD,MAAM,CAAC,WAAW,aAAa,GAAG,IAAA,+VAAQ,EACxC,gBAAgB,YAAY,GAAG,CAAC,iBAAiB;IAEnD,MAAM,CAAC,WAAW,aAAa,GAAG,IAAA,+VAAQ,EAAC;IAE3C,IAAA,gWAAS;oCAAC;YACR,IAAI,CAAC,eAAe;gBAClB,aAAa;gBACb;YACF;YAEA,gBAAgB;YAChB,MAAM,SAAS,YAAY,GAAG,CAAC;YAC/B,IAAI,QAAQ;gBACV,aAAa;gBACb;YACF;YAEA,SAAS;YACT,IAAI,YAAY;YAChB,aAAa;YAEb,yKAAE,CAAC,MAAM,CACN,GAAG,CAAC,eACJ,IAAI;4CAAC,CAAC;oBACL,IAAI,SAAS,WAAW;wBACtB,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;wBAC1C,YAAY,GAAG,CAAC,eAAe;wBAC/B,aAAa;oBACf;gBACF;2CACC,KAAK;4CAAC,CAAC;oBACN,QAAQ,KAAK,CAAC,0BAA0B;gBAC1C;2CACC,OAAO;4CAAC;oBACP,IAAI,WAAW;wBACb,aAAa;oBACf;gBACF;;YAEF;4CAAO;oBACL,YAAY;gBACd;;QACF;mCAAG;QAAC;KAAc;IAElB,OAAO;QAAE;QAAW;IAAU;AAChC;GA/CgB;AAkDT,SAAS;IACd,YAAY,OAAO,CAAC,CAAC,MAAQ,IAAI,eAAe,CAAC;IACjD,YAAY,KAAK;AACnB"}}, {"offset": {"line": 1420, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx"],"sourcesContent":["\"use client\"\n\nimport type { FamilyMember } from \"@/types/family\"\nimport { cn } from \"@/lib/utils\"\nimport { useAvatarCache } from \"@/hooks/use-avatar-cache\"\nimport { CircleUser, CircleUserRound, Heart } from \"lucide-react\"\n\ninterface FamilyNodeProps {\n member: FamilyMember\n spouse?: FamilyMember\n spouses?: FamilyMember[]\n isRoot?: boolean\n onSelect?: (member: FamilyMember) => void\n isHighlighted?: boolean\n relationMode?: boolean\n isSelected?: boolean\n}\n\n// 格式化日期显示(只显示年份)\nfunction formatYear(dateString?: string): string {\n if (!dateString) return ''\n const year = dateString.split('-')[0]\n return year\n}\n\n// 计算年龄\nfunction calculateAge(birthDate?: string, deathDate?: string): number | null {\n if (!birthDate) return null\n \n const birth = new Date(birthDate)\n const end = deathDate ? new Date(deathDate) : new Date()\n \n let age = end.getFullYear() - birth.getFullYear()\n const monthDiff = end.getMonth() - birth.getMonth()\n \n if (monthDiff < 0 || (monthDiff === 0 && end.getDate() < birth.getDate())) {\n age--\n }\n \n return age\n}\n\n// 单个人员卡片组件\nfunction PersonCard({ member, isRoot, isSpouse, onSelect, isHighlighted, relationMode, isSelected }: { member: FamilyMember; isRoot?: boolean; isSpouse?: boolean; onSelect?: (member: FamilyMember) => void; isHighlighted?: boolean; relationMode?: boolean; isSelected?: boolean }) {\n const { avatarUrl: avatarBlobUrl } = useAvatarCache(member?.avatarImageId)\n \n const birthYear = formatYear(member.birthDate)\n const deathYear = formatYear(member.deathDate)\n const age = calculateAge(member.birthDate, member.deathDate)\n \n const lifeSpan = birthYear\n ? deathYear\n ? `${birthYear}-${deathYear}`\n : `${birthYear}-`\n : ''\n \n const ageText = age !== null\n ? member.deathDate\n ? `享年${age}岁`\n : `${age}岁`\n : ''\n \n return (\n onSelect?.(member)}\n >\n
\n {member.generation}世\n
\n\n
\n {avatarBlobUrl ? (\n \n ) : (\n member.gender === 'FEMALE' ? (\n \n ) : (\n \n )\n )}\n
\n\n
\n
{member.surname} {member.givenName}
\n {member.courtesyName && (\n
字 {member.courtesyName}
\n )}\n {lifeSpan && (\n
\n {lifeSpan}\n
\n )}\n {ageText && (\n
\n {ageText}\n
\n )}\n {member.phone && (\n
\n 📱 {member.phone}\n
\n )}\n
\n\n {member.deathDate && (\n
\n )}\n
\n )\n}\n\nexport function FamilyNode({ member, spouse, spouses, isRoot, onSelect, isHighlighted, relationMode, isSelected }: FamilyNodeProps) {\n // 优先使用 spouses 数组,如果没有则使用单个 spouse\n const spouseList = spouses || (spouse ? [spouse] : [])\n \n if (spouseList.length === 0) {\n return \n }\n \n // 有配偶时,并排显示所有配偶\n return (\n
\n \n {spouseList.map((spouseMember, index) => (\n
\n \n \n
\n ))}\n
\n )\n}\n"],"names":[],"mappings":"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"}}, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css index 92f9ebcb..bf187cab 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css @@ -111,7 +111,6 @@ --color-blue-200: #bedbff; --color-blue-400: #54a2ff; --color-blue-500: #3080ff; - --color-blue-600: #155dfc; --color-blue-700: #1447e6; --color-blue-800: #193cb8; --color-blue-900: #1c398e; @@ -121,21 +120,21 @@ --color-purple-200: #e9d5ff; --color-purple-500: #ac4bff; --color-purple-700: #8200da; + --color-pink-50: #fdf2f8; --color-pink-100: #fce7f3; + --color-pink-200: #fccee8; --color-pink-400: #fb64b6; - --color-pink-500: #f6339a; - --color-pink-600: #e30076; --color-pink-700: #c4005c; + --color-pink-800: #a2004c; + --color-pink-950: #510424; --color-gray-50: #f9fafb; --color-gray-100: #f3f4f6; --color-gray-200: #e5e7eb; --color-gray-500: #6a7282; --color-gray-700: #364153; --color-neutral-100: #f5f5f5; - --color-neutral-200: #e5e5e5; --color-neutral-400: #a1a1a1; --color-neutral-500: #737373; - --color-neutral-600: #525252; --color-black: #000; --color-white: #fff; --spacing: .25rem; @@ -162,8 +161,6 @@ --text-3xl--line-height: calc(2.25 / 1.875); --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5 / 2.25); - --text-5xl: 3rem; - --text-5xl--line-height: 1; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; @@ -221,7 +218,6 @@ --color-blue-200: lab(86.15% -4.04379 -21.0797); --color-blue-400: lab(65.0361% -1.42065 -56.9802); --color-blue-500: lab(54.1736% 13.3369 -74.6839); - --color-blue-600: lab(44.0605% 29.0279 -86.0352); --color-blue-700: lab(36.9089% 35.0961 -85.6872); --color-blue-800: lab(30.2514% 27.7853 -70.2699); --color-blue-900: lab(26.1542% 15.7545 -51.5504); @@ -231,21 +227,21 @@ --color-purple-200: lab(87.8405% 13.4282 -18.7159); --color-purple-500: lab(52.0183% 66.11 -78.2316); --color-purple-700: lab(36.1758% 69.8525 -80.0381); + --color-pink-50: lab(96.4459% 4.53997 -1.49434); --color-pink-100: lab(93.5864% 9.01193 -3.15079); + --color-pink-200: lab(87.4504% 19.6 -6.46662); --color-pink-400: lab(64.5597% 64.3615 -12.7988); - --color-pink-500: lab(56.9303% 76.8162 -8.07021); - --color-pink-600: lab(49.5493% 79.8381 2.31768); --color-pink-700: lab(42.1737% 71.8009 7.42233); + --color-pink-800: lab(34.9559% 60.2885 5.99639); + --color-pink-950: lab(15.6116% 35.2166 3.53979); --color-gray-50: lab(98.2596% -.247031 -.706708); --color-gray-100: lab(96.1596% -.0823438 -1.13575); --color-gray-200: lab(91.6229% -.159115 -2.26791); --color-gray-500: lab(47.7841% -.393182 -10.0268); --color-gray-700: lab(27.1134% -.956401 -12.3224); --color-neutral-100: lab(96.52% -.0000298023 .0000119209); - --color-neutral-200: lab(90.952% 0 -.0000119209); --color-neutral-400: lab(66.128% -.0000298023 .0000119209); --color-neutral-500: lab(48.496% 0 0); - --color-neutral-600: lab(34.924% 0 0); } } } @@ -649,10 +645,6 @@ top: 100%; } - .-right-0\.5 { - right: calc(var(--spacing) * -.5); - } - .-right-1 { right: calc(var(--spacing) * -1); } @@ -681,10 +673,6 @@ right: calc(var(--spacing) * 4); } - .-bottom-0\.5 { - bottom: calc(var(--spacing) * -.5); - } - .-bottom-1 { bottom: calc(var(--spacing) * -1); } @@ -867,10 +855,6 @@ margin-block: calc(var(--spacing) * 1); } - .-mt-2 { - margin-top: calc(var(--spacing) * -2); - } - .-mt-4 { margin-top: calc(var(--spacing) * -4); } @@ -1118,10 +1102,6 @@ height: calc(var(--spacing) * 3); } - .h-3\.5 { - height: calc(var(--spacing) * 3.5); - } - .h-4 { height: calc(var(--spacing) * 4); } @@ -1306,10 +1286,6 @@ width: calc(var(--spacing) * 3); } - .w-3\.5 { - width: calc(var(--spacing) * 3.5); - } - .w-3\/4 { width: 75%; } @@ -1799,12 +1775,6 @@ gap: calc(var(--spacing) * 8); } - :where(.space-y-0 > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse))); - } - :where(.space-y-0\.5 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse)); @@ -2044,6 +2014,16 @@ border-color: var(--color-blue-200); } + .border-blue-200\/50 { + border-color: #bedbff80; + } + + @supports (color: color-mix(in lab, red, red)) { + .border-blue-200\/50 { + border-color: color-mix(in oklab, var(--color-blue-200) 50%, transparent); + } + } + .border-blue-500 { border-color: var(--color-blue-500); } @@ -2118,14 +2098,20 @@ } } - .border-neutral-200 { - border-color: var(--color-neutral-200); - } - .border-orange-200 { border-color: var(--color-orange-200); } + .border-pink-200\/50 { + border-color: #fccee880; + } + + @supports (color: color-mix(in lab, red, red)) { + .border-pink-200\/50 { + border-color: color-mix(in oklab, var(--color-pink-200) 50%, transparent); + } + } + .border-primary { border-color: var(--primary); } @@ -2252,6 +2238,16 @@ background-color: var(--color-blue-50); } + .bg-blue-50\/50 { + background-color: #eff6ff80; + } + + @supports (color: color-mix(in lab, red, red)) { + .bg-blue-50\/50 { + background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent); + } + } + .bg-blue-100 { background-color: var(--color-blue-100); } @@ -2306,36 +2302,6 @@ background-color: var(--foreground); } - .bg-foreground\/25 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/25 { - background-color: color-mix(in oklab, var(--foreground) 25%, transparent); - } - } - - .bg-foreground\/50 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/50 { - background-color: color-mix(in oklab, var(--foreground) 50%, transparent); - } - } - - .bg-foreground\/60 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/60 { - background-color: color-mix(in oklab, var(--foreground) 60%, transparent); - } - } - .bg-gray-50 { background-color: var(--color-gray-50); } @@ -2404,12 +2370,18 @@ background-color: var(--color-orange-500); } - .bg-pink-100 { - background-color: var(--color-pink-100); + .bg-pink-50\/50 { + background-color: #fdf2f880; } - .bg-pink-500 { - background-color: var(--color-pink-500); + @supports (color: color-mix(in lab, red, red)) { + .bg-pink-50\/50 { + background-color: color-mix(in oklab, var(--color-pink-50) 50%, transparent); + } + } + + .bg-pink-100 { + background-color: var(--color-pink-100); } .bg-popover { @@ -2450,36 +2422,6 @@ } } - .bg-primary\/40 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/40 { - background-color: color-mix(in oklab, var(--primary) 40%, transparent); - } - } - - .bg-primary\/60 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/60 { - background-color: color-mix(in oklab, var(--primary) 60%, transparent); - } - } - - .bg-primary\/70 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/70 { - background-color: color-mix(in oklab, var(--primary) 70%, transparent); - } - } - .bg-purple-50 { background-color: var(--color-purple-50); } @@ -2538,26 +2480,11 @@ background-image: url("https://www.transparenttextures.com/patterns/rice-paper.png"); } - .from-blue-500 { - --tw-gradient-from: var(--color-blue-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .from-blue-600 { - --tw-gradient-from: var(--color-blue-600); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-card { --tw-gradient-from: var(--card); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .from-pink-500 { - --tw-gradient-from: var(--color-pink-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-primary\/5 { --tw-gradient-from: var(--primary); } @@ -2598,22 +2525,6 @@ --tw-gradient-stops: var(--tw-gradient-via-stops); } - .via-purple-500 { - --tw-gradient-via: var(--color-purple-500); - --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-via-stops); - } - - .to-blue-400 { - --tw-gradient-to: var(--color-blue-400); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-blue-500 { - --tw-gradient-to: var(--color-blue-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-card\/50 { --tw-gradient-to: var(--card); } @@ -2628,21 +2539,6 @@ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .to-pink-400 { - --tw-gradient-to: var(--color-pink-400); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-pink-500 { - --tw-gradient-to: var(--color-pink-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-pink-600 { - --tw-gradient-to: var(--color-pink-600); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-primary\/50 { --tw-gradient-to: var(--primary); } @@ -2938,11 +2834,6 @@ line-height: var(--tw-leading, var(--text-4xl--line-height)); } - .text-5xl { - font-size: var(--text-5xl); - line-height: var(--tw-leading, var(--text-5xl--line-height)); - } - .text-base { font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); @@ -3094,10 +2985,6 @@ color: var(--color-blue-400); } - .text-blue-600 { - color: var(--color-blue-600); - } - .text-blue-700 { color: var(--color-blue-700); } @@ -3190,10 +3077,6 @@ color: var(--color-neutral-500); } - .text-neutral-600 { - color: var(--color-neutral-600); - } - .text-orange-700 { color: var(--color-orange-700); } @@ -3202,10 +3085,6 @@ color: var(--color-pink-400); } - .text-pink-600 { - color: var(--color-pink-600); - } - .text-pink-700 { color: var(--color-pink-700); } @@ -3232,16 +3111,6 @@ } } - .text-primary\/80 { - color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .text-primary\/80 { - color: color-mix(in oklab, var(--primary) 80%, transparent); - } - } - .text-purple-700 { color: var(--color-purple-700); } @@ -3527,11 +3396,6 @@ transition-duration: .3s; } - .duration-500 { - --tw-duration: .5s; - transition-duration: .5s; - } - .duration-1000 { --tw-duration: 1s; transition-duration: 1s; @@ -4074,12 +3938,6 @@ } } - @media (hover: hover) { - .hover\:bg-card:hover { - background-color: var(--card); - } - } - @media (hover: hover) { .hover\:bg-destructive:hover { background-color: var(--destructive); @@ -5813,10 +5671,30 @@ border-color: var(--color-blue-800); } + .dark\:border-blue-800\/30:is(.dark *) { + border-color: #193cb84d; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:border-blue-800\/30:is(.dark *) { + border-color: color-mix(in oklab, var(--color-blue-800) 30%, transparent); + } + } + .dark\:border-input:is(.dark *) { border-color: var(--input); } + .dark\:border-pink-800\/30:is(.dark *) { + border-color: #a2004c4d; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:border-pink-800\/30:is(.dark *) { + border-color: color-mix(in oklab, var(--color-pink-800) 30%, transparent); + } + } + .dark\:bg-blue-900\/20:is(.dark *) { background-color: #1c398e33; } @@ -5831,6 +5709,16 @@ background-color: var(--color-blue-950); } + .dark\:bg-blue-950\/20:is(.dark *) { + background-color: #16245633; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:bg-blue-950\/20:is(.dark *) { + background-color: color-mix(in oklab, var(--color-blue-950) 20%, transparent); + } + } + .dark\:bg-destructive\/60:is(.dark *) { background-color: var(--destructive); } @@ -5851,6 +5739,16 @@ } } + .dark\:bg-pink-950\/20:is(.dark *) { + background-color: #51042433; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:bg-pink-950\/20:is(.dark *) { + background-color: color-mix(in oklab, var(--color-pink-950) 20%, transparent); + } + } + .dark\:bg-transparent:is(.dark *) { background-color: #0000; } @@ -5873,18 +5771,10 @@ color: var(--color-blue-200); } - .dark\:text-blue-400:is(.dark *) { - color: var(--color-blue-400); - } - .dark\:text-muted-foreground:is(.dark *) { color: var(--muted-foreground); } - .dark\:text-pink-400:is(.dark *) { - color: var(--color-pink-400); - } - .dark\:text-yellow-200:is(.dark *) { color: var(--color-yellow-200); } diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css.map index a48c52fb..8b3fee01 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_globals_css_bad6b30c._.single.css.map @@ -2,5 +2,5 @@ "version": 3, "sources": [], "sections": [ - {"offset": {"line": 1, "column": 0}, "map": {"version":3,"sources":["turbopack:///[project]/Documents/go-new/chinese-family-tree/app/globals.css"],"sourcesContent":["/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-200: oklch(92.2% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-neutral-600: oklch(43.9% 0 0);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-6xl: 72rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --radius-xs: 0.125rem;\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --aspect-video: 16 / 9;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --default-mono-font-family: \"Geist Mono\", monospace;\n --color-border: var(--border);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .\\@container\\/field-group {\n container-type: inline-size;\n container-name: field-group;\n }\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .invisible {\n visibility: hidden;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .inset-x-0 {\n inset-inline: calc(var(--spacing) * 0);\n }\n .inset-y-0 {\n inset-block: calc(var(--spacing) * 0);\n }\n .-top-1 {\n top: calc(var(--spacing) * -1);\n }\n .-top-3 {\n top: calc(var(--spacing) * -3);\n }\n .-top-12 {\n top: calc(var(--spacing) * -12);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n .top-2\\.5 {\n top: calc(var(--spacing) * 2.5);\n }\n .top-3\\.5 {\n top: calc(var(--spacing) * 3.5);\n }\n .top-4 {\n top: calc(var(--spacing) * 4);\n }\n .top-20 {\n top: calc(var(--spacing) * 20);\n }\n .top-\\[1px\\] {\n top: 1px;\n }\n .top-\\[50\\%\\] {\n top: 50%;\n }\n .top-\\[60\\%\\] {\n top: 60%;\n }\n .top-full {\n top: 100%;\n }\n .-right-0\\.5 {\n right: calc(var(--spacing) * -0.5);\n }\n .-right-1 {\n right: calc(var(--spacing) * -1);\n }\n .-right-12 {\n right: calc(var(--spacing) * -12);\n }\n .right-0 {\n right: calc(var(--spacing) * 0);\n }\n .right-1 {\n right: calc(var(--spacing) * 1);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n .-bottom-0\\.5 {\n bottom: calc(var(--spacing) * -0.5);\n }\n .-bottom-1 {\n bottom: calc(var(--spacing) * -1);\n }\n .-bottom-12 {\n bottom: calc(var(--spacing) * -12);\n }\n .bottom-0 {\n bottom: calc(var(--spacing) * 0);\n }\n .bottom-2 {\n bottom: calc(var(--spacing) * 2);\n }\n .bottom-4 {\n bottom: calc(var(--spacing) * 4);\n }\n .-left-12 {\n left: calc(var(--spacing) * -12);\n }\n .-left-16 {\n left: calc(var(--spacing) * -16);\n }\n .-left-\\[9px\\] {\n left: calc(9px * -1);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-2 {\n left: calc(var(--spacing) * 2);\n }\n .left-2\\.5 {\n left: calc(var(--spacing) * 2.5);\n }\n .left-4 {\n left: calc(var(--spacing) * 4);\n }\n .left-\\[50\\%\\] {\n left: 50%;\n }\n .isolate {\n isolation: isolate;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-30 {\n z-index: 30;\n }\n .z-50 {\n z-index: 50;\n }\n .z-\\[1\\] {\n z-index: 1;\n }\n .z-\\[100\\] {\n z-index: 100;\n }\n .order-first {\n order: -9999;\n }\n .order-last {\n order: 9999;\n }\n .col-span-full {\n grid-column: 1 / -1;\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .\\!m-0 {\n margin: calc(var(--spacing) * 0) !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1);\n }\n .mx-2 {\n margin-inline: calc(var(--spacing) * 2);\n }\n .mx-3\\.5 {\n margin-inline: calc(var(--spacing) * 3.5);\n }\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .-my-2 {\n margin-block: calc(var(--spacing) * -2);\n }\n .my-0 {\n margin-block: calc(var(--spacing) * 0);\n }\n .my-0\\.5 {\n margin-block: calc(var(--spacing) * 0.5);\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1);\n }\n .-mt-2 {\n margin-top: calc(var(--spacing) * -2);\n }\n .-mt-4 {\n margin-top: calc(var(--spacing) * -4);\n }\n .mt-0 {\n margin-top: calc(var(--spacing) * 0);\n }\n .mt-0\\.5 {\n margin-top: calc(var(--spacing) * 0.5);\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(var(--spacing) * 1.5);\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-auto {\n margin-top: auto;\n }\n .mr-1 {\n margin-right: calc(var(--spacing) * 1);\n }\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-8 {\n margin-bottom: calc(var(--spacing) * 8);\n }\n .-ml-4 {\n margin-left: calc(var(--spacing) * -4);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\n }\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n .ml-6 {\n margin-left: calc(var(--spacing) * 6);\n }\n .ml-auto {\n margin-left: auto;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .table-caption {\n display: table-caption;\n }\n .table-cell {\n display: table-cell;\n }\n .table-row {\n display: table-row;\n }\n .field-sizing-content {\n field-sizing: content;\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .aspect-video {\n aspect-ratio: var(--aspect-video);\n }\n .size-\\(--cell-size\\) {\n width: var(--cell-size);\n height: var(--cell-size);\n }\n .size-2 {\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n }\n .size-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n height: calc(var(--spacing) * 2.5);\n }\n .size-3 {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n .size-4 {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n .size-6 {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n .size-7 {\n width: calc(var(--spacing) * 7);\n height: calc(var(--spacing) * 7);\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .size-auto {\n width: auto;\n height: auto;\n }\n .size-full {\n width: 100%;\n height: 100%;\n }\n .h-\\(--cell-size\\) {\n height: var(--cell-size);\n }\n .h-1 {\n height: calc(var(--spacing) * 1);\n }\n .h-1\\.5 {\n height: calc(var(--spacing) * 1.5);\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-2\\.5 {\n height: calc(var(--spacing) * 2.5);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-12 {\n height: calc(var(--spacing) * 12);\n }\n .h-14 {\n height: calc(var(--spacing) * 14);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-20 {\n height: calc(var(--spacing) * 20);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-\\[1\\.15rem\\] {\n height: 1.15rem;\n }\n .h-\\[300px\\] {\n height: 300px;\n }\n .h-\\[400px\\] {\n height: 400px;\n }\n .h-\\[600px\\] {\n height: 600px;\n }\n .h-\\[calc\\(100\\%-1px\\)\\] {\n height: calc(100% - 1px);\n }\n .h-\\[var\\(--radix-navigation-menu-viewport-height\\)\\] {\n height: var(--radix-navigation-menu-viewport-height);\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .h-px {\n height: 1px;\n }\n .h-screen {\n height: 100vh;\n }\n .h-svh {\n height: 100svh;\n }\n .max-h-\\(--radix-context-menu-content-available-height\\) {\n max-height: var(--radix-context-menu-content-available-height);\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height);\n }\n .max-h-\\(--radix-select-content-available-height\\) {\n max-height: var(--radix-select-content-available-height);\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96);\n }\n .max-h-\\[60vh\\] {\n max-height: 60vh;\n }\n .max-h-\\[70vh\\] {\n max-height: 70vh;\n }\n .max-h-\\[300px\\] {\n max-height: 300px;\n }\n .max-h-screen {\n max-height: 100vh;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-4 {\n min-height: calc(var(--spacing) * 4);\n }\n .min-h-16 {\n min-height: calc(var(--spacing) * 16);\n }\n .min-h-\\[200px\\] {\n min-height: 200px;\n }\n .min-h-full {\n min-height: 100%;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .min-h-svh {\n min-height: 100svh;\n }\n .w-\\(--cell-size\\) {\n width: var(--cell-size);\n }\n .w-\\(--sidebar-width\\) {\n width: var(--sidebar-width);\n }\n .w-0 {\n width: calc(var(--spacing) * 0);\n }\n .w-1 {\n width: calc(var(--spacing) * 1);\n }\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n .w-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n }\n .w-3\\/4 {\n width: calc(3/4 * 100%);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-7 {\n width: calc(var(--spacing) * 7);\n }\n .w-8 {\n width: calc(var(--spacing) * 8);\n }\n .w-9 {\n width: calc(var(--spacing) * 9);\n }\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-14 {\n width: calc(var(--spacing) * 14);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-32 {\n width: calc(var(--spacing) * 32);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n .w-\\[100px\\] {\n width: 100px;\n }\n .w-\\[200px\\] {\n width: 200px;\n }\n .w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\] {\n width: var(--radix-dropdown-menu-trigger-width);\n }\n .w-auto {\n width: auto;\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-max {\n width: max-content;\n }\n .w-px {\n width: 1px;\n }\n .max-w-\\(--skeleton-width\\) {\n max-width: var(--skeleton-width);\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .max-w-4xl {\n max-width: var(--container-4xl);\n }\n .max-w-6xl {\n max-width: var(--container-6xl);\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem);\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-max {\n max-width: max-content;\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\n }\n .max-w-sm {\n max-width: var(--container-sm);\n }\n .min-w-\\(--cell-size\\) {\n min-width: var(--cell-size);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-5 {\n min-width: calc(var(--spacing) * 5);\n }\n .min-w-8 {\n min-width: calc(var(--spacing) * 8);\n }\n .min-w-9 {\n min-width: calc(var(--spacing) * 9);\n }\n .min-w-10 {\n min-width: calc(var(--spacing) * 10);\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .min-w-\\[12rem\\] {\n min-width: 12rem;\n }\n .min-w-\\[200px\\] {\n min-width: 200px;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n }\n .min-w-fit {\n min-width: fit-content;\n }\n .min-w-full {\n min-width: 100%;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-shrink {\n flex-shrink: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .grow {\n flex-grow: 1;\n }\n .grow-0 {\n flex-grow: 0;\n }\n .basis-full {\n flex-basis: 100%;\n }\n .caption-bottom {\n caption-side: bottom;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .origin-\\(--radix-context-menu-content-transform-origin\\) {\n transform-origin: var(--radix-context-menu-content-transform-origin);\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n }\n .origin-\\(--radix-hover-card-content-transform-origin\\) {\n transform-origin: var(--radix-hover-card-content-transform-origin);\n }\n .origin-\\(--radix-menubar-content-transform-origin\\) {\n transform-origin: var(--radix-menubar-content-transform-origin);\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin);\n }\n .origin-\\(--radix-select-content-transform-origin\\) {\n transform-origin: var(--radix-select-content-transform-origin);\n }\n .origin-\\(--radix-tooltip-content-transform-origin\\) {\n transform-origin: var(--radix-tooltip-content-transform-origin);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-px {\n --tw-translate-x: -1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-px {\n --tw-translate-x: 1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0\\.5 {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[2px\\] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[calc\\(-50\\%_-_2px\\)\\] {\n --tw-translate-y: calc(-50% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .rotate-45 {\n rotate: 45deg;\n }\n .rotate-90 {\n rotate: 90deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-caret-blink {\n animation: caret-blink 1.25s ease-out infinite;\n }\n .animate-in {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n .animate-pulse {\n animation: var(--animate-pulse);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-move {\n cursor: move;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .cursor-text {\n cursor: text;\n }\n .touch-none {\n touch-action: none;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1);\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1);\n }\n .list-inside {\n list-style-position: inside;\n }\n .list-disc {\n list-style-type: disc;\n }\n .list-none {\n list-style-type: none;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .grid-cols-\\[0_1fr\\] {\n grid-template-columns: 0 1fr;\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-col-reverse {\n flex-direction: column-reverse;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-baseline {\n align-items: baseline;\n }\n .items-center {\n align-items: center;\n }\n .items-end {\n align-items: flex-end;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .justify-items-start {\n justify-items: start;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-2\\.5 {\n gap: calc(var(--spacing) * 2.5);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-7 {\n gap: calc(var(--spacing) * 7);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .space-y-0 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-0\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-x-4 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .gap-y-0\\.5 {\n row-gap: calc(var(--spacing) * 0.5);\n }\n .self-start {\n align-self: flex-start;\n }\n .self-stretch {\n align-self: stretch;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-\\[2px\\] {\n border-radius: 2px;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px;\n }\n .rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n border-radius: calc(var(--radius) - 5px);\n }\n .rounded-\\[inherit\\] {\n border-radius: inherit;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .rounded-xs {\n border-radius: var(--radius-xs);\n }\n .rounded-l-md {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n .rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n }\n .rounded-r-md {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-\\[1\\.5px\\] {\n border-style: var(--tw-border-style);\n border-width: 1.5px;\n }\n .border-y {\n border-block-style: var(--tw-border-style);\n border-block-width: 1px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n .border-l-2 {\n border-left-style: var(--tw-border-style);\n border-left-width: 2px;\n }\n .border-l-4 {\n border-left-style: var(--tw-border-style);\n border-left-width: 4px;\n }\n .border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .border-\\(--color-border\\) {\n border-color: var(--color-border);\n }\n .border-background {\n border-color: var(--background);\n }\n .border-blue-200 {\n border-color: var(--color-blue-200);\n }\n .border-blue-500 {\n border-color: var(--color-blue-500);\n }\n .border-border {\n border-color: var(--border);\n }\n .border-border\\/40 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 40%, transparent);\n }\n }\n .border-border\\/50 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n .border-border\\/60 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 60%, transparent);\n }\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-destructive\\/20 {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-green-200 {\n border-color: var(--color-green-200);\n }\n .border-input {\n border-color: var(--input);\n }\n .border-muted-foreground\\/50 {\n border-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted-foreground) 50%, transparent);\n }\n }\n .border-neutral-200 {\n border-color: var(--color-neutral-200);\n }\n .border-orange-200 {\n border-color: var(--color-orange-200);\n }\n .border-primary {\n border-color: var(--primary);\n }\n .border-primary\\/20 {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .border-purple-200 {\n border-color: var(--color-purple-200);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .border-sidebar-border {\n border-color: var(--sidebar-border);\n }\n .border-transparent {\n border-color: transparent;\n }\n .border-white {\n border-color: var(--color-white);\n }\n .border-yellow-400 {\n border-color: var(--color-yellow-400);\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .border-l-transparent {\n border-left-color: transparent;\n }\n .bg-\\(--color-bg\\) {\n background-color: var(--color-bg);\n }\n .bg-accent {\n background-color: var(--accent);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-background\\/50 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 50%, transparent);\n }\n }\n .bg-background\\/60 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n .bg-background\\/80 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 80%, transparent);\n }\n }\n .bg-background\\/90 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 90%, transparent);\n }\n }\n .bg-background\\/95 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 95%, transparent);\n }\n }\n .bg-black {\n background-color: var(--color-black);\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent);\n }\n }\n .bg-blue-50 {\n background-color: var(--color-blue-50);\n }\n .bg-blue-100 {\n background-color: var(--color-blue-100);\n }\n .bg-blue-500 {\n background-color: var(--color-blue-500);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-card\\/50 {\n background-color: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--card) 50%, transparent);\n }\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-destructive\\/10 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n .bg-destructive\\/15 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 15%, transparent);\n }\n }\n .bg-foreground {\n background-color: var(--foreground);\n }\n .bg-foreground\\/25 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 25%, transparent);\n }\n }\n .bg-foreground\\/50 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .bg-foreground\\/60 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 60%, transparent);\n }\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-100 {\n background-color: var(--color-gray-100);\n }\n .bg-gray-500 {\n background-color: var(--color-gray-500);\n }\n .bg-green-50 {\n background-color: var(--color-green-50);\n }\n .bg-green-100 {\n background-color: var(--color-green-100);\n }\n .bg-green-500 {\n background-color: var(--color-green-500);\n }\n .bg-input {\n background-color: var(--input);\n }\n .bg-muted {\n background-color: var(--muted);\n }\n .bg-muted\\/30 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n .bg-muted\\/50 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n .bg-neutral-100 {\n background-color: var(--color-neutral-100);\n }\n .bg-neutral-400 {\n background-color: var(--color-neutral-400);\n }\n .bg-orange-50 {\n background-color: var(--color-orange-50);\n }\n .bg-orange-500 {\n background-color: var(--color-orange-500);\n }\n .bg-pink-100 {\n background-color: var(--color-pink-100);\n }\n .bg-pink-500 {\n background-color: var(--color-pink-500);\n }\n .bg-popover {\n background-color: var(--popover);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-primary\\/5 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n .bg-primary\\/10 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n .bg-primary\\/20 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .bg-primary\\/40 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 40%, transparent);\n }\n }\n .bg-primary\\/60 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 60%, transparent);\n }\n }\n .bg-primary\\/70 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .bg-purple-50 {\n background-color: var(--color-purple-50);\n }\n .bg-purple-100 {\n background-color: var(--color-purple-100);\n }\n .bg-purple-500 {\n background-color: var(--color-purple-500);\n }\n .bg-red-100 {\n background-color: var(--color-red-100);\n }\n .bg-red-500 {\n background-color: var(--color-red-500);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-sidebar {\n background-color: var(--sidebar);\n }\n .bg-sidebar-border {\n background-color: var(--sidebar-border);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .bg-yellow-50 {\n background-color: var(--color-yellow-50);\n }\n .bg-gradient-to-br {\n --tw-gradient-position: to bottom right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-gradient-to-r {\n --tw-gradient-position: to right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-\\[url\\(\\'https\\:\\/\\/www\\.transparenttextures\\.com\\/patterns\\/rice-paper\\.png\\'\\)\\] {\n background-image: url('https://www.transparenttextures.com/patterns/rice-paper.png');\n }\n .from-blue-500 {\n --tw-gradient-from: var(--color-blue-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-blue-600 {\n --tw-gradient-from: var(--color-blue-600);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-card {\n --tw-gradient-from: var(--card);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-pink-500 {\n --tw-gradient-from: var(--color-pink-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/5 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/50 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .via-background {\n --tw-gradient-via: var(--background);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-primary {\n --tw-gradient-via: var(--primary);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-purple-500 {\n --tw-gradient-via: var(--color-purple-500);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .to-blue-400 {\n --tw-gradient-to: var(--color-blue-400);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-blue-500 {\n --tw-gradient-to: var(--color-blue-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-card\\/50 {\n --tw-gradient-to: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--card) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-400 {\n --tw-gradient-to: var(--color-pink-400);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-500 {\n --tw-gradient-to: var(--color-pink-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-600 {\n --tw-gradient-to: var(--color-pink-600);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-primary\\/50 {\n --tw-gradient-to: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-secondary\\/5 {\n --tw-gradient-to: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--secondary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .bg-repeat {\n background-repeat: repeat;\n }\n .fill-current {\n fill: currentcolor;\n }\n .fill-foreground {\n fill: var(--foreground);\n }\n .fill-primary {\n fill: var(--primary);\n }\n .object-contain {\n object-fit: contain;\n }\n .object-cover {\n object-fit: cover;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0);\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-2\\.5 {\n padding: calc(var(--spacing) * 2.5);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-12 {\n padding: calc(var(--spacing) * 12);\n }\n .p-\\[3px\\] {\n padding: 3px;\n }\n .p-px {\n padding: 1px;\n }\n .px-\\(--cell-size\\) {\n padding-inline: var(--cell-size);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-0\\.5 {\n padding-block: calc(var(--spacing) * 0.5);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .py-8 {\n padding-block: calc(var(--spacing) * 8);\n }\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n .py-12 {\n padding-block: calc(var(--spacing) * 12);\n }\n .pt-0 {\n padding-top: calc(var(--spacing) * 0);\n }\n .pt-3 {\n padding-top: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-20 {\n padding-top: calc(var(--spacing) * 20);\n }\n .pr-1 {\n padding-right: calc(var(--spacing) * 1);\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2);\n }\n .pr-2\\.5 {\n padding-right: calc(var(--spacing) * 2.5);\n }\n .pr-3 {\n padding-right: calc(var(--spacing) * 3);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pb-6 {\n padding-bottom: calc(var(--spacing) * 6);\n }\n .pb-8 {\n padding-bottom: calc(var(--spacing) * 8);\n }\n .pb-20 {\n padding-bottom: calc(var(--spacing) * 20);\n }\n .pl-1 {\n padding-left: calc(var(--spacing) * 1);\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .pl-4 {\n padding-left: calc(var(--spacing) * 4);\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8);\n }\n .pl-9 {\n padding-left: calc(var(--spacing) * 9);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .text-right {\n text-align: right;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-mono {\n font-family: \"Geist Mono\", monospace;\n }\n .font-sans {\n font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n }\n .font-serif {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-5xl {\n font-size: var(--text-5xl);\n line-height: var(--tw-leading, var(--text-5xl--line-height));\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-sm\\/relaxed {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n }\n .text-\\[9px\\] {\n font-size: 9px;\n }\n .text-\\[10px\\] {\n font-size: 10px;\n }\n .text-\\[11px\\] {\n font-size: 11px;\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .leading-normal {\n --tw-leading: var(--leading-normal);\n line-height: var(--leading-normal);\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .leading-snug {\n --tw-leading: var(--leading-snug);\n line-height: var(--leading-snug);\n }\n .leading-tight {\n --tw-leading: var(--leading-tight);\n line-height: var(--leading-tight);\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-normal {\n --tw-font-weight: var(--font-weight-normal);\n font-weight: var(--font-weight-normal);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n .tracking-wide {\n --tw-tracking: var(--tracking-wide);\n letter-spacing: var(--tracking-wide);\n }\n .tracking-wider {\n --tw-tracking: var(--tracking-wider);\n letter-spacing: var(--tracking-wider);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .text-balance {\n text-wrap: balance;\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .break-all {\n word-break: break-all;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre-line {\n white-space: pre-line;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-accent-foreground {\n color: var(--accent-foreground);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-background {\n color: var(--background);\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-blue-600 {\n color: var(--color-blue-600);\n }\n .text-blue-700 {\n color: var(--color-blue-700);\n }\n .text-blue-800 {\n color: var(--color-blue-800);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-current {\n color: currentcolor;\n }\n .text-destructive {\n color: var(--destructive);\n }\n .text-destructive-foreground {\n color: var(--destructive-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-foreground\\/50 {\n color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-green-700 {\n color: var(--color-green-700);\n }\n .text-green-800 {\n color: var(--color-green-800);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-muted-foreground\\/60 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);\n }\n }\n .text-muted-foreground\\/70 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 70%, transparent);\n }\n }\n .text-muted-foreground\\/80 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 80%, transparent);\n }\n }\n .text-neutral-500 {\n color: var(--color-neutral-500);\n }\n .text-neutral-600 {\n color: var(--color-neutral-600);\n }\n .text-orange-700 {\n color: var(--color-orange-700);\n }\n .text-pink-400 {\n color: var(--color-pink-400);\n }\n .text-pink-600 {\n color: var(--color-pink-600);\n }\n .text-pink-700 {\n color: var(--color-pink-700);\n }\n .text-popover-foreground {\n color: var(--popover-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-primary\\/70 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .text-primary\\/80 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 80%, transparent);\n }\n }\n .text-purple-700 {\n color: var(--color-purple-700);\n }\n .text-red-400 {\n color: var(--color-red-400);\n }\n .text-red-600 {\n color: var(--color-red-600);\n }\n .text-red-700 {\n color: var(--color-red-700);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-sidebar-foreground {\n color: var(--sidebar-foreground);\n }\n .text-sidebar-foreground\\/70 {\n color: var(--sidebar-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--sidebar-foreground) 70%, transparent);\n }\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-800 {\n color: var(--color-yellow-800);\n }\n .uppercase {\n text-transform: uppercase;\n }\n .italic {\n font-style: italic;\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .underline {\n text-decoration-line: underline;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-50 {\n opacity: 50%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-90 {\n opacity: 90%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-border\\)\\)\\] {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-border)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-none {\n --tw-shadow: 0 0 #0000;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-0 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-2 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-4 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-background {\n --tw-ring-color: var(--background);\n }\n .ring-blue-200 {\n --tw-ring-color: var(--color-blue-200);\n }\n .ring-ring\\/50 {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n .ring-sidebar-ring {\n --tw-ring-color: var(--sidebar-ring);\n }\n .ring-yellow-200 {\n --tw-ring-color: var(--color-yellow-200);\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--background);\n }\n .outline-hidden {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .backdrop-blur {\n --tw-backdrop-blur: blur(8px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[left\\,right\\,width\\] {\n transition-property: left,right,width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[margin\\,opacity\\] {\n transition-property: margin,opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\,height\\,padding\\] {\n transition-property: width,height,padding;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\] {\n transition-property: width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-none {\n transition-property: none;\n }\n .duration-100 {\n --tw-duration: 100ms;\n transition-duration: 100ms;\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .duration-1000 {\n --tw-duration: 1000ms;\n transition-duration: 1000ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .ease-linear {\n --tw-ease: linear;\n transition-timing-function: linear;\n }\n .ease-out {\n --tw-ease: var(--ease-out);\n transition-timing-function: var(--ease-out);\n }\n .fade-in-0 {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .slide-in-from-bottom-5 {\n --tw-enter-translate-y: calc(5*var(--spacing));\n --tw-enter-translate-y: calc(.05*100%);\n }\n .zoom-in-95 {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n .\\[--cell-size\\:--spacing\\(8\\)\\] {\n --cell-size: calc(var(--spacing) * 8);\n }\n .slide-in-from-top-2 {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n .group-last\\:hidden {\n &:is(:where(.group):last-child *) {\n display: none;\n }\n }\n .group-focus-within\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):focus-within *) {\n opacity: 100%;\n }\n }\n .group-hover\\:scale-110 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:bg-primary\\/20 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n }\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-hover\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8 {\n &:is(:where(.group\\/menu-item):has(*[data-sidebar=\"menu-action\"]) *) {\n padding-right: calc(var(--spacing) * 8);\n }\n }\n .group-has-\\[\\[data-orientation\\=horizontal\\]\\]\\/field\\:text-balance {\n &:is(:where(.group\\/field):has(*:is([data-orientation=horizontal])) *) {\n text-wrap: balance;\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:translate-y-0\\.5 {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:self-start {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n align-self: flex-start;\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pt-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-top: calc(var(--spacing) * 2.5);\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pb-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-bottom: calc(var(--spacing) * 2.5);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:-mt-8 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n margin-top: calc(var(--spacing) * -8);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n display: none;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:size-8\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--spacing) * 8) !important;\n height: calc(var(--spacing) * 8) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\) {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: var(--sidebar-width-icon);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)));\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:overflow-hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-0\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 0) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-2\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 2) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:opacity-0 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n opacity: 0%;\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n right: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n left: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:w-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n width: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/field\\:opacity-50 {\n &:is(:where(.group\\/field)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50 {\n &:is(:where(.group\\/input-group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:relative {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n position: relative;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:z-10 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n z-index: 10;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:border-ring {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n border-color: var(--ring);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-\\[3px\\] {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-ring\\/50 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .group-data-\\[side\\=left\\]\\:-right-4 {\n &:is(:where(.group)[data-side=\"left\"] *) {\n right: calc(var(--spacing) * -4);\n }\n }\n .group-data-\\[side\\=left\\]\\:border-r {\n &:is(:where(.group)[data-side=\"left\"] *) {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .group-data-\\[side\\=right\\]\\:left-0 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n left: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[side\\=right\\]\\:rotate-180 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[side\\=right\\]\\:border-l {\n &:is(:where(.group)[data-side=\"right\"] *) {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .group-data-\\[state\\=open\\]\\:rotate-180 {\n &:is(:where(.group)[data-state=\"open\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:rounded-lg {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-radius: var(--radius);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border-sidebar-border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-color: var(--sidebar-border);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:shadow-sm {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[variant\\=outline\\]\\/field-group\\:-mb-2 {\n &:is(:where(.group\\/field-group)[data-variant=\"outline\"] *) {\n margin-bottom: calc(var(--spacing) * -2);\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n display: block;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"top\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:top-full {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n top: 100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:mt-1\\.5 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n margin-top: calc(var(--spacing) * 1.5);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:overflow-hidden {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:rounded-md {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:border {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:bg-popover {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n background-color: var(--popover);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:text-popover-foreground {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n color: var(--popover-foreground);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:shadow {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:duration-200 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n }\n .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n &:is(:where(.group):is(.destructive) *) {\n border-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted) 40%, transparent);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:text-red-300 {\n &:is(:where(.group):is(.destructive) *) {\n color: var(--color-red-300);\n }\n }\n .peer-hover\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button):hover ~ *) {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50%;\n }\n }\n .peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button)[data-active=\"true\"] ~ *) {\n color: var(--sidebar-accent-foreground);\n }\n }\n .peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"default\"] ~ *) {\n top: calc(var(--spacing) * 1.5);\n }\n }\n .peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"lg\"] ~ *) {\n top: calc(var(--spacing) * 2.5);\n }\n }\n .peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1 {\n &:is(:where(.peer\\/menu-button)[data-size=\"sm\"] ~ *) {\n top: calc(var(--spacing) * 1);\n }\n }\n .selection\\:bg-primary {\n & *::selection {\n background-color: var(--primary);\n }\n &::selection {\n background-color: var(--primary);\n }\n }\n .selection\\:text-primary-foreground {\n & *::selection {\n color: var(--primary-foreground);\n }\n &::selection {\n color: var(--primary-foreground);\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7);\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--foreground);\n }\n }\n .placeholder\\:text-muted-foreground {\n &::placeholder {\n color: var(--muted-foreground);\n }\n }\n .after\\:absolute {\n &::after {\n content: var(--tw-content);\n position: absolute;\n }\n }\n .after\\:-inset-2 {\n &::after {\n content: var(--tw-content);\n inset: calc(var(--spacing) * -2);\n }\n }\n .after\\:inset-y-0 {\n &::after {\n content: var(--tw-content);\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .after\\:left-1\\/2 {\n &::after {\n content: var(--tw-content);\n left: calc(1/2 * 100%);\n }\n }\n .after\\:w-1 {\n &::after {\n content: var(--tw-content);\n width: calc(var(--spacing) * 1);\n }\n }\n .after\\:w-\\[2px\\] {\n &::after {\n content: var(--tw-content);\n width: 2px;\n }\n }\n .after\\:-translate-x-1\\/2 {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:after\\:left-full {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n &::after {\n content: var(--tw-content);\n left: 100%;\n }\n }\n }\n .first\\:rounded-l-md {\n &:first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .first\\:border-l {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .last\\:mt-0 {\n &:last-child {\n margin-top: calc(var(--spacing) * 0);\n }\n }\n .last\\:rounded-r-md {\n &:last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .last\\:border-0 {\n &:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .last\\:border-b-0 {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n .hover\\:scale-105 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:border-blue-400 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-blue-400);\n }\n }\n }\n .hover\\:border-primary {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n }\n }\n }\n .hover\\:border-primary\\/30 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-accent\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 5%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-background {\n &:hover {\n @media (hover: hover) {\n background-color: var(--background);\n }\n }\n }\n .hover\\:bg-card {\n &:hover {\n @media (hover: hover) {\n background-color: var(--card);\n }\n }\n }\n .hover\\:bg-destructive {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n }\n }\n }\n .hover\\:bg-muted\\/30 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-sidebar-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:text-destructive {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive);\n }\n }\n }\n .hover\\:text-destructive-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n .hover\\:text-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--foreground);\n }\n }\n }\n .hover\\:text-muted-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--muted-foreground);\n }\n }\n }\n .hover\\:text-primary {\n &:hover {\n @media (hover: hover) {\n color: var(--primary);\n }\n }\n }\n .hover\\:text-sidebar-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .hover\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .hover\\:shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-accent\\)\\)\\] {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-accent)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-lg {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-md {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:ring-4 {\n &:hover {\n @media (hover: hover) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar {\n &:hover {\n @media (hover: hover) {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n background-color: var(--sidebar);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 30%, transparent);\n }\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:bg-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-red-50 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-red-50);\n }\n }\n }\n }\n .hover\\:after\\:bg-sidebar-border {\n &:hover {\n @media (hover: hover) {\n &::after {\n content: var(--tw-content);\n background-color: var(--sidebar-border);\n }\n }\n }\n }\n .focus\\:z-10 {\n &:focus {\n z-index: 10;\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--accent);\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n .focus\\:opacity-100 {\n &:focus {\n opacity: 100%;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--ring);\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--destructive);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-red-400 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--color-red-400);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-offset-color: var(--color-red-600);\n }\n }\n }\n .focus-visible\\:z-10 {\n &:focus-visible {\n z-index: 10;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-0 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-1 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-2 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-4 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-primary {\n &:focus-visible {\n --tw-ring-color: var(--primary);\n }\n }\n .focus-visible\\:ring-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .focus-visible\\:ring-offset-1 {\n &:focus-visible {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus-visible\\:outline-hidden {\n &:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus-visible\\:outline-1 {\n &:focus-visible {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n }\n .focus-visible\\:outline-ring {\n &:focus-visible {\n outline-color: var(--ring);\n }\n }\n .active\\:bg-sidebar-accent {\n &:active {\n background-color: var(--sidebar-accent);\n }\n }\n .active\\:text-sidebar-accent-foreground {\n &:active {\n color: var(--sidebar-accent-foreground);\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .in-data-\\[side\\=left\\]\\:cursor-w-resize {\n :where(*[data-side=\"left\"]) & {\n cursor: w-resize;\n }\n }\n .in-data-\\[side\\=right\\]\\:cursor-e-resize {\n :where(*[data-side=\"right\"]) & {\n cursor: e-resize;\n }\n }\n .has-focus\\:border-ring {\n &:has(*:focus) {\n border-color: var(--ring);\n }\n }\n .has-focus\\:ring-\\[3px\\] {\n &:has(*:focus) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-focus\\:ring-ring\\/50 {\n &:has(*:focus) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-disabled\\:opacity-50 {\n &:has(*:disabled) {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-data-\\[state\\=checked\\]\\:border-primary {\n &:has(*[data-state=\"checked\"]) {\n border-color: var(--primary);\n }\n }\n .has-data-\\[state\\=checked\\]\\:bg-primary\\/5 {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n }\n .has-data-\\[variant\\=inset\\]\\:bg-sidebar {\n &:has(*[data-variant=\"inset\"]) {\n background-color: var(--sidebar);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n border-color: var(--ring);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-\\[3px\\] {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50 {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive {\n &:has(*:is([data-slot][aria-invalid=true])) {\n border-color: var(--destructive);\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20 {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto {\n &:has(>[data-align=block-end]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col {\n &:has(>[data-align=block-end]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto {\n &:has(>[data-align=block-start]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col {\n &:has(>[data-align=block-start]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2 {\n &:has(>[data-slot=button-group]) {\n gap: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>\\[data-slot\\=checkbox-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=checkbox-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:w-full {\n &:has(>[data-slot=field]) {\n width: 100%;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:flex-col {\n &:has(>[data-slot=field]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:rounded-md {\n &:has(>[data-slot=field]) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:border {\n &:has(>[data-slot=field]) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .has-\\[\\>\\[data-slot\\=radio-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=radio-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>button\\]\\:mr-\\[-0\\.4rem\\] {\n &:has(>button) {\n margin-right: -0.4rem;\n }\n }\n .has-\\[\\>button\\]\\:ml-\\[-0\\.45rem\\] {\n &:has(>button) {\n margin-left: -0.45rem;\n }\n }\n .has-\\[\\>kbd\\]\\:mr-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-right: -0.35rem;\n }\n }\n .has-\\[\\>kbd\\]\\:ml-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-left: -0.35rem;\n }\n }\n .has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\] {\n &:has(>svg) {\n grid-template-columns: calc(var(--spacing) * 4) 1fr;\n }\n }\n .has-\\[\\>svg\\]\\:gap-x-3 {\n &:has(>svg) {\n column-gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:p-0 {\n &:has(>svg) {\n padding: calc(var(--spacing) * 0);\n }\n }\n .has-\\[\\>svg\\]\\:px-2 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .has-\\[\\>textarea\\]\\:h-auto {\n &:has(>textarea) {\n height: auto;\n }\n }\n .aria-disabled\\:pointer-events-none {\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .aria-disabled\\:opacity-50 {\n &[aria-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .aria-selected\\:text-muted-foreground {\n &[aria-selected=\"true\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:z-10 {\n &[data-active=\"true\"] {\n z-index: 10;\n }\n }\n .data-\\[active\\=true\\]\\:border-ring {\n &[data-active=\"true\"] {\n border-color: var(--ring);\n }\n }\n .data-\\[active\\=true\\]\\:bg-accent\\/50 {\n &[data-active=\"true\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:bg-sidebar-accent {\n &[data-active=\"true\"] {\n background-color: var(--sidebar-accent);\n }\n }\n .data-\\[active\\=true\\]\\:font-medium {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .data-\\[active\\=true\\]\\:font-semibold {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n }\n .data-\\[active\\=true\\]\\:text-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-foreground {\n &[data-active=\"true\"] {\n color: var(--foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-sidebar-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--sidebar-accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:ring-\\[3px\\] {\n &[data-active=\"true\"] {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[active\\=true\\]\\:ring-ring\\/50 {\n &[data-active=\"true\"] {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:hover\\:bg-accent {\n &[data-active=\"true\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[active\\=true\\]\\:focus\\:bg-accent {\n &[data-active=\"true\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:border-destructive {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/20 {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50%;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive {\n &[data-error=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8);\n }\n }\n .data-\\[invalid\\=true\\]\\:text-destructive {\n &[data-invalid=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[motion\\=from-end\\]\\:slide-in-from-right-52 {\n &[data-motion=\"from-end\"] {\n --tw-enter-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=from-start\\]\\:slide-in-from-left-52 {\n &[data-motion=\"from-start\"] {\n --tw-enter-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\=to-end\\]\\:slide-out-to-right-52 {\n &[data-motion=\"to-end\"] {\n --tw-exit-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=to-start\\]\\:slide-out-to-left-52 {\n &[data-motion=\"to-start\"] {\n --tw-exit-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:animate-in {\n &[data-motion^=\"from-\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:fade-in {\n &[data-motion^=\"from-\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:animate-out {\n &[data-motion^=\"to-\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:fade-out {\n &[data-motion^=\"to-\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-1\\.5 {\n &[data-orientation=\"horizontal\"] {\n height: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-full {\n &[data-orientation=\"horizontal\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-px {\n &[data-orientation=\"horizontal\"] {\n height: 1px;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:w-full {\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-auto {\n &[data-orientation=\"vertical\"] {\n height: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-full {\n &[data-orientation=\"vertical\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:min-h-44 {\n &[data-orientation=\"vertical\"] {\n min-height: calc(var(--spacing) * 44);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-1\\.5 {\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-auto {\n &[data-orientation=\"vertical\"] {\n width: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-full {\n &[data-orientation=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-px {\n &[data-orientation=\"vertical\"] {\n width: 1px;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:flex-col {\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:h-px {\n &[data-panel-group-direction=\"vertical\"] {\n height: 1px;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:flex-col {\n &[data-panel-group-direction=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:left-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n left: calc(var(--spacing) * 0);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:h-1 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n height: calc(var(--spacing) * 1);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n width: 100%;\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:translate-x-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:-translate-y-1\\/2 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-md {\n &[data-range-end=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-r-md {\n &[data-range-end=\"true\"] {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:bg-primary {\n &[data-range-end=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-end\\=true\\]\\:text-primary-foreground {\n &[data-range-end=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[range-middle\\=true\\]\\:rounded-none {\n &[data-range-middle=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[range-middle\\=true\\]\\:bg-accent {\n &[data-range-middle=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[range-middle\\=true\\]\\:text-accent-foreground {\n &[data-range-middle=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-md {\n &[data-range-start=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-l-md {\n &[data-range-start=\"true\"] {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:bg-primary {\n &[data-range-start=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-start\\=true\\]\\:text-primary-foreground {\n &[data-range-start=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected-single\\=true\\]\\:bg-primary {\n &[data-selected-single=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[selected-single\\=true\\]\\:text-primary-foreground {\n &[data-selected-single=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected\\=true\\]\\:rounded-none {\n &[data-selected=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: calc(2*var(--spacing));\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: calc(2*var(--spacing));\n }\n }\n .data-\\[size\\=default\\]\\:h-9 {\n &[data-size=\"default\"] {\n height: calc(var(--spacing) * 9);\n }\n }\n .data-\\[size\\=sm\\]\\:h-8 {\n &[data-size=\"sm\"] {\n height: calc(var(--spacing) * 8);\n }\n }\n .\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90 {\n :is(& > *) {\n &[data-slot=\"alert-description\"] {\n color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .data-\\[slot\\=checkbox-group\\]\\:gap-3 {\n &[data-slot=\"checkbox-group\"] {\n gap: calc(var(--spacing) * 3);\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12);\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:ring-0 {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:outline-none {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n .data-\\[state\\=active\\]\\:bg-background {\n &[data-state=\"active\"] {\n background-color: var(--background);\n }\n }\n .data-\\[state\\=active\\]\\:shadow-sm {\n &[data-state=\"active\"] {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[state\\=checked\\]\\:translate-x-\\[calc\\(100\\%-2px\\)\\] {\n &[data-state=\"checked\"] {\n --tw-translate-x: calc(100% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[state\\=closed\\]\\:animate-accordion-up {\n &[data-state=\"closed\"] {\n animation: accordion-up 0.2s ease-out;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=closed\\]\\:duration-300 {\n &[data-state=\"closed\"] {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-80 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(80/100);\n --tw-exit-opacity: .8;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-bottom {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-left {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: -100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right-full {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: calc(1*100%);\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-top {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: -100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:animate-out {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:fade-out-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:zoom-out-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n }\n .data-\\[state\\=hidden\\]\\:animate-out {\n &[data-state=\"hidden\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=hidden\\]\\:fade-out {\n &[data-state=\"hidden\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=on\\]\\:bg-accent {\n &[data-state=\"on\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=on\\]\\:text-accent-foreground {\n &[data-state=\"on\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:animate-accordion-down {\n &[data-state=\"open\"] {\n animation: accordion-down 0.2s ease-out;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent\\/50 {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[state\\=open\\]\\:bg-secondary {\n &[data-state=\"open\"] {\n background-color: var(--secondary);\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:opacity-100 {\n &[data-state=\"open\"] {\n opacity: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:duration-500 {\n &[data-state=\"open\"] {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-90 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(90*1%);\n --tw-enter-scale: .9;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-bottom {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-left {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-right {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top-full {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: calc(1*-100%);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:animate-in {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:fade-in-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:zoom-in-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:focus\\:bg-accent {\n &[data-state=\"open\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[state\\=selected\\]\\:bg-muted {\n &[data-state=\"selected\"] {\n background-color: var(--muted);\n }\n }\n .data-\\[state\\=unchecked\\]\\:translate-x-0 {\n &[data-state=\"unchecked\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=unchecked\\]\\:bg-input {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n }\n }\n .data-\\[state\\=visible\\]\\:animate-in {\n &[data-state=\"visible\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=visible\\]\\:fade-in {\n &[data-state=\"visible\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[swipe\\=cancel\\]\\:translate-x-0 {\n &[data-swipe=\"cancel\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\] {\n &[data-swipe=\"end\"] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:animate-out {\n &[data-swipe=\"end\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\] {\n &[data-swipe=\"move\"] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=move\\]\\:transition-none {\n &[data-swipe=\"move\"] {\n transition-property: none;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--destructive);\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--destructive);\n }\n }\n }\n .data-\\[variant\\=label\\]\\:text-sm {\n &[data-variant=\"label\"] {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .data-\\[variant\\=legend\\]\\:text-base {\n &[data-variant=\"legend\"] {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n }\n .data-\\[variant\\=outline\\]\\:border-l-0 {\n &[data-variant=\"outline\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .data-\\[variant\\=outline\\]\\:shadow-xs {\n &[data-variant=\"outline\"] {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[variant\\=outline\\]\\:first\\:border-l {\n &[data-variant=\"outline\"] {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n margin-top: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"bottom\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-lg {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-left-radius: var(--radius);\n border-top-right-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:left-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n left: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"left\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:border-r {\n &[data-vaul-drawer-direction=\"left\"] {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:right-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n right: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"right\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:border-l {\n &[data-vaul-drawer-direction=\"right\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:top-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n top: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:mb-24 {\n &[data-vaul-drawer-direction=\"top\"] {\n margin-bottom: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"top\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-lg {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-right-radius: var(--radius);\n border-bottom-left-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:border-b {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .nth-last-2\\:-mt-1 {\n &:nth-last-child(2) {\n margin-top: calc(var(--spacing) * -1);\n }\n }\n .supports-\\[backdrop-filter\\]\\:bg-background\\/60 {\n @supports (backdrop-filter: var(--tw)) {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n }\n .sm\\:top-auto {\n @media (width >= 40rem) {\n top: auto;\n }\n }\n .sm\\:right-0 {\n @media (width >= 40rem) {\n right: calc(var(--spacing) * 0);\n }\n }\n .sm\\:bottom-0 {\n @media (width >= 40rem) {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .sm\\:col-span-2 {\n @media (width >= 40rem) {\n grid-column: span 2 / span 2;\n }\n }\n .sm\\:block {\n @media (width >= 40rem) {\n display: block;\n }\n }\n .sm\\:flex {\n @media (width >= 40rem) {\n display: flex;\n }\n }\n .sm\\:max-w-\\[600px\\] {\n @media (width >= 40rem) {\n max-width: 600px;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg);\n }\n }\n .sm\\:max-w-sm {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n .sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .sm\\:flex-col {\n @media (width >= 40rem) {\n flex-direction: column;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end;\n }\n }\n .sm\\:gap-2\\.5 {\n @media (width >= 40rem) {\n gap: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pr-2\\.5 {\n @media (width >= 40rem) {\n padding-right: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pl-2\\.5 {\n @media (width >= 40rem) {\n padding-left: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left;\n }\n }\n .data-\\[state\\=open\\]\\:sm\\:slide-in-from-bottom-full {\n &[data-state=\"open\"] {\n @media (width >= 40rem) {\n --tw-enter-translate-y: calc(1*100%);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"left\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"right\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .md\\:absolute {\n @media (width >= 48rem) {\n position: absolute;\n }\n }\n .md\\:-left-24 {\n @media (width >= 48rem) {\n left: calc(var(--spacing) * -24);\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2;\n }\n }\n .md\\:ml-12 {\n @media (width >= 48rem) {\n margin-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .md\\:w-20 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 20);\n }\n }\n .md\\:w-80 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 80);\n }\n }\n .md\\:w-\\[var\\(--radix-navigation-menu-viewport-width\\)\\] {\n @media (width >= 48rem) {\n width: var(--radix-navigation-menu-viewport-width);\n }\n }\n .md\\:w-auto {\n @media (width >= 48rem) {\n width: auto;\n }\n }\n .md\\:max-w-\\[420px\\] {\n @media (width >= 48rem) {\n max-width: 420px;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .md\\:grid-cols-3 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .md\\:flex-row {\n @media (width >= 48rem) {\n flex-direction: row;\n }\n }\n .md\\:items-center {\n @media (width >= 48rem) {\n align-items: center;\n }\n }\n .md\\:gap-1\\.5 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 1.5);\n }\n }\n .md\\:p-12 {\n @media (width >= 48rem) {\n padding: calc(var(--spacing) * 12);\n }\n }\n .md\\:px-6 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 6);\n }\n }\n .md\\:pl-12 {\n @media (width >= 48rem) {\n padding-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:text-left {\n @media (width >= 48rem) {\n text-align: left;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .md\\:opacity-0 {\n @media (width >= 48rem) {\n opacity: 0%;\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:m-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin: calc(var(--spacing) * 2);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:ml-0 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin-left: calc(var(--spacing) * 0);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n border-radius: calc(var(--radius) + 4px);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ml-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n &:is(:where(.peer)[data-state=\"collapsed\"] ~ *) {\n margin-left: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .md\\:after\\:hidden {\n @media (width >= 48rem) {\n &::after {\n content: var(--tw-content);\n display: none;\n }\n }\n }\n .lg\\:col-span-2 {\n @media (width >= 64rem) {\n grid-column: span 2 / span 2;\n }\n }\n .lg\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-3 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-4 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .xl\\:grid-cols-4 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .\\@md\\/field-group\\:flex-row {\n @container field-group (width >= 28rem) {\n flex-direction: row;\n }\n }\n .\\@md\\/field-group\\:items-center {\n @container field-group (width >= 28rem) {\n align-items: center;\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n }\n .dark\\:border-blue-800 {\n &:is(.dark *) {\n border-color: var(--color-blue-800);\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:bg-blue-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-blue-950 {\n &:is(.dark *) {\n background-color: var(--color-blue-950);\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:bg-transparent {\n &:is(.dark *) {\n background-color: transparent;\n }\n }\n .dark\\:bg-yellow-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(42.1% 0.095 57.708) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-yellow-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-yellow-950 {\n &:is(.dark *) {\n background-color: var(--color-yellow-950);\n }\n }\n .dark\\:text-blue-200 {\n &:is(.dark *) {\n color: var(--color-blue-200);\n }\n }\n .dark\\:text-blue-400 {\n &:is(.dark *) {\n color: var(--color-blue-400);\n }\n }\n .dark\\:text-muted-foreground {\n &:is(.dark *) {\n color: var(--muted-foreground);\n }\n }\n .dark\\:text-pink-400 {\n &:is(.dark *) {\n color: var(--color-pink-400);\n }\n }\n .dark\\:text-yellow-200 {\n &:is(.dark *) {\n color: var(--color-yellow-200);\n }\n }\n .dark\\:ring-blue-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-blue-800);\n }\n }\n .dark\\:ring-yellow-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-yellow-800);\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-accent-foreground {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:has-data-\\[state\\=checked\\]\\:bg-primary\\/10 {\n &:is(.dark *) {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n }\n }\n .dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:border-input {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n border-color: var(--input);\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:bg-input\\/30 {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:text-foreground {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary-foreground {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary-foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-foreground {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-input\\/80 {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 80%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n &:is(.dark *) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n }\n .\\[\\&_\\.recharts-cartesian-axis-tick_text\\]\\:fill-muted-foreground {\n & .recharts-cartesian-axis-tick text {\n fill: var(--muted-foreground);\n }\n }\n .\\[\\&_\\.recharts-cartesian-grid_line\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border\\/50 {\n & .recharts-cartesian-grid line[stroke='#ccc'] {\n stroke: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n stroke: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n }\n .\\[\\&_\\.recharts-curve\\.recharts-tooltip-cursor\\]\\:stroke-border {\n & .recharts-curve.recharts-tooltip-cursor {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-dot\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-dot[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-layer\\]\\:outline-hidden {\n & .recharts-layer {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-polar-grid_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-polar-grid [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-radial-bar-background-sector\\]\\:fill-muted {\n & .recharts-radial-bar-background-sector {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-rectangle\\.recharts-tooltip-cursor\\]\\:fill-muted {\n & .recharts-rectangle.recharts-tooltip-cursor {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-reference-line_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-reference-line [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-sector\\]\\:outline-hidden {\n & .recharts-sector {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-sector\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-sector[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-surface\\]\\:outline-hidden {\n & .recharts-surface {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_img\\]\\:size-full {\n & img {\n width: 100%;\n height: 100%;\n }\n }\n .\\[\\&_img\\]\\:object-cover {\n & img {\n object-fit: cover;\n }\n }\n .\\[\\&_p\\]\\:leading-relaxed {\n & p {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-6 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_tr\\]\\:border-b {\n & tr {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .\\[\\&_tr\\:last-child\\]\\:border-0 {\n & tr:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\+\\[data-slot\\=item-content\\]\\]\\:flex-none {\n &+[data-slot=item-content] {\n flex: none;\n }\n }\n .\\[\\&\\:first-child\\[data-selected\\=true\\]_button\\]\\:rounded-l-md {\n &:first-child[data-selected=true] button {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-0 {\n &:has([role=checkbox]) {\n padding-right: calc(var(--spacing) * 0);\n }\n }\n .\\[\\.border-b\\]\\:pb-3 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-3 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_next\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_next>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_previous\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_previous>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\:last-child\\[data-selected\\=true\\]_button\\]\\:rounded-r-md {\n &:last-child[data-selected=true] button {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\>\\*\\]\\:w-full {\n &>* {\n width: 100%;\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:relative {\n &>* {\n &:focus-visible {\n position: relative;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:z-10 {\n &>* {\n &:focus-visible {\n z-index: 10;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:data-\\[slot\\=field\\]\\:p-4 {\n &>* {\n &[data-slot=\"field\"] {\n padding: calc(var(--spacing) * 4);\n }\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\*\\]\\:w-auto {\n @container field-group (width >= 28rem) {\n &>* {\n width: auto;\n }\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-l-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0 {\n &>*:not(:first-child) {\n border-top-style: var(--tw-border-style);\n border-top-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-l-0 {\n &>*:not(:first-child) {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-r-none {\n &>*:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none {\n &>*:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\.sr-only\\]\\:w-auto {\n &>.sr-only {\n width: auto;\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-group\\]\\]\\:gap-4 {\n &>[data-slot=field-group] {\n gap: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n @container field-group (width >= 28rem) {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n }\n .has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-r-md {\n &:has(*:is(select[aria-hidden=true]:last-child)) {\n &>[data-slot=select-trigger]:last-of-type {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n }\n .\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=\\'w-\\'\\]\\)\\]\\:w-fit {\n &>[data-slot=select-trigger]:not([class*='w-']) {\n width: fit-content;\n }\n }\n .\\[\\&\\>\\[role\\=checkbox\\]\\]\\:translate-y-\\[2px\\] {\n &>[role=checkbox] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n }\n .\\[\\&\\>a\\]\\:underline {\n &>a {\n text-decoration-line: underline;\n }\n }\n .\\[\\&\\>a\\]\\:underline-offset-4 {\n &>a {\n text-underline-offset: 4px;\n }\n }\n .\\[\\&\\>a\\:hover\\]\\:text-primary {\n &>a:hover {\n color: var(--primary);\n }\n }\n .\\[\\&\\>button\\]\\:hidden {\n &>button {\n display: none;\n }\n }\n .\\[\\&\\>input\\]\\:flex-1 {\n &>input {\n flex: 1;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3 {\n &:has(>[data-align=block-end]) {\n &>input {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3 {\n &:has(>[data-align=block-start]) {\n &>input {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pr-2 {\n &:has(>[data-align=inline-end]) {\n &>input {\n padding-right: calc(var(--spacing) * 2);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:pl-2 {\n &:has(>[data-align=inline-start]) {\n &>input {\n padding-left: calc(var(--spacing) * 2);\n }\n }\n }\n .\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n &>kbd {\n border-radius: calc(var(--radius) - 5px);\n }\n }\n .\\[\\&\\>span\\]\\:text-xs {\n &>span {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&\\>span\\]\\:opacity-70 {\n &>span {\n opacity: 70%;\n }\n }\n .\\[\\&\\>span\\:last-child\\]\\:truncate {\n &>span:last-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n .\\[\\&\\>svg\\]\\:pointer-events-none {\n &>svg {\n pointer-events: none;\n }\n }\n .\\[\\&\\>svg\\]\\:size-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:size-3\\.5 {\n &>svg {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\]\\:size-4 {\n &>svg {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>svg\\]\\:h-2\\.5 {\n &>svg {\n height: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:h-3 {\n &>svg {\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:w-2\\.5 {\n &>svg {\n width: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:w-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:shrink-0 {\n &>svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&\\>svg\\]\\:translate-y-0\\.5 {\n &>svg {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .\\[\\&\\>svg\\]\\:text-current {\n &>svg {\n color: currentcolor;\n }\n }\n .\\[\\&\\>svg\\]\\:text-muted-foreground {\n &>svg {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground {\n &>svg {\n color: var(--sidebar-accent-foreground);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>tr\\]\\:last\\:border-b-0 {\n &>tr {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n }\n .\\[\\&\\[data-panel-group-direction\\=vertical\\]\\>div\\]\\:rotate-90 {\n &[data-panel-group-direction=vertical]>div {\n rotate: 90deg;\n }\n }\n .\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180 {\n &[data-state=open]>svg {\n rotate: 180deg;\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-right-2 {\n [data-side=left][data-collapsible=offcanvas] & {\n right: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize {\n [data-side=left][data-state=collapsed] & {\n cursor: e-resize;\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-left-2 {\n [data-side=right][data-collapsible=offcanvas] & {\n left: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize {\n [data-side=right][data-state=collapsed] & {\n cursor: w-resize;\n }\n }\n .\\[\\[data-slot\\=card-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=card-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=popover-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=popover-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20 {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 20%, transparent);\n }\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background {\n [data-slot=tooltip-content] & {\n color: var(--background);\n }\n }\n .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10 {\n &:is(.dark *) {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 10%, transparent);\n }\n }\n }\n }\n .\\[\\[data-variant\\=legend\\]\\+\\&\\]\\:-mt-1\\.5 {\n [data-variant=legend]+& {\n margin-top: calc(var(--spacing) * -1.5);\n }\n }\n .\\[a\\&\\]\\:transition-colors {\n a& {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent\\/50 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-destructive\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-primary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-secondary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:text-accent-foreground {\n a& {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: forwards;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(0.97 0.01 90);\n --foreground: oklch(0.2 0.02 265);\n --card: oklch(0.98 0.005 90);\n --card-foreground: oklch(0.2 0.02 265);\n --popover: oklch(0.98 0.005 90);\n --popover-foreground: oklch(0.2 0.02 265);\n --primary: oklch(0.45 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.85 0.05 85);\n --secondary-foreground: oklch(0.3 0.05 50);\n --muted: oklch(0.92 0.01 90);\n --muted-foreground: oklch(0.45 0.02 265);\n --accent: oklch(0.94 0.02 85);\n --accent-foreground: oklch(0.3 0.05 50);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.88 0.01 90);\n --input: oklch(0.88 0.01 90);\n --ring: oklch(0.45 0.15 25);\n --radius: 0.5rem;\n --sidebar: oklch(0.96 0.01 90);\n --sidebar-foreground: oklch(0.25 0.02 265);\n --sidebar-primary: oklch(0.45 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.93 0.01 90);\n --sidebar-accent-foreground: oklch(0.25 0.02 265);\n --sidebar-border: oklch(0.88 0.01 90);\n --sidebar-ring: oklch(0.45 0.15 25);\n --chart-1: oklch(0.45 0.15 25);\n --chart-2: oklch(0.65 0.12 50);\n --chart-3: oklch(0.35 0.08 200);\n --chart-4: oklch(0.55 0.05 265);\n --chart-5: oklch(0.75 0.1 85);\n}\n.dark {\n --background: oklch(0.12 0.01 265);\n --foreground: oklch(0.95 0.01 90);\n --card: oklch(0.15 0.01 265);\n --card-foreground: oklch(0.95 0.01 90);\n --popover: oklch(0.15 0.01 265);\n --popover-foreground: oklch(0.95 0.01 90);\n --primary: oklch(0.6 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.3 0.05 50);\n --secondary-foreground: oklch(0.9 0.05 85);\n --muted: oklch(0.2 0.01 265);\n --muted-foreground: oklch(0.65 0.01 265);\n --accent: oklch(0.2 0.02 265);\n --accent-foreground: oklch(0.95 0.01 90);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.25 0.01 265);\n --input: oklch(0.25 0.01 265);\n --ring: oklch(0.6 0.15 25);\n --sidebar: oklch(0.14 0.01 265);\n --sidebar-foreground: oklch(0.95 0.01 90);\n --sidebar-primary: oklch(0.6 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.2 0.01 265);\n --sidebar-accent-foreground: oklch(0.95 0.01 90);\n --sidebar-border: oklch(0.25 0.01 265);\n --sidebar-ring: oklch(0.6 0.15 25);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-gradient-position {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-via {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-to {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-via-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from-position {\n syntax: \"\";\n inherits: false;\n initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n syntax: \"\";\n inherits: false;\n initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity,1);\n transform: translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity,1);\n transform: translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n to {\n height: 0;\n }\n}\n@keyframes caret-blink {\n 0%,70%,100% {\n opacity: 1;\n }\n 20%,50% {\n opacity: 0;\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-content: \"\";\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: forwards;\n --tw-animation-iteration-count: 1;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}\n"],"names":[],"mappings":"AACA;EAq8ME;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAr8MJ;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFF;EAgHE;;;;;;;EAAA;;;;;;;EAMA;;;;;;;;;;EASA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;;;;EAKA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;;;;;;;EAAA;;;;;;;;;;;EAUA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;IACE;;;;IAEE;MAAgD;;;;;;EAKpD;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EA82LA;;;;;EAGE;IAAgD;;;;;EAIlD;;;;;EAIA;;;;;;;AAxnMF;;AAAA;EAoQE;;;;EAIA;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;;;;;;EAWA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAI3B;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;EAMA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAIE;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAMF;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;;EAKA;;;;;;EAKA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EA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"}}] + {"offset": {"line": 1, "column": 0}, "map": {"version":3,"sources":["turbopack:///[project]/Documents/go-new/chinese-family-tree/app/globals.css"],"sourcesContent":["/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-6xl: 72rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --radius-xs: 0.125rem;\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --aspect-video: 16 / 9;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --default-mono-font-family: \"Geist Mono\", monospace;\n --color-border: var(--border);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .\\@container\\/field-group {\n container-type: inline-size;\n container-name: field-group;\n }\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .invisible {\n visibility: hidden;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .inset-x-0 {\n inset-inline: calc(var(--spacing) * 0);\n }\n .inset-y-0 {\n inset-block: calc(var(--spacing) * 0);\n }\n .-top-1 {\n top: calc(var(--spacing) * -1);\n }\n .-top-3 {\n top: calc(var(--spacing) * -3);\n }\n .-top-12 {\n top: calc(var(--spacing) * -12);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n .top-2\\.5 {\n top: calc(var(--spacing) * 2.5);\n }\n .top-3\\.5 {\n top: calc(var(--spacing) * 3.5);\n }\n .top-4 {\n top: calc(var(--spacing) * 4);\n }\n .top-20 {\n top: calc(var(--spacing) * 20);\n }\n .top-\\[1px\\] {\n top: 1px;\n }\n .top-\\[50\\%\\] {\n top: 50%;\n }\n .top-\\[60\\%\\] {\n top: 60%;\n }\n .top-full {\n top: 100%;\n }\n .-right-1 {\n right: calc(var(--spacing) * -1);\n }\n .-right-12 {\n right: calc(var(--spacing) * -12);\n }\n .right-0 {\n right: calc(var(--spacing) * 0);\n }\n .right-1 {\n right: calc(var(--spacing) * 1);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n .-bottom-1 {\n bottom: calc(var(--spacing) * -1);\n }\n .-bottom-12 {\n bottom: calc(var(--spacing) * -12);\n }\n .bottom-0 {\n bottom: calc(var(--spacing) * 0);\n }\n .bottom-2 {\n bottom: calc(var(--spacing) * 2);\n }\n .bottom-4 {\n bottom: calc(var(--spacing) * 4);\n }\n .-left-12 {\n left: calc(var(--spacing) * -12);\n }\n .-left-16 {\n left: calc(var(--spacing) * -16);\n }\n .-left-\\[9px\\] {\n left: calc(9px * -1);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-2 {\n left: calc(var(--spacing) * 2);\n }\n .left-2\\.5 {\n left: calc(var(--spacing) * 2.5);\n }\n .left-4 {\n left: calc(var(--spacing) * 4);\n }\n .left-\\[50\\%\\] {\n left: 50%;\n }\n .isolate {\n isolation: isolate;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-30 {\n z-index: 30;\n }\n .z-50 {\n z-index: 50;\n }\n .z-\\[1\\] {\n z-index: 1;\n }\n .z-\\[100\\] {\n z-index: 100;\n }\n .order-first {\n order: -9999;\n }\n .order-last {\n order: 9999;\n }\n .col-span-full {\n grid-column: 1 / -1;\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .\\!m-0 {\n margin: calc(var(--spacing) * 0) !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1);\n }\n .mx-2 {\n margin-inline: calc(var(--spacing) * 2);\n }\n .mx-3\\.5 {\n margin-inline: calc(var(--spacing) * 3.5);\n }\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .-my-2 {\n margin-block: calc(var(--spacing) * -2);\n }\n .my-0 {\n margin-block: calc(var(--spacing) * 0);\n }\n .my-0\\.5 {\n margin-block: calc(var(--spacing) * 0.5);\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1);\n }\n .-mt-4 {\n margin-top: calc(var(--spacing) * -4);\n }\n .mt-0 {\n margin-top: calc(var(--spacing) * 0);\n }\n .mt-0\\.5 {\n margin-top: calc(var(--spacing) * 0.5);\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(var(--spacing) * 1.5);\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-auto {\n margin-top: auto;\n }\n .mr-1 {\n margin-right: calc(var(--spacing) * 1);\n }\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-8 {\n margin-bottom: calc(var(--spacing) * 8);\n }\n .-ml-4 {\n margin-left: calc(var(--spacing) * -4);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\n }\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n .ml-6 {\n margin-left: calc(var(--spacing) * 6);\n }\n .ml-auto {\n margin-left: auto;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .table-caption {\n display: table-caption;\n }\n .table-cell {\n display: table-cell;\n }\n .table-row {\n display: table-row;\n }\n .field-sizing-content {\n field-sizing: content;\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .aspect-video {\n aspect-ratio: var(--aspect-video);\n }\n .size-\\(--cell-size\\) {\n width: var(--cell-size);\n height: var(--cell-size);\n }\n .size-2 {\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n }\n .size-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n height: calc(var(--spacing) * 2.5);\n }\n .size-3 {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n .size-4 {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n .size-6 {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n .size-7 {\n width: calc(var(--spacing) * 7);\n height: calc(var(--spacing) * 7);\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .size-auto {\n width: auto;\n height: auto;\n }\n .size-full {\n width: 100%;\n height: 100%;\n }\n .h-\\(--cell-size\\) {\n height: var(--cell-size);\n }\n .h-1 {\n height: calc(var(--spacing) * 1);\n }\n .h-1\\.5 {\n height: calc(var(--spacing) * 1.5);\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-2\\.5 {\n height: calc(var(--spacing) * 2.5);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-12 {\n height: calc(var(--spacing) * 12);\n }\n .h-14 {\n height: calc(var(--spacing) * 14);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-20 {\n height: calc(var(--spacing) * 20);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-\\[1\\.15rem\\] {\n height: 1.15rem;\n }\n .h-\\[300px\\] {\n height: 300px;\n }\n .h-\\[400px\\] {\n height: 400px;\n }\n .h-\\[600px\\] {\n height: 600px;\n }\n .h-\\[calc\\(100\\%-1px\\)\\] {\n height: calc(100% - 1px);\n }\n .h-\\[var\\(--radix-navigation-menu-viewport-height\\)\\] {\n height: var(--radix-navigation-menu-viewport-height);\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .h-px {\n height: 1px;\n }\n .h-screen {\n height: 100vh;\n }\n .h-svh {\n height: 100svh;\n }\n .max-h-\\(--radix-context-menu-content-available-height\\) {\n max-height: var(--radix-context-menu-content-available-height);\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height);\n }\n .max-h-\\(--radix-select-content-available-height\\) {\n max-height: var(--radix-select-content-available-height);\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96);\n }\n .max-h-\\[60vh\\] {\n max-height: 60vh;\n }\n .max-h-\\[70vh\\] {\n max-height: 70vh;\n }\n .max-h-\\[300px\\] {\n max-height: 300px;\n }\n .max-h-screen {\n max-height: 100vh;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-4 {\n min-height: calc(var(--spacing) * 4);\n }\n .min-h-16 {\n min-height: calc(var(--spacing) * 16);\n }\n .min-h-\\[200px\\] {\n min-height: 200px;\n }\n .min-h-full {\n min-height: 100%;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .min-h-svh {\n min-height: 100svh;\n }\n .w-\\(--cell-size\\) {\n width: var(--cell-size);\n }\n .w-\\(--sidebar-width\\) {\n width: var(--sidebar-width);\n }\n .w-0 {\n width: calc(var(--spacing) * 0);\n }\n .w-1 {\n width: calc(var(--spacing) * 1);\n }\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n .w-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-3\\/4 {\n width: calc(3/4 * 100%);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-7 {\n width: calc(var(--spacing) * 7);\n }\n .w-8 {\n width: calc(var(--spacing) * 8);\n }\n .w-9 {\n width: calc(var(--spacing) * 9);\n }\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-14 {\n width: calc(var(--spacing) * 14);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-32 {\n width: calc(var(--spacing) * 32);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n .w-\\[100px\\] {\n width: 100px;\n }\n .w-\\[200px\\] {\n width: 200px;\n }\n .w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\] {\n width: var(--radix-dropdown-menu-trigger-width);\n }\n .w-auto {\n width: auto;\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-max {\n width: max-content;\n }\n .w-px {\n width: 1px;\n }\n .max-w-\\(--skeleton-width\\) {\n max-width: var(--skeleton-width);\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .max-w-4xl {\n max-width: var(--container-4xl);\n }\n .max-w-6xl {\n max-width: var(--container-6xl);\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem);\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-max {\n max-width: max-content;\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\n }\n .max-w-sm {\n max-width: var(--container-sm);\n }\n .min-w-\\(--cell-size\\) {\n min-width: var(--cell-size);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-5 {\n min-width: calc(var(--spacing) * 5);\n }\n .min-w-8 {\n min-width: calc(var(--spacing) * 8);\n }\n .min-w-9 {\n min-width: calc(var(--spacing) * 9);\n }\n .min-w-10 {\n min-width: calc(var(--spacing) * 10);\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .min-w-\\[12rem\\] {\n min-width: 12rem;\n }\n .min-w-\\[200px\\] {\n min-width: 200px;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n }\n .min-w-fit {\n min-width: fit-content;\n }\n .min-w-full {\n min-width: 100%;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-shrink {\n flex-shrink: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .grow {\n flex-grow: 1;\n }\n .grow-0 {\n flex-grow: 0;\n }\n .basis-full {\n flex-basis: 100%;\n }\n .caption-bottom {\n caption-side: bottom;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .origin-\\(--radix-context-menu-content-transform-origin\\) {\n transform-origin: var(--radix-context-menu-content-transform-origin);\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n }\n .origin-\\(--radix-hover-card-content-transform-origin\\) {\n transform-origin: var(--radix-hover-card-content-transform-origin);\n }\n .origin-\\(--radix-menubar-content-transform-origin\\) {\n transform-origin: var(--radix-menubar-content-transform-origin);\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin);\n }\n .origin-\\(--radix-select-content-transform-origin\\) {\n transform-origin: var(--radix-select-content-transform-origin);\n }\n .origin-\\(--radix-tooltip-content-transform-origin\\) {\n transform-origin: var(--radix-tooltip-content-transform-origin);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-px {\n --tw-translate-x: -1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-px {\n --tw-translate-x: 1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0\\.5 {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[2px\\] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[calc\\(-50\\%_-_2px\\)\\] {\n --tw-translate-y: calc(-50% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .rotate-45 {\n rotate: 45deg;\n }\n .rotate-90 {\n rotate: 90deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-caret-blink {\n animation: caret-blink 1.25s ease-out infinite;\n }\n .animate-in {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n .animate-pulse {\n animation: var(--animate-pulse);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-move {\n cursor: move;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .cursor-text {\n cursor: text;\n }\n .touch-none {\n touch-action: none;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1);\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1);\n }\n .list-inside {\n list-style-position: inside;\n }\n .list-disc {\n list-style-type: disc;\n }\n .list-none {\n list-style-type: none;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .grid-cols-\\[0_1fr\\] {\n grid-template-columns: 0 1fr;\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-col-reverse {\n flex-direction: column-reverse;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-baseline {\n align-items: baseline;\n }\n .items-center {\n align-items: center;\n }\n .items-end {\n align-items: flex-end;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .justify-items-start {\n justify-items: start;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-2\\.5 {\n gap: calc(var(--spacing) * 2.5);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-7 {\n gap: calc(var(--spacing) * 7);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .space-y-0\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-x-4 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .gap-y-0\\.5 {\n row-gap: calc(var(--spacing) * 0.5);\n }\n .self-start {\n align-self: flex-start;\n }\n .self-stretch {\n align-self: stretch;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-\\[2px\\] {\n border-radius: 2px;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px;\n }\n .rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n border-radius: calc(var(--radius) - 5px);\n }\n .rounded-\\[inherit\\] {\n border-radius: inherit;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .rounded-xs {\n border-radius: var(--radius-xs);\n }\n .rounded-l-md {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n .rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n }\n .rounded-r-md {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-\\[1\\.5px\\] {\n border-style: var(--tw-border-style);\n border-width: 1.5px;\n }\n .border-y {\n border-block-style: var(--tw-border-style);\n border-block-width: 1px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n .border-l-2 {\n border-left-style: var(--tw-border-style);\n border-left-width: 2px;\n }\n .border-l-4 {\n border-left-style: var(--tw-border-style);\n border-left-width: 4px;\n }\n .border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .border-\\(--color-border\\) {\n border-color: var(--color-border);\n }\n .border-background {\n border-color: var(--background);\n }\n .border-blue-200 {\n border-color: var(--color-blue-200);\n }\n .border-blue-200\\/50 {\n border-color: color-mix(in srgb, oklch(88.2% 0.059 254.128) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-blue-200) 50%, transparent);\n }\n }\n .border-blue-500 {\n border-color: var(--color-blue-500);\n }\n .border-border {\n border-color: var(--border);\n }\n .border-border\\/40 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 40%, transparent);\n }\n }\n .border-border\\/50 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n .border-border\\/60 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 60%, transparent);\n }\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-destructive\\/20 {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-green-200 {\n border-color: var(--color-green-200);\n }\n .border-input {\n border-color: var(--input);\n }\n .border-muted-foreground\\/50 {\n border-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted-foreground) 50%, transparent);\n }\n }\n .border-orange-200 {\n border-color: var(--color-orange-200);\n }\n .border-pink-200\\/50 {\n border-color: color-mix(in srgb, oklch(89.9% 0.061 343.231) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-pink-200) 50%, transparent);\n }\n }\n .border-primary {\n border-color: var(--primary);\n }\n .border-primary\\/20 {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .border-purple-200 {\n border-color: var(--color-purple-200);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .border-sidebar-border {\n border-color: var(--sidebar-border);\n }\n .border-transparent {\n border-color: transparent;\n }\n .border-white {\n border-color: var(--color-white);\n }\n .border-yellow-400 {\n border-color: var(--color-yellow-400);\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .border-l-transparent {\n border-left-color: transparent;\n }\n .bg-\\(--color-bg\\) {\n background-color: var(--color-bg);\n }\n .bg-accent {\n background-color: var(--accent);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-background\\/50 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 50%, transparent);\n }\n }\n .bg-background\\/60 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n .bg-background\\/80 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 80%, transparent);\n }\n }\n .bg-background\\/90 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 90%, transparent);\n }\n }\n .bg-background\\/95 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 95%, transparent);\n }\n }\n .bg-black {\n background-color: var(--color-black);\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent);\n }\n }\n .bg-blue-50 {\n background-color: var(--color-blue-50);\n }\n .bg-blue-50\\/50 {\n background-color: color-mix(in srgb, oklch(97% 0.014 254.604) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent);\n }\n }\n .bg-blue-100 {\n background-color: var(--color-blue-100);\n }\n .bg-blue-500 {\n background-color: var(--color-blue-500);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-card\\/50 {\n background-color: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--card) 50%, transparent);\n }\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-destructive\\/10 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n .bg-destructive\\/15 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 15%, transparent);\n }\n }\n .bg-foreground {\n background-color: var(--foreground);\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-100 {\n background-color: var(--color-gray-100);\n }\n .bg-gray-500 {\n background-color: var(--color-gray-500);\n }\n .bg-green-50 {\n background-color: var(--color-green-50);\n }\n .bg-green-100 {\n background-color: var(--color-green-100);\n }\n .bg-green-500 {\n background-color: var(--color-green-500);\n }\n .bg-input {\n background-color: var(--input);\n }\n .bg-muted {\n background-color: var(--muted);\n }\n .bg-muted\\/30 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n .bg-muted\\/50 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n .bg-neutral-100 {\n background-color: var(--color-neutral-100);\n }\n .bg-neutral-400 {\n background-color: var(--color-neutral-400);\n }\n .bg-orange-50 {\n background-color: var(--color-orange-50);\n }\n .bg-orange-500 {\n background-color: var(--color-orange-500);\n }\n .bg-pink-50\\/50 {\n background-color: color-mix(in srgb, oklch(97.1% 0.014 343.198) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-pink-50) 50%, transparent);\n }\n }\n .bg-pink-100 {\n background-color: var(--color-pink-100);\n }\n .bg-popover {\n background-color: var(--popover);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-primary\\/5 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n .bg-primary\\/10 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n .bg-primary\\/20 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .bg-purple-50 {\n background-color: var(--color-purple-50);\n }\n .bg-purple-100 {\n background-color: var(--color-purple-100);\n }\n .bg-purple-500 {\n background-color: var(--color-purple-500);\n }\n .bg-red-100 {\n background-color: var(--color-red-100);\n }\n .bg-red-500 {\n background-color: var(--color-red-500);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-sidebar {\n background-color: var(--sidebar);\n }\n .bg-sidebar-border {\n background-color: var(--sidebar-border);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .bg-yellow-50 {\n background-color: var(--color-yellow-50);\n }\n .bg-gradient-to-br {\n --tw-gradient-position: to bottom right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-gradient-to-r {\n --tw-gradient-position: to right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-\\[url\\(\\'https\\:\\/\\/www\\.transparenttextures\\.com\\/patterns\\/rice-paper\\.png\\'\\)\\] {\n background-image: url('https://www.transparenttextures.com/patterns/rice-paper.png');\n }\n .from-card {\n --tw-gradient-from: var(--card);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/5 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/50 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .via-background {\n --tw-gradient-via: var(--background);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-primary {\n --tw-gradient-via: var(--primary);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .to-card\\/50 {\n --tw-gradient-to: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--card) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-primary\\/50 {\n --tw-gradient-to: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-secondary\\/5 {\n --tw-gradient-to: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--secondary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .bg-repeat {\n background-repeat: repeat;\n }\n .fill-current {\n fill: currentcolor;\n }\n .fill-foreground {\n fill: var(--foreground);\n }\n .fill-primary {\n fill: var(--primary);\n }\n .object-contain {\n object-fit: contain;\n }\n .object-cover {\n object-fit: cover;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0);\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-2\\.5 {\n padding: calc(var(--spacing) * 2.5);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-12 {\n padding: calc(var(--spacing) * 12);\n }\n .p-\\[3px\\] {\n padding: 3px;\n }\n .p-px {\n padding: 1px;\n }\n .px-\\(--cell-size\\) {\n padding-inline: var(--cell-size);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-0\\.5 {\n padding-block: calc(var(--spacing) * 0.5);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .py-8 {\n padding-block: calc(var(--spacing) * 8);\n }\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n .py-12 {\n padding-block: calc(var(--spacing) * 12);\n }\n .pt-0 {\n padding-top: calc(var(--spacing) * 0);\n }\n .pt-3 {\n padding-top: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-20 {\n padding-top: calc(var(--spacing) * 20);\n }\n .pr-1 {\n padding-right: calc(var(--spacing) * 1);\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2);\n }\n .pr-2\\.5 {\n padding-right: calc(var(--spacing) * 2.5);\n }\n .pr-3 {\n padding-right: calc(var(--spacing) * 3);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pb-6 {\n padding-bottom: calc(var(--spacing) * 6);\n }\n .pb-8 {\n padding-bottom: calc(var(--spacing) * 8);\n }\n .pb-20 {\n padding-bottom: calc(var(--spacing) * 20);\n }\n .pl-1 {\n padding-left: calc(var(--spacing) * 1);\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .pl-4 {\n padding-left: calc(var(--spacing) * 4);\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8);\n }\n .pl-9 {\n padding-left: calc(var(--spacing) * 9);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .text-right {\n text-align: right;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-mono {\n font-family: \"Geist Mono\", monospace;\n }\n .font-sans {\n font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n }\n .font-serif {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-sm\\/relaxed {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n }\n .text-\\[9px\\] {\n font-size: 9px;\n }\n .text-\\[10px\\] {\n font-size: 10px;\n }\n .text-\\[11px\\] {\n font-size: 11px;\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .leading-normal {\n --tw-leading: var(--leading-normal);\n line-height: var(--leading-normal);\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .leading-snug {\n --tw-leading: var(--leading-snug);\n line-height: var(--leading-snug);\n }\n .leading-tight {\n --tw-leading: var(--leading-tight);\n line-height: var(--leading-tight);\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-normal {\n --tw-font-weight: var(--font-weight-normal);\n font-weight: var(--font-weight-normal);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n .tracking-wide {\n --tw-tracking: var(--tracking-wide);\n letter-spacing: var(--tracking-wide);\n }\n .tracking-wider {\n --tw-tracking: var(--tracking-wider);\n letter-spacing: var(--tracking-wider);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .text-balance {\n text-wrap: balance;\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .break-all {\n word-break: break-all;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre-line {\n white-space: pre-line;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-accent-foreground {\n color: var(--accent-foreground);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-background {\n color: var(--background);\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-blue-700 {\n color: var(--color-blue-700);\n }\n .text-blue-800 {\n color: var(--color-blue-800);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-current {\n color: currentcolor;\n }\n .text-destructive {\n color: var(--destructive);\n }\n .text-destructive-foreground {\n color: var(--destructive-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-foreground\\/50 {\n color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-green-700 {\n color: var(--color-green-700);\n }\n .text-green-800 {\n color: var(--color-green-800);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-muted-foreground\\/60 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);\n }\n }\n .text-muted-foreground\\/70 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 70%, transparent);\n }\n }\n .text-muted-foreground\\/80 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 80%, transparent);\n }\n }\n .text-neutral-500 {\n color: var(--color-neutral-500);\n }\n .text-orange-700 {\n color: var(--color-orange-700);\n }\n .text-pink-400 {\n color: var(--color-pink-400);\n }\n .text-pink-700 {\n color: var(--color-pink-700);\n }\n .text-popover-foreground {\n color: var(--popover-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-primary\\/70 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .text-purple-700 {\n color: var(--color-purple-700);\n }\n .text-red-400 {\n color: var(--color-red-400);\n }\n .text-red-600 {\n color: var(--color-red-600);\n }\n .text-red-700 {\n color: var(--color-red-700);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-sidebar-foreground {\n color: var(--sidebar-foreground);\n }\n .text-sidebar-foreground\\/70 {\n color: var(--sidebar-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--sidebar-foreground) 70%, transparent);\n }\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-800 {\n color: var(--color-yellow-800);\n }\n .uppercase {\n text-transform: uppercase;\n }\n .italic {\n font-style: italic;\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .underline {\n text-decoration-line: underline;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-50 {\n opacity: 50%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-90 {\n opacity: 90%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-border\\)\\)\\] {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-border)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-none {\n --tw-shadow: 0 0 #0000;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-0 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-2 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-4 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-background {\n --tw-ring-color: var(--background);\n }\n .ring-blue-200 {\n --tw-ring-color: var(--color-blue-200);\n }\n .ring-ring\\/50 {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n .ring-sidebar-ring {\n --tw-ring-color: var(--sidebar-ring);\n }\n .ring-yellow-200 {\n --tw-ring-color: var(--color-yellow-200);\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--background);\n }\n .outline-hidden {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .backdrop-blur {\n --tw-backdrop-blur: blur(8px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[left\\,right\\,width\\] {\n transition-property: left,right,width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[margin\\,opacity\\] {\n transition-property: margin,opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\,height\\,padding\\] {\n transition-property: width,height,padding;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\] {\n transition-property: width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-none {\n transition-property: none;\n }\n .duration-100 {\n --tw-duration: 100ms;\n transition-duration: 100ms;\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-1000 {\n --tw-duration: 1000ms;\n transition-duration: 1000ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .ease-linear {\n --tw-ease: linear;\n transition-timing-function: linear;\n }\n .ease-out {\n --tw-ease: var(--ease-out);\n transition-timing-function: var(--ease-out);\n }\n .fade-in-0 {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .slide-in-from-bottom-5 {\n --tw-enter-translate-y: calc(5*var(--spacing));\n --tw-enter-translate-y: calc(.05*100%);\n }\n .zoom-in-95 {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n .\\[--cell-size\\:--spacing\\(8\\)\\] {\n --cell-size: calc(var(--spacing) * 8);\n }\n .slide-in-from-top-2 {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n .group-last\\:hidden {\n &:is(:where(.group):last-child *) {\n display: none;\n }\n }\n .group-focus-within\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):focus-within *) {\n opacity: 100%;\n }\n }\n .group-hover\\:scale-110 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:bg-primary\\/20 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n }\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-hover\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8 {\n &:is(:where(.group\\/menu-item):has(*[data-sidebar=\"menu-action\"]) *) {\n padding-right: calc(var(--spacing) * 8);\n }\n }\n .group-has-\\[\\[data-orientation\\=horizontal\\]\\]\\/field\\:text-balance {\n &:is(:where(.group\\/field):has(*:is([data-orientation=horizontal])) *) {\n text-wrap: balance;\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:translate-y-0\\.5 {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:self-start {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n align-self: flex-start;\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pt-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-top: calc(var(--spacing) * 2.5);\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pb-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-bottom: calc(var(--spacing) * 2.5);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:-mt-8 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n margin-top: calc(var(--spacing) * -8);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n display: none;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:size-8\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--spacing) * 8) !important;\n height: calc(var(--spacing) * 8) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\) {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: var(--sidebar-width-icon);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)));\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:overflow-hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-0\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 0) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-2\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 2) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:opacity-0 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n opacity: 0%;\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n right: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n left: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:w-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n width: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/field\\:opacity-50 {\n &:is(:where(.group\\/field)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50 {\n &:is(:where(.group\\/input-group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:relative {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n position: relative;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:z-10 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n z-index: 10;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:border-ring {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n border-color: var(--ring);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-\\[3px\\] {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-ring\\/50 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .group-data-\\[side\\=left\\]\\:-right-4 {\n &:is(:where(.group)[data-side=\"left\"] *) {\n right: calc(var(--spacing) * -4);\n }\n }\n .group-data-\\[side\\=left\\]\\:border-r {\n &:is(:where(.group)[data-side=\"left\"] *) {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .group-data-\\[side\\=right\\]\\:left-0 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n left: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[side\\=right\\]\\:rotate-180 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[side\\=right\\]\\:border-l {\n &:is(:where(.group)[data-side=\"right\"] *) {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .group-data-\\[state\\=open\\]\\:rotate-180 {\n &:is(:where(.group)[data-state=\"open\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:rounded-lg {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-radius: var(--radius);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border-sidebar-border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-color: var(--sidebar-border);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:shadow-sm {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[variant\\=outline\\]\\/field-group\\:-mb-2 {\n &:is(:where(.group\\/field-group)[data-variant=\"outline\"] *) {\n margin-bottom: calc(var(--spacing) * -2);\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n display: block;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"top\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:top-full {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n top: 100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:mt-1\\.5 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n margin-top: calc(var(--spacing) * 1.5);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:overflow-hidden {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:rounded-md {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:border {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:bg-popover {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n background-color: var(--popover);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:text-popover-foreground {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n color: var(--popover-foreground);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:shadow {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:duration-200 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n }\n .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n &:is(:where(.group):is(.destructive) *) {\n border-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted) 40%, transparent);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:text-red-300 {\n &:is(:where(.group):is(.destructive) *) {\n color: var(--color-red-300);\n }\n }\n .peer-hover\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button):hover ~ *) {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50%;\n }\n }\n .peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button)[data-active=\"true\"] ~ *) {\n color: var(--sidebar-accent-foreground);\n }\n }\n .peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"default\"] ~ *) {\n top: calc(var(--spacing) * 1.5);\n }\n }\n .peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"lg\"] ~ *) {\n top: calc(var(--spacing) * 2.5);\n }\n }\n .peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1 {\n &:is(:where(.peer\\/menu-button)[data-size=\"sm\"] ~ *) {\n top: calc(var(--spacing) * 1);\n }\n }\n .selection\\:bg-primary {\n & *::selection {\n background-color: var(--primary);\n }\n &::selection {\n background-color: var(--primary);\n }\n }\n .selection\\:text-primary-foreground {\n & *::selection {\n color: var(--primary-foreground);\n }\n &::selection {\n color: var(--primary-foreground);\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7);\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--foreground);\n }\n }\n .placeholder\\:text-muted-foreground {\n &::placeholder {\n color: var(--muted-foreground);\n }\n }\n .after\\:absolute {\n &::after {\n content: var(--tw-content);\n position: absolute;\n }\n }\n .after\\:-inset-2 {\n &::after {\n content: var(--tw-content);\n inset: calc(var(--spacing) * -2);\n }\n }\n .after\\:inset-y-0 {\n &::after {\n content: var(--tw-content);\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .after\\:left-1\\/2 {\n &::after {\n content: var(--tw-content);\n left: calc(1/2 * 100%);\n }\n }\n .after\\:w-1 {\n &::after {\n content: var(--tw-content);\n width: calc(var(--spacing) * 1);\n }\n }\n .after\\:w-\\[2px\\] {\n &::after {\n content: var(--tw-content);\n width: 2px;\n }\n }\n .after\\:-translate-x-1\\/2 {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:after\\:left-full {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n &::after {\n content: var(--tw-content);\n left: 100%;\n }\n }\n }\n .first\\:rounded-l-md {\n &:first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .first\\:border-l {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .last\\:mt-0 {\n &:last-child {\n margin-top: calc(var(--spacing) * 0);\n }\n }\n .last\\:rounded-r-md {\n &:last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .last\\:border-0 {\n &:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .last\\:border-b-0 {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n .hover\\:scale-105 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:border-blue-400 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-blue-400);\n }\n }\n }\n .hover\\:border-primary {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n }\n }\n }\n .hover\\:border-primary\\/30 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-accent\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 5%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-background {\n &:hover {\n @media (hover: hover) {\n background-color: var(--background);\n }\n }\n }\n .hover\\:bg-destructive {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n }\n }\n }\n .hover\\:bg-muted\\/30 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-sidebar-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:text-destructive {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive);\n }\n }\n }\n .hover\\:text-destructive-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n .hover\\:text-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--foreground);\n }\n }\n }\n .hover\\:text-muted-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--muted-foreground);\n }\n }\n }\n .hover\\:text-primary {\n &:hover {\n @media (hover: hover) {\n color: var(--primary);\n }\n }\n }\n .hover\\:text-sidebar-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .hover\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .hover\\:shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-accent\\)\\)\\] {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-accent)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-lg {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-md {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:ring-4 {\n &:hover {\n @media (hover: hover) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar {\n &:hover {\n @media (hover: hover) {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n background-color: var(--sidebar);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 30%, transparent);\n }\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:bg-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-red-50 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-red-50);\n }\n }\n }\n }\n .hover\\:after\\:bg-sidebar-border {\n &:hover {\n @media (hover: hover) {\n &::after {\n content: var(--tw-content);\n background-color: var(--sidebar-border);\n }\n }\n }\n }\n .focus\\:z-10 {\n &:focus {\n z-index: 10;\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--accent);\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n .focus\\:opacity-100 {\n &:focus {\n opacity: 100%;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--ring);\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--destructive);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-red-400 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--color-red-400);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-offset-color: var(--color-red-600);\n }\n }\n }\n .focus-visible\\:z-10 {\n &:focus-visible {\n z-index: 10;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-0 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-1 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-2 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-4 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-primary {\n &:focus-visible {\n --tw-ring-color: var(--primary);\n }\n }\n .focus-visible\\:ring-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .focus-visible\\:ring-offset-1 {\n &:focus-visible {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus-visible\\:outline-hidden {\n &:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus-visible\\:outline-1 {\n &:focus-visible {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n }\n .focus-visible\\:outline-ring {\n &:focus-visible {\n outline-color: var(--ring);\n }\n }\n .active\\:bg-sidebar-accent {\n &:active {\n background-color: var(--sidebar-accent);\n }\n }\n .active\\:text-sidebar-accent-foreground {\n &:active {\n color: var(--sidebar-accent-foreground);\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .in-data-\\[side\\=left\\]\\:cursor-w-resize {\n :where(*[data-side=\"left\"]) & {\n cursor: w-resize;\n }\n }\n .in-data-\\[side\\=right\\]\\:cursor-e-resize {\n :where(*[data-side=\"right\"]) & {\n cursor: e-resize;\n }\n }\n .has-focus\\:border-ring {\n &:has(*:focus) {\n border-color: var(--ring);\n }\n }\n .has-focus\\:ring-\\[3px\\] {\n &:has(*:focus) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-focus\\:ring-ring\\/50 {\n &:has(*:focus) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-disabled\\:opacity-50 {\n &:has(*:disabled) {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-data-\\[state\\=checked\\]\\:border-primary {\n &:has(*[data-state=\"checked\"]) {\n border-color: var(--primary);\n }\n }\n .has-data-\\[state\\=checked\\]\\:bg-primary\\/5 {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n }\n .has-data-\\[variant\\=inset\\]\\:bg-sidebar {\n &:has(*[data-variant=\"inset\"]) {\n background-color: var(--sidebar);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n border-color: var(--ring);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-\\[3px\\] {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50 {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive {\n &:has(*:is([data-slot][aria-invalid=true])) {\n border-color: var(--destructive);\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20 {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto {\n &:has(>[data-align=block-end]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col {\n &:has(>[data-align=block-end]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto {\n &:has(>[data-align=block-start]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col {\n &:has(>[data-align=block-start]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2 {\n &:has(>[data-slot=button-group]) {\n gap: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>\\[data-slot\\=checkbox-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=checkbox-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:w-full {\n &:has(>[data-slot=field]) {\n width: 100%;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:flex-col {\n &:has(>[data-slot=field]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:rounded-md {\n &:has(>[data-slot=field]) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:border {\n &:has(>[data-slot=field]) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .has-\\[\\>\\[data-slot\\=radio-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=radio-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>button\\]\\:mr-\\[-0\\.4rem\\] {\n &:has(>button) {\n margin-right: -0.4rem;\n }\n }\n .has-\\[\\>button\\]\\:ml-\\[-0\\.45rem\\] {\n &:has(>button) {\n margin-left: -0.45rem;\n }\n }\n .has-\\[\\>kbd\\]\\:mr-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-right: -0.35rem;\n }\n }\n .has-\\[\\>kbd\\]\\:ml-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-left: -0.35rem;\n }\n }\n .has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\] {\n &:has(>svg) {\n grid-template-columns: calc(var(--spacing) * 4) 1fr;\n }\n }\n .has-\\[\\>svg\\]\\:gap-x-3 {\n &:has(>svg) {\n column-gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:p-0 {\n &:has(>svg) {\n padding: calc(var(--spacing) * 0);\n }\n }\n .has-\\[\\>svg\\]\\:px-2 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .has-\\[\\>textarea\\]\\:h-auto {\n &:has(>textarea) {\n height: auto;\n }\n }\n .aria-disabled\\:pointer-events-none {\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .aria-disabled\\:opacity-50 {\n &[aria-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .aria-selected\\:text-muted-foreground {\n &[aria-selected=\"true\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:z-10 {\n &[data-active=\"true\"] {\n z-index: 10;\n }\n }\n .data-\\[active\\=true\\]\\:border-ring {\n &[data-active=\"true\"] {\n border-color: var(--ring);\n }\n }\n .data-\\[active\\=true\\]\\:bg-accent\\/50 {\n &[data-active=\"true\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:bg-sidebar-accent {\n &[data-active=\"true\"] {\n background-color: var(--sidebar-accent);\n }\n }\n .data-\\[active\\=true\\]\\:font-medium {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .data-\\[active\\=true\\]\\:font-semibold {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n }\n .data-\\[active\\=true\\]\\:text-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-foreground {\n &[data-active=\"true\"] {\n color: var(--foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-sidebar-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--sidebar-accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:ring-\\[3px\\] {\n &[data-active=\"true\"] {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[active\\=true\\]\\:ring-ring\\/50 {\n &[data-active=\"true\"] {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:hover\\:bg-accent {\n &[data-active=\"true\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[active\\=true\\]\\:focus\\:bg-accent {\n &[data-active=\"true\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:border-destructive {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/20 {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50%;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive {\n &[data-error=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8);\n }\n }\n .data-\\[invalid\\=true\\]\\:text-destructive {\n &[data-invalid=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[motion\\=from-end\\]\\:slide-in-from-right-52 {\n &[data-motion=\"from-end\"] {\n --tw-enter-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=from-start\\]\\:slide-in-from-left-52 {\n &[data-motion=\"from-start\"] {\n --tw-enter-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\=to-end\\]\\:slide-out-to-right-52 {\n &[data-motion=\"to-end\"] {\n --tw-exit-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=to-start\\]\\:slide-out-to-left-52 {\n &[data-motion=\"to-start\"] {\n --tw-exit-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:animate-in {\n &[data-motion^=\"from-\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:fade-in {\n &[data-motion^=\"from-\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:animate-out {\n &[data-motion^=\"to-\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:fade-out {\n &[data-motion^=\"to-\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-1\\.5 {\n &[data-orientation=\"horizontal\"] {\n height: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-full {\n &[data-orientation=\"horizontal\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-px {\n &[data-orientation=\"horizontal\"] {\n height: 1px;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:w-full {\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-auto {\n &[data-orientation=\"vertical\"] {\n height: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-full {\n &[data-orientation=\"vertical\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:min-h-44 {\n &[data-orientation=\"vertical\"] {\n min-height: calc(var(--spacing) * 44);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-1\\.5 {\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-auto {\n &[data-orientation=\"vertical\"] {\n width: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-full {\n &[data-orientation=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-px {\n &[data-orientation=\"vertical\"] {\n width: 1px;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:flex-col {\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:h-px {\n &[data-panel-group-direction=\"vertical\"] {\n height: 1px;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:flex-col {\n &[data-panel-group-direction=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:left-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n left: calc(var(--spacing) * 0);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:h-1 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n height: calc(var(--spacing) * 1);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n width: 100%;\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:translate-x-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:-translate-y-1\\/2 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-md {\n &[data-range-end=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-r-md {\n &[data-range-end=\"true\"] {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:bg-primary {\n &[data-range-end=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-end\\=true\\]\\:text-primary-foreground {\n &[data-range-end=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[range-middle\\=true\\]\\:rounded-none {\n &[data-range-middle=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[range-middle\\=true\\]\\:bg-accent {\n &[data-range-middle=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[range-middle\\=true\\]\\:text-accent-foreground {\n &[data-range-middle=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-md {\n &[data-range-start=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-l-md {\n &[data-range-start=\"true\"] {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:bg-primary {\n &[data-range-start=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-start\\=true\\]\\:text-primary-foreground {\n &[data-range-start=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected-single\\=true\\]\\:bg-primary {\n &[data-selected-single=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[selected-single\\=true\\]\\:text-primary-foreground {\n &[data-selected-single=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected\\=true\\]\\:rounded-none {\n &[data-selected=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: calc(2*var(--spacing));\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: calc(2*var(--spacing));\n }\n }\n .data-\\[size\\=default\\]\\:h-9 {\n &[data-size=\"default\"] {\n height: calc(var(--spacing) * 9);\n }\n }\n .data-\\[size\\=sm\\]\\:h-8 {\n &[data-size=\"sm\"] {\n height: calc(var(--spacing) * 8);\n }\n }\n .\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90 {\n :is(& > *) {\n &[data-slot=\"alert-description\"] {\n color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .data-\\[slot\\=checkbox-group\\]\\:gap-3 {\n &[data-slot=\"checkbox-group\"] {\n gap: calc(var(--spacing) * 3);\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12);\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:ring-0 {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:outline-none {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n .data-\\[state\\=active\\]\\:bg-background {\n &[data-state=\"active\"] {\n background-color: var(--background);\n }\n }\n .data-\\[state\\=active\\]\\:shadow-sm {\n &[data-state=\"active\"] {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[state\\=checked\\]\\:translate-x-\\[calc\\(100\\%-2px\\)\\] {\n &[data-state=\"checked\"] {\n --tw-translate-x: calc(100% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[state\\=closed\\]\\:animate-accordion-up {\n &[data-state=\"closed\"] {\n animation: accordion-up 0.2s ease-out;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=closed\\]\\:duration-300 {\n &[data-state=\"closed\"] {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-80 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(80/100);\n --tw-exit-opacity: .8;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-bottom {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-left {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: -100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right-full {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: calc(1*100%);\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-top {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: -100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:animate-out {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:fade-out-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:zoom-out-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n }\n .data-\\[state\\=hidden\\]\\:animate-out {\n &[data-state=\"hidden\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=hidden\\]\\:fade-out {\n &[data-state=\"hidden\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=on\\]\\:bg-accent {\n &[data-state=\"on\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=on\\]\\:text-accent-foreground {\n &[data-state=\"on\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:animate-accordion-down {\n &[data-state=\"open\"] {\n animation: accordion-down 0.2s ease-out;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent\\/50 {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[state\\=open\\]\\:bg-secondary {\n &[data-state=\"open\"] {\n background-color: var(--secondary);\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:opacity-100 {\n &[data-state=\"open\"] {\n opacity: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:duration-500 {\n &[data-state=\"open\"] {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-90 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(90*1%);\n --tw-enter-scale: .9;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-bottom {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-left {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-right {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top-full {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: calc(1*-100%);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:animate-in {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:fade-in-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:zoom-in-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:focus\\:bg-accent {\n &[data-state=\"open\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[state\\=selected\\]\\:bg-muted {\n &[data-state=\"selected\"] {\n background-color: var(--muted);\n }\n }\n .data-\\[state\\=unchecked\\]\\:translate-x-0 {\n &[data-state=\"unchecked\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=unchecked\\]\\:bg-input {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n }\n }\n .data-\\[state\\=visible\\]\\:animate-in {\n &[data-state=\"visible\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=visible\\]\\:fade-in {\n &[data-state=\"visible\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[swipe\\=cancel\\]\\:translate-x-0 {\n &[data-swipe=\"cancel\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\] {\n &[data-swipe=\"end\"] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:animate-out {\n &[data-swipe=\"end\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\] {\n &[data-swipe=\"move\"] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=move\\]\\:transition-none {\n &[data-swipe=\"move\"] {\n transition-property: none;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--destructive);\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--destructive);\n }\n }\n }\n .data-\\[variant\\=label\\]\\:text-sm {\n &[data-variant=\"label\"] {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .data-\\[variant\\=legend\\]\\:text-base {\n &[data-variant=\"legend\"] {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n }\n .data-\\[variant\\=outline\\]\\:border-l-0 {\n &[data-variant=\"outline\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .data-\\[variant\\=outline\\]\\:shadow-xs {\n &[data-variant=\"outline\"] {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[variant\\=outline\\]\\:first\\:border-l {\n &[data-variant=\"outline\"] {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n margin-top: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"bottom\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-lg {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-left-radius: var(--radius);\n border-top-right-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:left-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n left: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"left\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:border-r {\n &[data-vaul-drawer-direction=\"left\"] {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:right-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n right: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"right\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:border-l {\n &[data-vaul-drawer-direction=\"right\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:top-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n top: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:mb-24 {\n &[data-vaul-drawer-direction=\"top\"] {\n margin-bottom: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"top\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-lg {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-right-radius: var(--radius);\n border-bottom-left-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:border-b {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .nth-last-2\\:-mt-1 {\n &:nth-last-child(2) {\n margin-top: calc(var(--spacing) * -1);\n }\n }\n .supports-\\[backdrop-filter\\]\\:bg-background\\/60 {\n @supports (backdrop-filter: var(--tw)) {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n }\n .sm\\:top-auto {\n @media (width >= 40rem) {\n top: auto;\n }\n }\n .sm\\:right-0 {\n @media (width >= 40rem) {\n right: calc(var(--spacing) * 0);\n }\n }\n .sm\\:bottom-0 {\n @media (width >= 40rem) {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .sm\\:col-span-2 {\n @media (width >= 40rem) {\n grid-column: span 2 / span 2;\n }\n }\n .sm\\:block {\n @media (width >= 40rem) {\n display: block;\n }\n }\n .sm\\:flex {\n @media (width >= 40rem) {\n display: flex;\n }\n }\n .sm\\:max-w-\\[600px\\] {\n @media (width >= 40rem) {\n max-width: 600px;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg);\n }\n }\n .sm\\:max-w-sm {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n .sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .sm\\:flex-col {\n @media (width >= 40rem) {\n flex-direction: column;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end;\n }\n }\n .sm\\:gap-2\\.5 {\n @media (width >= 40rem) {\n gap: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pr-2\\.5 {\n @media (width >= 40rem) {\n padding-right: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pl-2\\.5 {\n @media (width >= 40rem) {\n padding-left: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left;\n }\n }\n .data-\\[state\\=open\\]\\:sm\\:slide-in-from-bottom-full {\n &[data-state=\"open\"] {\n @media (width >= 40rem) {\n --tw-enter-translate-y: calc(1*100%);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"left\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"right\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .md\\:absolute {\n @media (width >= 48rem) {\n position: absolute;\n }\n }\n .md\\:-left-24 {\n @media (width >= 48rem) {\n left: calc(var(--spacing) * -24);\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2;\n }\n }\n .md\\:ml-12 {\n @media (width >= 48rem) {\n margin-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .md\\:w-20 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 20);\n }\n }\n .md\\:w-80 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 80);\n }\n }\n .md\\:w-\\[var\\(--radix-navigation-menu-viewport-width\\)\\] {\n @media (width >= 48rem) {\n width: var(--radix-navigation-menu-viewport-width);\n }\n }\n .md\\:w-auto {\n @media (width >= 48rem) {\n width: auto;\n }\n }\n .md\\:max-w-\\[420px\\] {\n @media (width >= 48rem) {\n max-width: 420px;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .md\\:grid-cols-3 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .md\\:flex-row {\n @media (width >= 48rem) {\n flex-direction: row;\n }\n }\n .md\\:items-center {\n @media (width >= 48rem) {\n align-items: center;\n }\n }\n .md\\:gap-1\\.5 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 1.5);\n }\n }\n .md\\:p-12 {\n @media (width >= 48rem) {\n padding: calc(var(--spacing) * 12);\n }\n }\n .md\\:px-6 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 6);\n }\n }\n .md\\:pl-12 {\n @media (width >= 48rem) {\n padding-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:text-left {\n @media (width >= 48rem) {\n text-align: left;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .md\\:opacity-0 {\n @media (width >= 48rem) {\n opacity: 0%;\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:m-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin: calc(var(--spacing) * 2);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:ml-0 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin-left: calc(var(--spacing) * 0);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n border-radius: calc(var(--radius) + 4px);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ml-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n &:is(:where(.peer)[data-state=\"collapsed\"] ~ *) {\n margin-left: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .md\\:after\\:hidden {\n @media (width >= 48rem) {\n &::after {\n content: var(--tw-content);\n display: none;\n }\n }\n }\n .lg\\:col-span-2 {\n @media (width >= 64rem) {\n grid-column: span 2 / span 2;\n }\n }\n .lg\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-3 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-4 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .xl\\:grid-cols-4 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .\\@md\\/field-group\\:flex-row {\n @container field-group (width >= 28rem) {\n flex-direction: row;\n }\n }\n .\\@md\\/field-group\\:items-center {\n @container field-group (width >= 28rem) {\n align-items: center;\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n }\n .dark\\:border-blue-800 {\n &:is(.dark *) {\n border-color: var(--color-blue-800);\n }\n }\n .dark\\:border-blue-800\\/30 {\n &:is(.dark *) {\n border-color: color-mix(in srgb, oklch(42.4% 0.199 265.638) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-blue-800) 30%, transparent);\n }\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:border-pink-800\\/30 {\n &:is(.dark *) {\n border-color: color-mix(in srgb, oklch(45.9% 0.187 3.815) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-pink-800) 30%, transparent);\n }\n }\n }\n .dark\\:bg-blue-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-blue-950 {\n &:is(.dark *) {\n background-color: var(--color-blue-950);\n }\n }\n .dark\\:bg-blue-950\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(28.2% 0.091 267.935) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-950) 20%, transparent);\n }\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:bg-pink-950\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(28.4% 0.109 3.907) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-pink-950) 20%, transparent);\n }\n }\n }\n .dark\\:bg-transparent {\n &:is(.dark *) {\n background-color: transparent;\n }\n }\n .dark\\:bg-yellow-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(42.1% 0.095 57.708) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-yellow-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-yellow-950 {\n &:is(.dark *) {\n background-color: var(--color-yellow-950);\n }\n }\n .dark\\:text-blue-200 {\n &:is(.dark *) {\n color: var(--color-blue-200);\n }\n }\n .dark\\:text-muted-foreground {\n &:is(.dark *) {\n color: var(--muted-foreground);\n }\n }\n .dark\\:text-yellow-200 {\n &:is(.dark *) {\n color: var(--color-yellow-200);\n }\n }\n .dark\\:ring-blue-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-blue-800);\n }\n }\n .dark\\:ring-yellow-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-yellow-800);\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-accent-foreground {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:has-data-\\[state\\=checked\\]\\:bg-primary\\/10 {\n &:is(.dark *) {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n }\n }\n .dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:border-input {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n border-color: var(--input);\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:bg-input\\/30 {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:text-foreground {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary-foreground {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary-foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-foreground {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-input\\/80 {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 80%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n &:is(.dark *) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n }\n .\\[\\&_\\.recharts-cartesian-axis-tick_text\\]\\:fill-muted-foreground {\n & .recharts-cartesian-axis-tick text {\n fill: var(--muted-foreground);\n }\n }\n .\\[\\&_\\.recharts-cartesian-grid_line\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border\\/50 {\n & .recharts-cartesian-grid line[stroke='#ccc'] {\n stroke: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n stroke: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n }\n .\\[\\&_\\.recharts-curve\\.recharts-tooltip-cursor\\]\\:stroke-border {\n & .recharts-curve.recharts-tooltip-cursor {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-dot\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-dot[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-layer\\]\\:outline-hidden {\n & .recharts-layer {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-polar-grid_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-polar-grid [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-radial-bar-background-sector\\]\\:fill-muted {\n & .recharts-radial-bar-background-sector {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-rectangle\\.recharts-tooltip-cursor\\]\\:fill-muted {\n & .recharts-rectangle.recharts-tooltip-cursor {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-reference-line_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-reference-line [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-sector\\]\\:outline-hidden {\n & .recharts-sector {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-sector\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-sector[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-surface\\]\\:outline-hidden {\n & .recharts-surface {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_img\\]\\:size-full {\n & img {\n width: 100%;\n height: 100%;\n }\n }\n .\\[\\&_img\\]\\:object-cover {\n & img {\n object-fit: cover;\n }\n }\n .\\[\\&_p\\]\\:leading-relaxed {\n & p {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-6 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_tr\\]\\:border-b {\n & tr {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .\\[\\&_tr\\:last-child\\]\\:border-0 {\n & tr:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\+\\[data-slot\\=item-content\\]\\]\\:flex-none {\n &+[data-slot=item-content] {\n flex: none;\n }\n }\n .\\[\\&\\:first-child\\[data-selected\\=true\\]_button\\]\\:rounded-l-md {\n &:first-child[data-selected=true] button {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-0 {\n &:has([role=checkbox]) {\n padding-right: calc(var(--spacing) * 0);\n }\n }\n .\\[\\.border-b\\]\\:pb-3 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-3 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_next\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_next>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_previous\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_previous>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\:last-child\\[data-selected\\=true\\]_button\\]\\:rounded-r-md {\n &:last-child[data-selected=true] button {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\>\\*\\]\\:w-full {\n &>* {\n width: 100%;\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:relative {\n &>* {\n &:focus-visible {\n position: relative;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:z-10 {\n &>* {\n &:focus-visible {\n z-index: 10;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:data-\\[slot\\=field\\]\\:p-4 {\n &>* {\n &[data-slot=\"field\"] {\n padding: calc(var(--spacing) * 4);\n }\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\*\\]\\:w-auto {\n @container field-group (width >= 28rem) {\n &>* {\n width: auto;\n }\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-l-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0 {\n &>*:not(:first-child) {\n border-top-style: var(--tw-border-style);\n border-top-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-l-0 {\n &>*:not(:first-child) {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-r-none {\n &>*:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none {\n &>*:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\.sr-only\\]\\:w-auto {\n &>.sr-only {\n width: auto;\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-group\\]\\]\\:gap-4 {\n &>[data-slot=field-group] {\n gap: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n @container field-group (width >= 28rem) {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n }\n .has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-r-md {\n &:has(*:is(select[aria-hidden=true]:last-child)) {\n &>[data-slot=select-trigger]:last-of-type {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n }\n .\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=\\'w-\\'\\]\\)\\]\\:w-fit {\n &>[data-slot=select-trigger]:not([class*='w-']) {\n width: fit-content;\n }\n }\n .\\[\\&\\>\\[role\\=checkbox\\]\\]\\:translate-y-\\[2px\\] {\n &>[role=checkbox] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n }\n .\\[\\&\\>a\\]\\:underline {\n &>a {\n text-decoration-line: underline;\n }\n }\n .\\[\\&\\>a\\]\\:underline-offset-4 {\n &>a {\n text-underline-offset: 4px;\n }\n }\n .\\[\\&\\>a\\:hover\\]\\:text-primary {\n &>a:hover {\n color: var(--primary);\n }\n }\n .\\[\\&\\>button\\]\\:hidden {\n &>button {\n display: none;\n }\n }\n .\\[\\&\\>input\\]\\:flex-1 {\n &>input {\n flex: 1;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3 {\n &:has(>[data-align=block-end]) {\n &>input {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3 {\n &:has(>[data-align=block-start]) {\n &>input {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pr-2 {\n &:has(>[data-align=inline-end]) {\n &>input {\n padding-right: calc(var(--spacing) * 2);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:pl-2 {\n &:has(>[data-align=inline-start]) {\n &>input {\n padding-left: calc(var(--spacing) * 2);\n }\n }\n }\n .\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n &>kbd {\n border-radius: calc(var(--radius) - 5px);\n }\n }\n .\\[\\&\\>span\\]\\:text-xs {\n &>span {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&\\>span\\]\\:opacity-70 {\n &>span {\n opacity: 70%;\n }\n }\n .\\[\\&\\>span\\:last-child\\]\\:truncate {\n &>span:last-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n .\\[\\&\\>svg\\]\\:pointer-events-none {\n &>svg {\n pointer-events: none;\n }\n }\n .\\[\\&\\>svg\\]\\:size-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:size-3\\.5 {\n &>svg {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\]\\:size-4 {\n &>svg {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>svg\\]\\:h-2\\.5 {\n &>svg {\n height: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:h-3 {\n &>svg {\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:w-2\\.5 {\n &>svg {\n width: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:w-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:shrink-0 {\n &>svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&\\>svg\\]\\:translate-y-0\\.5 {\n &>svg {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .\\[\\&\\>svg\\]\\:text-current {\n &>svg {\n color: currentcolor;\n }\n }\n .\\[\\&\\>svg\\]\\:text-muted-foreground {\n &>svg {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground {\n &>svg {\n color: var(--sidebar-accent-foreground);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>tr\\]\\:last\\:border-b-0 {\n &>tr {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n }\n .\\[\\&\\[data-panel-group-direction\\=vertical\\]\\>div\\]\\:rotate-90 {\n &[data-panel-group-direction=vertical]>div {\n rotate: 90deg;\n }\n }\n .\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180 {\n &[data-state=open]>svg {\n rotate: 180deg;\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-right-2 {\n [data-side=left][data-collapsible=offcanvas] & {\n right: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize {\n [data-side=left][data-state=collapsed] & {\n cursor: e-resize;\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-left-2 {\n [data-side=right][data-collapsible=offcanvas] & {\n left: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize {\n [data-side=right][data-state=collapsed] & {\n cursor: w-resize;\n }\n }\n .\\[\\[data-slot\\=card-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=card-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=popover-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=popover-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20 {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 20%, transparent);\n }\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background {\n [data-slot=tooltip-content] & {\n color: var(--background);\n }\n }\n .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10 {\n &:is(.dark *) {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 10%, transparent);\n }\n }\n }\n }\n .\\[\\[data-variant\\=legend\\]\\+\\&\\]\\:-mt-1\\.5 {\n [data-variant=legend]+& {\n margin-top: calc(var(--spacing) * -1.5);\n }\n }\n .\\[a\\&\\]\\:transition-colors {\n a& {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent\\/50 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-destructive\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-primary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-secondary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:text-accent-foreground {\n a& {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: forwards;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(0.97 0.01 90);\n --foreground: oklch(0.2 0.02 265);\n --card: oklch(0.98 0.005 90);\n --card-foreground: oklch(0.2 0.02 265);\n --popover: oklch(0.98 0.005 90);\n --popover-foreground: oklch(0.2 0.02 265);\n --primary: oklch(0.45 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.85 0.05 85);\n --secondary-foreground: oklch(0.3 0.05 50);\n --muted: oklch(0.92 0.01 90);\n --muted-foreground: oklch(0.45 0.02 265);\n --accent: oklch(0.94 0.02 85);\n --accent-foreground: oklch(0.3 0.05 50);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.88 0.01 90);\n --input: oklch(0.88 0.01 90);\n --ring: oklch(0.45 0.15 25);\n --radius: 0.5rem;\n --sidebar: oklch(0.96 0.01 90);\n --sidebar-foreground: oklch(0.25 0.02 265);\n --sidebar-primary: oklch(0.45 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.93 0.01 90);\n --sidebar-accent-foreground: oklch(0.25 0.02 265);\n --sidebar-border: oklch(0.88 0.01 90);\n --sidebar-ring: oklch(0.45 0.15 25);\n --chart-1: oklch(0.45 0.15 25);\n --chart-2: oklch(0.65 0.12 50);\n --chart-3: oklch(0.35 0.08 200);\n --chart-4: oklch(0.55 0.05 265);\n --chart-5: oklch(0.75 0.1 85);\n}\n.dark {\n --background: oklch(0.12 0.01 265);\n --foreground: oklch(0.95 0.01 90);\n --card: oklch(0.15 0.01 265);\n --card-foreground: oklch(0.95 0.01 90);\n --popover: oklch(0.15 0.01 265);\n --popover-foreground: oklch(0.95 0.01 90);\n --primary: oklch(0.6 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.3 0.05 50);\n --secondary-foreground: oklch(0.9 0.05 85);\n --muted: oklch(0.2 0.01 265);\n --muted-foreground: oklch(0.65 0.01 265);\n --accent: oklch(0.2 0.02 265);\n --accent-foreground: oklch(0.95 0.01 90);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.25 0.01 265);\n --input: oklch(0.25 0.01 265);\n --ring: oklch(0.6 0.15 25);\n --sidebar: oklch(0.14 0.01 265);\n --sidebar-foreground: oklch(0.95 0.01 90);\n --sidebar-primary: oklch(0.6 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.2 0.01 265);\n --sidebar-accent-foreground: oklch(0.95 0.01 90);\n --sidebar-border: oklch(0.25 0.01 265);\n --sidebar-ring: oklch(0.6 0.15 25);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-gradient-position {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-via {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-to {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-via-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from-position {\n syntax: \"\";\n inherits: false;\n initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n syntax: \"\";\n inherits: false;\n initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity,1);\n transform: translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity,1);\n transform: translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n to {\n height: 0;\n }\n}\n@keyframes caret-blink {\n 0%,70%,100% {\n opacity: 1;\n }\n 20%,50% {\n opacity: 0;\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-content: \"\";\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: forwards;\n --tw-animation-iteration-count: 1;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}\n"],"names":[],"mappings":"AACA;EA62ME;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA72MJ;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFF;EA6GE;;;;;;;EAAA;;;;;;;EAMA;;;;;;;;;;EASA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;;;;EAKA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;;;;;;;EAAA;;;;;;;;;;;EAUA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;IACE;;;;IAEE;MAAgD;;;;;;EAKpD;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAyxLA;;;;;EAGE;IAAgD;;;;;EAIlD;;;;;EAIA;;;;;;;AAhiMF;;AAAA;EAiQE;;;;EAIA;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;;;;;;EAWA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAI3B;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;EAMA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAIE;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAMF;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;;EAKA;;;;;;EAKA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAG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"}}] } \ No newline at end of file diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js index 32aeab8b..882b1d94 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js @@ -658,7 +658,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, @@ -1962,27 +1962,43 @@ function MembersPage() { "MembersPage.useMemo[membersByGeneration]": (a, b)=>a[0] - b[0] }["MembersPage.useMemo[membersByGeneration]"]).map({ "MembersPage.useMemo[membersByGeneration]": ([generation, members])=>{ - // 对每个世代的成员进行排序 - const sortedMembers = [ - ...members + // 区分家族成员和配偶 + const familyMembers = members.filter({ + "MembersPage.useMemo[membersByGeneration].familyMembers": (m)=>{ + // 家族成员:有父母关系 或 明确标记为始祖 + const isFounder = m.tags?.includes('始祖'); + const hasFamilyParents = m.fatherId || m.motherId; + // 如果有父母关系,肯定是家族成员 + if (hasFamilyParents) return true; + // 如果明确标记为始祖,是家族成员 + if (isFounder) return true; + // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况) + if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true; + // 其他情况(如第1世但有配偶且没有父母的)是配偶身份 + return false; + } + }["MembersPage.useMemo[membersByGeneration].familyMembers"]); + // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低) + const sortedFamilyMembers = [ + ...familyMembers ].sort({ - "MembersPage.useMemo[membersByGeneration].sortedMembers": (a, b)=>{ + "MembersPage.useMemo[membersByGeneration].sortedFamilyMembers": (a, b)=>{ // 1. 始祖永远排第一 - const aIsFounder = a.tags?.includes('始祖') || a.generation === 1; - const bIsFounder = b.tags?.includes('始祖') || b.generation === 1; + const aIsFounder = a.tags?.includes('始祖'); + const bIsFounder = b.tags?.includes('始祖'); if (aIsFounder && !bIsFounder) return -1; if (!aIsFounder && bIsFounder) return 1; - // 2. 按出生日期排序 - return (a.birthDate || "").localeCompare(b.birthDate || ""); + // 2. 按出生日期排序(早出生的在前 = 年龄大的在前) + const aDate = a.birthDate || "9999-12-31"; + const bDate = b.birthDate || "9999-12-31"; + return aDate.localeCompare(bDate); } - }["MembersPage.useMemo[membersByGeneration].sortedMembers"]); + }["MembersPage.useMemo[membersByGeneration].sortedFamilyMembers"]); // 3. 将配偶插入到主成员后面 const result = []; const processedSpouses = new Set(); - sortedMembers.forEach({ + sortedFamilyMembers.forEach({ "MembersPage.useMemo[membersByGeneration]": (member)=>{ - // 跳过已经作为配偶处理过的成员 - if (processedSpouses.has(member.id)) return; result.push(member); // 如果有配偶,将配偶紧跟在后面 if (member.spouseIds && member.spouseIds.length > 0) { @@ -1997,6 +2013,12 @@ function MembersPage() { } } }["MembersPage.useMemo[membersByGeneration]"]); + } else { + // 没有配偶,添加空白占位符 + result.push({ + id: `placeholder-${member.id}`, + isPlaceholder: true + }); } } }["MembersPage.useMemo[membersByGeneration]"]); @@ -2026,7 +2048,7 @@ function MembersPage() { children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$site$2d$header$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 188, + lineNumber: 209, columnNumber: 7 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("main", { @@ -2043,7 +2065,7 @@ function MembersPage() { children: "家族成员列表" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 192, + lineNumber: 213, columnNumber: 13 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2056,7 +2078,7 @@ function MembersPage() { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 195, + lineNumber: 216, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Input"], { @@ -2067,13 +2089,13 @@ function MembersPage() { onChange: (e)=>setQuery(e.target.value) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 196, + lineNumber: 217, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 194, + lineNumber: 215, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2086,20 +2108,20 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 210, + lineNumber: 231, columnNumber: 17 }, this), activeFilterCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "absolute -top-1 -right-1 h-3 w-3 rounded-full bg-primary border-2 border-background" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 212, + lineNumber: 233, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 204, + lineNumber: 225, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], { @@ -2111,31 +2133,31 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 217, + lineNumber: 238, columnNumber: 19 }, this), "新增成员" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 216, + lineNumber: 237, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 215, + lineNumber: 236, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 193, + lineNumber: 214, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 191, + lineNumber: 212, columnNumber: 11 }, this), showFilters && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2149,7 +2171,7 @@ function MembersPage() { children: "高级筛选" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 228, + lineNumber: 249, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2162,20 +2184,20 @@ function MembersPage() { className: "mr-1 h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 230, + lineNumber: 251, columnNumber: 19 }, this), " 重置筛选" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 229, + lineNumber: 250, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 227, + lineNumber: 248, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2189,7 +2211,7 @@ function MembersPage() { children: "姓氏 (Surname)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 235, + lineNumber: 256, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2201,12 +2223,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 238, + lineNumber: 259, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 237, + lineNumber: 258, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2216,7 +2238,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 241, + lineNumber: 262, columnNumber: 23 }, this), uniqueSurnames.map((s)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2224,25 +2246,25 @@ function MembersPage() { children: s }, s, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 243, + lineNumber: 264, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 240, + lineNumber: 261, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 236, + lineNumber: 257, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 234, + lineNumber: 255, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2253,7 +2275,7 @@ function MembersPage() { children: "籍贯 (Ancestral Home)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 252, + lineNumber: 273, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2265,12 +2287,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 255, + lineNumber: 276, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 254, + lineNumber: 275, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2280,7 +2302,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 258, + lineNumber: 279, columnNumber: 23 }, this), uniqueHomes.map((h)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2288,25 +2310,25 @@ function MembersPage() { children: h }, h, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 260, + lineNumber: 281, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 257, + lineNumber: 278, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 253, + lineNumber: 274, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 251, + lineNumber: 272, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2317,7 +2339,7 @@ function MembersPage() { children: "状态 (Status)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 269, + lineNumber: 290, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2329,12 +2351,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 272, + lineNumber: 293, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 271, + lineNumber: 292, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2344,7 +2366,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 275, + lineNumber: 296, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2352,7 +2374,7 @@ function MembersPage() { children: "在世 (Living)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 276, + lineNumber: 297, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2360,25 +2382,25 @@ function MembersPage() { children: "已故 (Deceased)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 277, + lineNumber: 298, columnNumber: 23 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 274, + lineNumber: 295, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 270, + lineNumber: 291, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 268, + lineNumber: 289, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2392,7 +2414,7 @@ function MembersPage() { children: "世系范围 (Generation)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 284, + lineNumber: 305, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -2405,13 +2427,13 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 285, + lineNumber: 306, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 283, + lineNumber: 304, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$slider$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Slider"], { @@ -2427,31 +2449,31 @@ function MembersPage() { className: "py-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 289, + lineNumber: 310, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 282, + lineNumber: 303, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 233, + lineNumber: 254, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 226, + lineNumber: 247, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 190, + lineNumber: 211, columnNumber: 9 }, this), filteredMembers.length === 0 ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2459,7 +2481,7 @@ function MembersPage() { children: "没有找到匹配的成员。" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 305, + lineNumber: 326, columnNumber: 11 }, this) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "space-y-8", @@ -2477,7 +2499,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 313, + lineNumber: 334, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -2489,25 +2511,35 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 314, + lineNumber: 335, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "flex-1 h-px bg-border" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 315, + lineNumber: 336, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 312, + lineNumber: 333, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4", children: members.map((member)=>{ + // 检查是否是占位符 + if (member.isPlaceholder) { + return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { + className: "invisible" + }, member.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 342, + columnNumber: 30 + }, this); + } // 判断是否是配偶: // 1. 没有父母ID // 2. 有配偶ID @@ -2523,7 +2555,7 @@ function MembersPage() { /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], { href: `/members/${member.id}`, children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Card"], { - className: "hover:border-primary transition-colors cursor-pointer h-full", + className: `hover:border-primary transition-colors cursor-pointer h-full ${isSpouse ? 'bg-pink-50/50 dark:bg-pink-950/20 border-pink-200/50 dark:border-pink-800/30' : 'bg-blue-50/50 dark:bg-blue-950/20 border-blue-200/50 dark:border-blue-800/30'}`, children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardContent"], { className: "p-3 flex items-center gap-3", children: [ @@ -2538,7 +2570,7 @@ function MembersPage() { className: "h-20 w-20 border-2 border-border" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 338, + lineNumber: 368, columnNumber: 29 }, this), member.deathDate && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2546,7 +2578,7 @@ function MembersPage() { title: "已故" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 347, + lineNumber: 377, columnNumber: 31 }, this), !member.deathDate && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2554,13 +2586,13 @@ function MembersPage() { title: "在世" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 350, + lineNumber: 380, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 337, + lineNumber: 367, columnNumber: 27 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2580,18 +2612,18 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 358, + lineNumber: 388, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 355, + lineNumber: 385, columnNumber: 31 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 354, + lineNumber: 384, columnNumber: 29 }, this), isFounder ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -2599,7 +2631,7 @@ function MembersPage() { children: "家族始祖" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 365, + lineNumber: 395, columnNumber: 31 }, this) : isSpouse && spouseName ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { className: "text-[11px] text-purple-700 mt-0.5 truncate", @@ -2609,14 +2641,14 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 369, + lineNumber: 399, columnNumber: 31 }, this) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { className: "text-[11px] text-muted-foreground mt-0.5 truncate", children: member.generationName ? `字辈: ${member.generationName}` : "未录入字辈" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 373, + lineNumber: 403, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2627,7 +2659,7 @@ function MembersPage() { children: member.ancestralHome || "籍贯未知" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 380, + lineNumber: 410, columnNumber: 31 }, this), (member.birthDate || member.deathDate) && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2641,7 +2673,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 385, + lineNumber: 415, columnNumber: 35 }, this), (()=>{ @@ -2654,20 +2686,20 @@ function MembersPage() { children: member.deathDate ? `享年${age}岁` : `${age}岁` }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 396, + lineNumber: 426, columnNumber: 39 }, this); })() ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 384, + lineNumber: 414, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 379, + lineNumber: 409, columnNumber: 29 }, this), member.tags && member.tags.length > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2677,34 +2709,34 @@ function MembersPage() { children: tag }, tag, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 408, + lineNumber: 438, columnNumber: 35 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 406, + lineNumber: 436, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 353, + lineNumber: 383, columnNumber: 27 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 336, + lineNumber: 366, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 335, + lineNumber: 361, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 334, + lineNumber: 360, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2720,47 +2752,47 @@ function MembersPage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 431, + lineNumber: 461, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 421, + lineNumber: 451, columnNumber: 21 }, this) ] }, member.id, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 333, + lineNumber: 359, columnNumber: 21 }, this); }) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 317, + lineNumber: 338, columnNumber: 17 }, this) ] }, generation, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 311, + lineNumber: 332, columnNumber: 15 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 309, + lineNumber: 330, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 189, + lineNumber: 210, columnNumber: 7 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 187, + lineNumber: 208, columnNumber: 5 }, this); } diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map index 0a5e2f22..0df9a842 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map @@ -4,10 +4,10 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;KAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,mXAAC,4bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS"}}, {"offset": {"line": 67, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1307, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/db.ts"],"sourcesContent":["import Dexie, { type Table } from \"dexie\"\nimport type { FamilyMember } from \"@/types/family\"\n\nexport interface GlobalSettings {\n key: string\n value: any\n}\n\nexport interface StoredImage {\n id: string\n blob: Blob\n mimeType: string\n createdAt: string\n}\n\nexport interface ActivityLog {\n id: string\n action: \"create\" | \"update\" | \"delete\" | \"import\" | \"export\"\n entityType: \"member\" | \"photo\" | \"story\" | \"settings\"\n entityId?: string\n entityName?: string\n changes?: any\n timestamp: string\n userId?: string\n userName?: string\n}\n\nexport class FamilyTreeDB extends Dexie {\n members!: Table\n settings!: Table\n images!: Table\n activityLogs!: Table\n\n constructor() {\n super(\"FamilyTreeDB\")\n this.version(1).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n })\n this.version(2).stores({\n members: \"id, fullName, fatherId, motherId, [fatherId+motherId]\", // Index for searching\n settings: \"key\", // Key-value store for rootId etc.\n images: \"id\", // Store images by ID\n activityLogs: \"id, timestamp, action, entityType, entityId\",\n })\n }\n}\n\nexport const db = new FamilyTreeDB()\n"],"names":[],"mappings":";;;;;;AAAA;;AA2BO,MAAM,qBAAqB,kQAAK;IACrC,QAA6B;IAC7B,SAAgC;IAChC,OAA2B;IAC3B,aAAiC;IAEjC,aAAc;QACZ,KAAK,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;QACV;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;YACT,UAAU;YACV,QAAQ;YACR,cAAc;QAChB;IACF;AACF;AAEO,MAAM,KAAK,IAAI"}}, {"offset": {"line": 1343, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { db } from \"@/lib/db\"\nimport { CircleUser, CircleUserRound } from \"lucide-react\"\nimport type { Gender } from \"@/types/family\"\n\ninterface AvatarDisplayProps {\n imageId?: string\n fallbackUrl?: string\n fallbackText?: string\n gender?: Gender\n className?: string\n}\n\nexport function AvatarDisplay({ imageId, fallbackUrl, fallbackText, gender, className }: AvatarDisplayProps) {\n const [blobUrl, setBlobUrl] = useState(undefined)\n\n useEffect(() => {\n if (imageId) {\n db.images.get(imageId).then((image) => {\n if (image) {\n const url = URL.createObjectURL(image.blob)\n setBlobUrl(url)\n return () => URL.revokeObjectURL(url)\n }\n })\n } else {\n setBlobUrl(undefined)\n }\n }, [imageId])\n\n // 如果有头像,显示头像\n if (blobUrl) {\n return (\n \n \n {fallbackText}\n \n )\n }\n\n // 没有头像,显示性别图标\n return (\n \n \n {gender === 'FEMALE' ? (\n \n ) : (\n \n )}\n \n \n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AAAA;;;AALA;;;;;AAgBO,SAAS,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAsB;;IACzG,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,+VAAQ,EAAqB;IAE3D,IAAA,gWAAS;mCAAC;YACR,IAAI,SAAS;gBACX,yKAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI;+CAAC,CAAC;wBAC3B,IAAI,OAAO;4BACT,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;4BAC1C,WAAW;4BACX;2DAAO,IAAM,IAAI,eAAe,CAAC;;wBACnC;oBACF;;YACF,OAAO;gBACL,WAAW;YACb;QACF;kCAAG;QAAC;KAAQ;IAEZ,aAAa;IACb,IAAI,SAAS;QACX,qBACE,mXAAC,+LAAM;YAAC,WAAW;;8BACjB,mXAAC,oMAAW;oBAAC,KAAK;;;;;;8BAClB,mXAAC,uMAAc;oBAAC,WAAU;8BAA+B;;;;;;;;;;;;IAG/D;IAEA,cAAc;IACd,qBACE,mXAAC,+LAAM;QAAC,WAAW;kBACjB,cAAA,mXAAC,uMAAc;YAAC,WAAU;sBACvB,WAAW,yBACV,mXAAC,iYAAe;gBAAC,WAAU;;;;;qCAE3B,mXAAC,8WAAU;gBAAC,WAAU;;;;;;;;;;;;;;;;AAKhC;GAvCgB;KAAA"}}, {"offset": {"line": 1451, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,4KAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,mXAAC,wbAAoB;gBAAC,OAAO;0BAC3B,cAAA,mXAAC,yXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;MAxBS;AA0BT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,mXAAC,0bAAsB;kBACrB,cAAA,mXAAC,2bAAuB;YACtB,aAAU;YACV,WAAW,IAAA,4KAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,mXAAC;;;;;8BACD,mXAAC,4bAAwB;oBACvB,WAAW,IAAA,4KAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,mXAAC;;;;;;;;;;;;;;;;AAIT;MAjCS;AAmCT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,mXAAC;gBAAK,WAAU;0BACd,cAAA,mXAAC,icAA6B;8BAC5B,cAAA,mXAAC,mWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,mXAAC,4bAAwB;0BAAE;;;;;;;;;;;;AAGjC;MAtBS;AAwBT,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,mXAAC,6bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,mXAAC,kcAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,mXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;MAhBS;AAkBT,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,mXAAC,ocAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,yXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC;MAhBS"}}, {"offset": {"line": 1708, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/slider.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '@/lib/utils'\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n )\n\n return (\n \n \n \n \n {Array.from({ length: _values.length }, (_, index) => (\n \n ))}\n \n )\n}\n\nexport { Slider }\n"],"names":[],"mappings":";;;;;AAEA;AACA;AAEA;;;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,MAAM,CAAC,EACP,MAAM,GAAG,EACT,GAAG,OAC+C;;IAClD,MAAM,UAAU,8VAAa;mCAC3B,IACE,MAAM,OAAO,CAAC,SACV,QACA,MAAM,OAAO,CAAC,gBACZ,eACA;gBAAC;gBAAK;aAAI;kCAClB;QAAC;QAAO;QAAc;QAAK;KAAI;IAGjC,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,cAAc;QACd,OAAO;QACP,KAAK;QACL,KAAK;QACL,WAAW,IAAA,4KAAE,EACX,uOACA;QAED,GAAG,KAAK;;0BAET,mXAAC,ybAAqB;gBACpB,aAAU;gBACV,WACE;0BAGF,cAAA,mXAAC,ybAAqB;oBACpB,aAAU;oBACV,WACE;;;;;;;;;;;YAIL,MAAM,IAAI,CAAC;gBAAE,QAAQ,QAAQ,MAAM;YAAC,GAAG,CAAC,GAAG,sBAC1C,mXAAC,ybAAqB;oBACpB,aAAU;oBAEV,WAAU;mBADL;;;;;;;;;;;AAMf;GArDS;KAAA"}}, - {"offset": {"line": 1789, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 对每个世代的成员进行排序\n const sortedMembers = [...members].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖') || a.generation === 1\n const bIsFounder = b.tags?.includes('始祖') || b.generation === 1\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序\n return (a.birthDate || \"\").localeCompare(b.birthDate || \"\")\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedMembers.forEach(member => {\n // 跳过已经作为配偶处理过的成员\n if (processedSpouses.has(member.id)) return\n \n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

\n
\n
\n \n setQuery(e.target.value)}\n />\n
\n 0 ? \"secondary\" : \"outline\"}\n size=\"icon\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"relative\"\n >\n \n {activeFilterCount > 0 && (\n \n )}\n \n \n \n \n
\n
\n\n {/* Filter Bar */}\n {showFilters && (\n
\n
\n

高级筛选

\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n \n \n {generationRange[0]} - {generationRange[1]} 世\n \n
\n setGenerationRange(val as [number, number])}\n className=\"py-4\"\n />\n
\n
\n
\n )}\n
\n\n {filteredMembers.length === 0 ? (\n
\n 没有找到匹配的成员。\n
\n ) : (\n
\n {membersByGeneration.map(({ generation, members }) => (\n
\n
\n

第 {generation} 世

\n 共 {members.length} 人\n
\n
\n
\n {members.map((member) => {\n // 判断是否是配偶:\n // 1. 没有父母ID\n // 2. 有配偶ID\n // 3. 不是始祖(没有'始祖'标签)\n const isFounder = member.tags?.includes('始祖')\n const isSpouse = !member.fatherId && !member.motherId && \n member.spouseIds && member.spouseIds.length > 0 && \n !isFounder\n \n // 获取配偶信息\n const spouse = isSpouse && member.spouseIds?.[0] ? allMembers.find(m => m.id === member.spouseIds[0]) : null\n const spouseName = spouse ? spouse.fullName : null\n \n return (\n
\n \n \n \n
\n \n {/* 在世/去世标识 */}\n {member.deathDate && (\n
\n )}\n {!member.deathDate && (\n
\n )}\n
\n
\n
\n

\n {member.fullName}\n {member.courtesyName && (\n \n 字 {member.courtesyName}\n \n )}\n

\n
\n {isFounder ? (\n

\n 家族始祖\n

\n ) : isSpouse && spouseName ? (\n

\n {spouseName}的配偶\n

\n ) : (\n

\n {member.generationName ? `字辈: ${member.generationName}` : \"未录入字辈\"}\n

\n )}\n \n {/* 籍贯和生卒年并排 */}\n
\n

{member.ancestralHome || \"籍贯未知\"}

\n \n {/* 生卒年和年龄 */}\n {(member.birthDate || member.deathDate) && (\n
\n
\n {member.birthDate && new Date(member.birthDate).getFullYear()}\n {member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`}\n {!member.deathDate && member.birthDate && ' - '}\n
\n {(() => {\n if (!member.birthDate) return null\n const birthYear = new Date(member.birthDate).getFullYear()\n const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear()\n const age = deathYear - birthYear\n return (\n
\n {member.deathDate ? `享年${age}岁` : `${age}岁`}\n
\n )\n })()}\n
\n )}\n
\n \n {member.tags && member.tags.length > 0 && (\n
\n {member.tags.map((tag) => (\n \n {tag}\n \n ))}\n
\n )}\n
\n \n \n \n {\n setHighlightedMemberId(member.id)\n router.push('/tree')\n }}\n title=\"在族谱图中定位\"\n >\n \n \n
\n )\n })}\n
\n
\n ))}\n
\n )}\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}] + {"offset": {"line": 1789, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 区分家族成员和配偶\n const familyMembers = members.filter(m => {\n // 家族成员:有父母关系 或 明确标记为始祖\n const isFounder = m.tags?.includes('始祖')\n const hasFamilyParents = m.fatherId || m.motherId\n \n // 如果有父母关系,肯定是家族成员\n if (hasFamilyParents) return true\n \n // 如果明确标记为始祖,是家族成员\n if (isFounder) return true\n \n // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况)\n if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true\n \n // 其他情况(如第1世但有配偶且没有父母的)是配偶身份\n return false\n })\n \n // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低)\n const sortedFamilyMembers = [...familyMembers].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖')\n const bIsFounder = b.tags?.includes('始祖')\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序(早出生的在前 = 年龄大的在前)\n const aDate = a.birthDate || \"9999-12-31\"\n const bDate = b.birthDate || \"9999-12-31\"\n return aDate.localeCompare(bDate)\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedFamilyMembers.forEach(member => {\n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n } else {\n // 没有配偶,添加空白占位符\n result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any)\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

\n
\n
\n \n setQuery(e.target.value)}\n />\n
\n 0 ? \"secondary\" : \"outline\"}\n size=\"icon\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"relative\"\n >\n \n {activeFilterCount > 0 && (\n \n )}\n \n \n \n \n
\n
\n\n {/* Filter Bar */}\n {showFilters && (\n
\n
\n

高级筛选

\n \n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n \n \n {generationRange[0]} - {generationRange[1]} 世\n \n
\n setGenerationRange(val as [number, number])}\n className=\"py-4\"\n />\n
\n
\n
\n )}\n
\n\n {filteredMembers.length === 0 ? (\n
\n 没有找到匹配的成员。\n
\n ) : (\n
\n {membersByGeneration.map(({ generation, members }) => (\n
\n
\n

第 {generation} 世

\n 共 {members.length} 人\n
\n
\n
\n {members.map((member) => {\n // 检查是否是占位符\n if ((member as any).isPlaceholder) {\n return
\n }\n \n // 判断是否是配偶:\n // 1. 没有父母ID\n // 2. 有配偶ID\n // 3. 不是始祖(没有'始祖'标签)\n const isFounder = member.tags?.includes('始祖')\n const isSpouse = !member.fatherId && !member.motherId && \n member.spouseIds && member.spouseIds.length > 0 && \n !isFounder\n \n // 获取配偶信息\n const spouse = isSpouse && member.spouseIds?.[0] ? allMembers.find(m => m.id === member.spouseIds[0]) : null\n const spouseName = spouse ? spouse.fullName : null\n \n return (\n
\n \n \n \n
\n \n {/* 在世/去世标识 */}\n {member.deathDate && (\n
\n )}\n {!member.deathDate && (\n
\n )}\n
\n
\n
\n

\n {member.fullName}\n {member.courtesyName && (\n \n 字 {member.courtesyName}\n \n )}\n

\n
\n {isFounder ? (\n

\n 家族始祖\n

\n ) : isSpouse && spouseName ? (\n

\n {spouseName}的配偶\n

\n ) : (\n

\n {member.generationName ? `字辈: ${member.generationName}` : \"未录入字辈\"}\n

\n )}\n \n {/* 籍贯和生卒年并排 */}\n
\n

{member.ancestralHome || \"籍贯未知\"}

\n \n {/* 生卒年和年龄 */}\n {(member.birthDate || member.deathDate) && (\n
\n
\n {member.birthDate && new Date(member.birthDate).getFullYear()}\n {member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`}\n {!member.deathDate && member.birthDate && ' - '}\n
\n {(() => {\n if (!member.birthDate) return null\n const birthYear = new Date(member.birthDate).getFullYear()\n const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear()\n const age = deathYear - birthYear\n return (\n
\n {member.deathDate ? `享年${age}岁` : `${age}岁`}\n
\n )\n })()}\n
\n )}\n
\n \n {member.tags && member.tags.length > 0 && (\n
\n {member.tags.map((tag) => (\n \n {tag}\n \n ))}\n
\n )}\n
\n \n \n \n {\n setHighlightedMemberId(member.id)\n router.push('/tree')\n }}\n title=\"在族谱图中定位\"\n >\n \n \n
\n )\n })}\n
\n
\n ))}\n
\n )}\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}] } \ No newline at end of file diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js index c3f21d09..1736b430 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js @@ -658,7 +658,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, @@ -3510,13 +3510,13 @@ function DashboardPage() { columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex flex-col space-y-4", + className: "flex flex-col space-y-1", children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex items-center justify-center gap-3 py-2", + className: "flex items-center justify-center gap-3", children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-5xl font-serif font-bold text-primary tracking-wider", + className: "text-3xl font-serif font-bold text-primary tracking-tight", children: "1" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", @@ -3524,19 +3524,19 @@ function DashboardPage() { columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-4xl font-bold text-muted-foreground", + className: "text-2xl font-bold text-muted-foreground", children: ":" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 249, + lineNumber: 247, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-5xl font-serif font-bold text-primary tracking-wider", + className: "text-3xl font-serif font-bold text-primary tracking-tight", children: stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 250, + lineNumber: 248, columnNumber: 19 }, this) ] @@ -3546,116 +3546,16 @@ function DashboardPage() { columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "text-center text-xs text-muted-foreground/80 font-medium -mt-2", - children: "男性 : 女性" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 254, - columnNumber: 17 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "space-y-2", + className: "text-center text-xs text-muted-foreground/80 font-medium mt-1", children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "flex items-center justify-between text-xs", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-primary/80 font-medium flex items-center gap-1", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "w-2 h-2 rounded-full bg-primary/60" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 262, - columnNumber: 23 - }, this), - "男性 ", - stats.maleCount - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 261, - columnNumber: 21 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-primary/80 font-medium flex items-center gap-1", - children: [ - "女性 ", - stats.femaleCount, - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "w-2 h-2 rounded-full bg-primary/60" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 267, - columnNumber: 23 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 265, - columnNumber: 21 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 260, - columnNumber: 19 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-3 bg-background/60 border border-border/50 rounded-full overflow-hidden flex", - children: [ - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-full bg-primary/70 transition-all duration-500 flex items-center justify-center", - style: { - width: `${stats.totalMembers > 0 ? stats.maleCount / stats.totalMembers * 100 : 0}%` - }, - children: stats.totalMembers > 0 && stats.maleCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-[10px] text-primary-foreground font-bold px-1", - children: [ - Math.round(stats.maleCount / stats.totalMembers * 100), - "%" - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 276, - columnNumber: 25 - }, this) - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 271, - columnNumber: 21 - }, this), - /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { - className: "h-full bg-primary/40 transition-all duration-500 flex items-center justify-center", - style: { - width: `${stats.totalMembers > 0 ? stats.femaleCount / stats.totalMembers * 100 : 0}%` - }, - children: stats.totalMembers > 0 && stats.femaleCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { - className: "text-[10px] text-primary-foreground font-bold px-1", - children: [ - Math.round(stats.femaleCount / stats.totalMembers * 100), - "%" - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 286, - columnNumber: 25 - }, this) - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 281, - columnNumber: 21 - }, this) - ] - }, void 0, true, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 270, - columnNumber: 19 - }, this) + "男性 ", + stats.maleCount, + " · 女性 ", + stats.femaleCount ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 259, + lineNumber: 252, columnNumber: 17 }, this) ] @@ -3674,7 +3574,7 @@ function DashboardPage() { className: "absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-primary/50 via-primary to-primary/50 opacity-0 group-hover:opacity-100 transition-opacity" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 295, + lineNumber: 257, columnNumber: 13 }, this) ] @@ -3704,7 +3604,7 @@ function DashboardPage() { children: "最近更新" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 302, + lineNumber: 264, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3712,7 +3612,7 @@ function DashboardPage() { children: "近期纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 303, + lineNumber: 265, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3720,7 +3620,7 @@ function DashboardPage() { children: "统计图表" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 304, + lineNumber: 266, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsTrigger"], { @@ -3728,13 +3628,13 @@ function DashboardPage() { children: "迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 305, + lineNumber: 267, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 301, + lineNumber: 263, columnNumber: 13 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], { @@ -3749,24 +3649,24 @@ function DashboardPage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 309, + lineNumber: 271, columnNumber: 22 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 308, + lineNumber: 270, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 307, + lineNumber: 269, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 300, + lineNumber: 262, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -3785,20 +3685,20 @@ function DashboardPage() { children: "近期修谱动态" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 318, + lineNumber: 280, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardDescription"], { children: "记录家族成员的最新变动与修订" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 319, + lineNumber: 281, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 317, + lineNumber: 279, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardContent"], { @@ -3816,20 +3716,20 @@ function DashboardPage() { className: "h-full w-px bg-border group-last:hidden" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 328, + lineNumber: 290, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: `absolute top-2 h-2 w-2 rounded-full ring-4 ring-background ${activity.action === 'create' ? 'bg-green-500' : activity.action === 'update' ? 'bg-blue-500' : activity.action === 'delete' ? 'bg-red-500' : 'bg-purple-500'}` }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 329, + lineNumber: 291, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 327, + lineNumber: 289, columnNumber: 29 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3843,7 +3743,7 @@ function DashboardPage() { children: activity.action === 'create' ? '创建' : activity.action === 'update' ? '更新' : activity.action === 'delete' ? '删除' : '导入' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 338, + lineNumber: 300, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3851,7 +3751,7 @@ function DashboardPage() { children: activity.entityName || '未知' }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 348, + lineNumber: 310, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3859,13 +3759,13 @@ function DashboardPage() { children: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$date$2d$fns$40$4$2e$1$2e$0$2f$node_modules$2f$date$2d$fns$2f$format$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$locals$3e$__["format"])(new Date(activity.timestamp), 'MM-dd HH:mm') }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 349, + lineNumber: 311, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 337, + lineNumber: 299, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -3878,47 +3778,47 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 353, + lineNumber: 315, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 336, + lineNumber: 298, columnNumber: 29 }, this) ] }, activity.id, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 326, + lineNumber: 288, columnNumber: 27 }, this)) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "text-center text-muted-foreground py-8", children: "暂无修谱记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 363, + lineNumber: 325, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 323, + lineNumber: 285, columnNumber: 21 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 322, + lineNumber: 284, columnNumber: 19 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 321, + lineNumber: 283, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 316, + lineNumber: 278, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3934,19 +3834,19 @@ function DashboardPage() { className: "h-5 w-5" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 376, + lineNumber: 338, columnNumber: 23 }, this), "本月祭祖/纪念" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 375, + lineNumber: 337, columnNumber: 21 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 374, + lineNumber: 336, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardContent"], { @@ -3969,7 +3869,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 388, + lineNumber: 350, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -3977,13 +3877,13 @@ function DashboardPage() { children: anniversary.day }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 391, + lineNumber: 353, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 387, + lineNumber: 349, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -3998,7 +3898,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 394, + lineNumber: 356, columnNumber: 33 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4013,24 +3913,24 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 397, + lineNumber: 359, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 393, + lineNumber: 355, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 386, + lineNumber: 348, columnNumber: 29 }, this) }, `${anniversary.member.id}-${anniversary.type}`, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 385, + lineNumber: 347, columnNumber: 27 }, this); }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4038,34 +3938,34 @@ function DashboardPage() { children: "本月暂无纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 407, + lineNumber: 369, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 380, + lineNumber: 342, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 373, + lineNumber: 335, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 372, + lineNumber: 334, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 315, + lineNumber: 277, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 314, + lineNumber: 276, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -4081,20 +3981,20 @@ function DashboardPage() { children: "近期纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 421, + lineNumber: 383, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardDescription"], { children: "未来三个月内的生日和忌日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 422, + lineNumber: 384, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 420, + lineNumber: 382, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardContent"], { @@ -4156,7 +4056,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 478, + lineNumber: 440, columnNumber: 37 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -4164,13 +4064,13 @@ function DashboardPage() { children: event.date.getDate() }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 479, + lineNumber: 441, columnNumber: 37 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 477, + lineNumber: 439, columnNumber: 35 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4185,7 +4085,7 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 482, + lineNumber: 444, columnNumber: 37 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4200,34 +4100,34 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 485, + lineNumber: 447, columnNumber: 37 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 481, + lineNumber: 443, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 476, + lineNumber: 438, columnNumber: 33 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 475, + lineNumber: 437, columnNumber: 31 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 474, + lineNumber: 436, columnNumber: 29 }, this) }, `${event.member.id}-${event.type}-${index}`, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 473, + lineNumber: 435, columnNumber: 27 }, this); }) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4235,29 +4135,29 @@ function DashboardPage() { children: "未来三个月暂无纪念日" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 497, + lineNumber: 459, columnNumber: 23 }, this); })() }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 425, + lineNumber: 387, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 424, + lineNumber: 386, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 419, + lineNumber: 381, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 418, + lineNumber: 380, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -4267,12 +4167,12 @@ function DashboardPage() { members: Object.values(treeData.members) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 509, + lineNumber: 471, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 508, + lineNumber: 470, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["TabsContent"], { @@ -4288,20 +4188,20 @@ function DashboardPage() { children: "家族迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 516, + lineNumber: 478, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardDescription"], { children: "记录家族成员的籍贯分布" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 517, + lineNumber: 479, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 515, + lineNumber: 477, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["CardContent"], { @@ -4336,7 +4236,7 @@ function DashboardPage() { children: location }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 541, + lineNumber: 503, columnNumber: 29 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -4347,13 +4247,13 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 542, + lineNumber: 504, columnNumber: 29 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 540, + lineNumber: 502, columnNumber: 27 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4369,7 +4269,7 @@ function DashboardPage() { children: member.fullName }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 550, + lineNumber: 512, columnNumber: 35 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4381,30 +4281,30 @@ function DashboardPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 551, + lineNumber: 513, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 549, + lineNumber: 511, columnNumber: 33 }, this) }, member.id, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 548, + lineNumber: 510, columnNumber: 31 }, this) }["DashboardPage.useMemo"]) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 546, + lineNumber: 508, columnNumber: 27 }, this) ] }, location, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 539, + lineNumber: 501, columnNumber: 25 }, this) }["DashboardPage.useMemo"]) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4412,7 +4312,7 @@ function DashboardPage() { children: "暂无迁徙记录" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 559, + lineNumber: 521, columnNumber: 23 }, this); } @@ -4421,29 +4321,29 @@ function DashboardPage() { ]) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 520, + lineNumber: 482, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 519, + lineNumber: 481, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 514, + lineNumber: 476, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 513, + lineNumber: 475, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 299, + lineNumber: 261, columnNumber: 9 }, this) ] @@ -4481,7 +4381,7 @@ function StatCard({ title, value, subtitle, icon }) { children: title }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 584, + lineNumber: 546, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4489,13 +4389,13 @@ function StatCard({ title, value, subtitle, icon }) { children: icon }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 585, + lineNumber: 547, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 583, + lineNumber: 545, columnNumber: 9 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -4506,7 +4406,7 @@ function StatCard({ title, value, subtitle, icon }) { children: value }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 590, + lineNumber: 552, columnNumber: 11 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -4514,32 +4414,32 @@ function StatCard({ title, value, subtitle, icon }) { children: subtitle }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 591, + lineNumber: 553, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 589, + lineNumber: 551, columnNumber: 9 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 582, + lineNumber: 544, columnNumber: 7 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-primary/50 via-primary to-primary/50 opacity-0 group-hover:opacity-100 transition-opacity" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 594, + lineNumber: 556, columnNumber: 7 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx", - lineNumber: 581, + lineNumber: 543, columnNumber: 5 }, this); } diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js.map index 5d722a67..e8265958 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c77f613d._.js.map @@ -4,12 +4,12 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;KAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,mXAAC,4bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS"}}, {"offset": {"line": 67, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏家谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

{session.user?.name || \"用户\"}

\n

\n {session.user?.email}\n

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1307, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/scroll-area.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\n\nimport { cn } from '@/lib/utils'\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n {children}\n \n \n \n \n )\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport { ScrollArea, ScrollBar }\n"],"names":[],"mappings":";;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OACmD;IACtD,qBACE,mXAAC,gcAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,YAAY;QACzB,GAAG,KAAK;;0BAET,mXAAC,ocAA4B;gBAC3B,aAAU;gBACV,WAAU;0BAET;;;;;;0BAEH,mXAAC;;;;;0BACD,mXAAC,kcAA0B;;;;;;;;;;;AAGjC;KArBS;AAuBT,SAAS,UAAU,EACjB,SAAS,EACT,cAAc,UAAU,EACxB,GAAG,OACkE;IACrE,qBACE,mXAAC,+cAAuC;QACtC,aAAU;QACV,aAAa;QACb,WAAW,IAAA,4KAAE,EACX,sDACA,gBAAgB,cACd,8CACF,gBAAgB,gBACd,gDACF;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,2cAAmC;YAClC,aAAU;YACV,WAAU;;;;;;;;;;;AAIlB;MAzBS"}}, {"offset": {"line": 1385, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/tabs.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '@/lib/utils'\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n"],"names":[],"mappings":";;;;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,KAAK,EACZ,SAAS,EACT,GAAG,OAC6C;IAChD,qBACE,mXAAC,sbAAkB;QACjB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,uBAAuB;QACpC,GAAG,KAAK;;;;;;AAGf;KAXS;AAaT,SAAS,SAAS,EAChB,SAAS,EACT,GAAG,OAC6C;IAChD,qBACE,mXAAC,sbAAkB;QACjB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,uGACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,mqBACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,uBAAuB;QACpC,GAAG,KAAK;;;;;;AAGf;MAXS"}}, {"offset": {"line": 1463, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/dashboard/statistics-charts.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport * as echarts from \"echarts\"\nimport type { FamilyMember } from \"@/types/family\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from \"@/components/ui/card\"\n\ninterface StatisticsChartsProps {\n members: FamilyMember[]\n}\n\nexport function StatisticsCharts({ members }: StatisticsChartsProps) {\n const genderChartRef = useRef(null)\n const generationChartRef = useRef(null)\n const ageDistributionRef = useRef(null)\n const birthYearChartRef = useRef(null)\n\n useEffect(() => {\n if (!genderChartRef.current || members.length === 0) return\n\n // 性别分布饼图\n const genderChart = echarts.init(genderChartRef.current)\n const genderData = {\n male: members.filter(m => m.gender === 'MALE').length,\n female: members.filter(m => m.gender === 'FEMALE').length,\n other: members.filter(m => m.gender === 'OTHER').length,\n }\n\n genderChart.setOption({\n title: {\n text: '性别分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} 人 ({d}%)'\n },\n legend: {\n bottom: 10,\n left: 'center'\n },\n series: [\n {\n type: 'pie',\n radius: ['40%', '70%'],\n center: ['50%', '50%'],\n avoidLabelOverlap: false,\n itemStyle: {\n borderRadius: 10,\n borderColor: '#fff',\n borderWidth: 2\n },\n label: {\n show: false\n },\n emphasis: {\n label: {\n show: true,\n fontSize: 16,\n fontWeight: 'bold'\n }\n },\n data: [\n { value: genderData.male, name: '男性', itemStyle: { color: '#3b82f6' } },\n { value: genderData.female, name: '女性', itemStyle: { color: '#ec4899' } },\n ...(genderData.other > 0 ? [{ value: genderData.other, name: '其他', itemStyle: { color: '#8b5cf6' } }] : [])\n ]\n }\n ]\n })\n\n return () => {\n genderChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!generationChartRef.current || members.length === 0) return\n\n // 世代分布柱状图\n const generationChart = echarts.init(generationChartRef.current)\n const generationData = new Map()\n \n members.forEach(m => {\n const gen = m.generation || 0\n generationData.set(gen, (generationData.get(gen) || 0) + 1)\n })\n\n const sortedGenerations = Array.from(generationData.entries()).sort((a, b) => a[0] - b[0])\n\n generationChart.setOption({\n title: {\n text: '世代分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'shadow'\n },\n formatter: '{b}世: {c} 人'\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n top: '15%',\n containLabel: true\n },\n xAxis: {\n type: 'category',\n data: sortedGenerations.map(([gen]) => `第${gen}世`),\n axisLabel: {\n rotate: 45\n }\n },\n yAxis: {\n type: 'value',\n name: '人数'\n },\n series: [\n {\n type: 'bar',\n data: sortedGenerations.map(([, count]) => count),\n itemStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: '#83bff6' },\n { offset: 0.5, color: '#188df0' },\n { offset: 1, color: '#188df0' }\n ])\n },\n emphasis: {\n itemStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: '#2378f7' },\n { offset: 0.7, color: '#2378f7' },\n { offset: 1, color: '#83bff6' }\n ])\n }\n }\n }\n ]\n })\n\n return () => {\n generationChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!ageDistributionRef.current || members.length === 0) return\n\n // 年龄分布图\n const ageChart = echarts.init(ageDistributionRef.current)\n const currentYear = new Date().getFullYear()\n \n const ageGroups = {\n '0-18': 0,\n '19-35': 0,\n '36-50': 0,\n '51-65': 0,\n '66+': 0,\n '已故': 0\n }\n\n members.forEach(m => {\n if (m.deathDate) {\n ageGroups['已故']++\n } else if (m.birthDate) {\n const age = currentYear - new Date(m.birthDate).getFullYear()\n if (age <= 18) ageGroups['0-18']++\n else if (age <= 35) ageGroups['19-35']++\n else if (age <= 50) ageGroups['36-50']++\n else if (age <= 65) ageGroups['51-65']++\n else ageGroups['66+']++\n }\n })\n\n ageChart.setOption({\n title: {\n text: '年龄分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} 人 ({d}%)'\n },\n legend: {\n bottom: 10,\n left: 'center'\n },\n series: [\n {\n type: 'pie',\n radius: '60%',\n center: ['50%', '50%'],\n data: Object.entries(ageGroups)\n .filter(([, count]) => count > 0)\n .map(([name, value]) => ({ name, value })),\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n }\n }\n }\n ]\n })\n\n return () => {\n ageChart.dispose()\n }\n }, [members])\n\n useEffect(() => {\n if (!birthYearChartRef.current || members.length === 0) return\n\n // 出生年份趋势图\n const birthYearChart = echarts.init(birthYearChartRef.current)\n const birthYearData = new Map()\n \n members.forEach(m => {\n if (m.birthDate) {\n const year = new Date(m.birthDate).getFullYear()\n if (year >= 1900) { // 只统计1900年以后的\n const decade = Math.floor(year / 10) * 10\n birthYearData.set(decade, (birthYearData.get(decade) || 0) + 1)\n }\n }\n })\n\n const sortedYears = Array.from(birthYearData.entries()).sort((a, b) => a[0] - b[0])\n\n birthYearChart.setOption({\n title: {\n text: '出生年代分布',\n left: 'center',\n top: 10,\n textStyle: {\n fontSize: 14,\n fontWeight: 'normal'\n }\n },\n tooltip: {\n trigger: 'axis',\n formatter: '{b}年代: {c} 人'\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n top: '15%',\n containLabel: true\n },\n xAxis: {\n type: 'category',\n data: sortedYears.map(([year]) => `${year}s`),\n axisLabel: {\n rotate: 45\n }\n },\n yAxis: {\n type: 'value',\n name: '人数'\n },\n series: [\n {\n type: 'line',\n data: sortedYears.map(([, count]) => count),\n smooth: true,\n areaStyle: {\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n { offset: 0, color: 'rgba(99, 102, 241, 0.5)' },\n { offset: 1, color: 'rgba(99, 102, 241, 0.1)' }\n ])\n },\n lineStyle: {\n color: '#6366f1',\n width: 2\n },\n itemStyle: {\n color: '#6366f1'\n }\n }\n ]\n })\n\n return () => {\n birthYearChart.dispose()\n }\n }, [members])\n\n return (\n
\n \n \n 性别分布\n 家族成员性别比例\n \n \n
\n \n \n\n \n \n 世代分布\n 各世代人数统计\n \n \n
\n \n \n\n \n \n 年龄分布\n 按年龄段划分的人数\n \n \n
\n \n \n\n \n \n 出生年代分布\n 各年代出生人数趋势\n \n \n
\n \n \n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 2057, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,cAAc,EACrB,GAAG,OACkD;IACrD,qBAAO,mXAAC,2bAAuB;QAAC,aAAU;QAAkB,GAAG,KAAK;;;;;;AACtE;MAJS;AAMT,SAAS,aAAa,EACpB,GAAG,OACiD;IACpD,qBAAO,mXAAC,0bAAsB;QAAC,aAAU;QAAiB,GAAG,KAAK;;;;;;AACpE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,GAAG,OACkD;IACrD,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0JACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS;AAgBT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,kBAAkB,IAAI,EACtB,GAAG,OAGJ;IACC,qBACE,mXAAC;QAAa,aAAU;;0BACtB,mXAAC;;;;;0BACD,mXAAC,2bAAuB;gBACtB,aAAU;gBACV,WAAW,IAAA,4KAAE,EACX,+WACA;gBAED,GAAG,KAAK;;oBAER;oBACA,iCACC,mXAAC,ybAAqB;wBACpB,aAAU;wBACV,WAAU;;0CAEV,mXAAC,uVAAK;;;;;0CACN,mXAAC;gCAAK,WAAU;0CAAU;;;;;;;;;;;;;;;;;;;;;;;;AAMtC;MAhCS;AAkCT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,gDAAgD;QAC7D,GAAG,KAAK;;;;;;AAGf;MARS;AAUT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0DACA;QAED,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,sCAAsC;QACnD,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,kBAAkB,EACzB,SAAS,EACT,GAAG,OACsD;IACzD,qBACE,mXAAC,+bAA2B;QAC1B,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iCAAiC;QAC9C,GAAG,KAAK;;;;;;AAGf;MAXS"}}, {"offset": {"line": 2263, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,4KAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,mXAAC,wbAAoB;gBAAC,OAAO;0BAC3B,cAAA,mXAAC,yXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;MAxBS;AA0BT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,mXAAC,0bAAsB;kBACrB,cAAA,mXAAC,2bAAuB;YACtB,aAAU;YACV,WAAW,IAAA,4KAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,mXAAC;;;;;8BACD,mXAAC,4bAAwB;oBACvB,WAAW,IAAA,4KAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,mXAAC;;;;;;;;;;;;;;;;AAIT;MAjCS;AAmCT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,mXAAC;gBAAK,WAAU;0BACd,cAAA,mXAAC,icAA6B;8BAC5B,cAAA,mXAAC,mWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,mXAAC,4bAAwB;0BAAE;;;;;;;;;;;;AAGjC;MAtBS;AAwBT,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,mXAAC,6bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,mXAAC,kcAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,mXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;MAhBS;AAkBT,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,mXAAC,ocAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,yXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC;MAhBS"}}, {"offset": {"line": 2520, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/collaborator-dialog.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { useSession } from \"next-auth/react\"\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from \"@/components/ui/dialog\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\"\nimport { Users, Mail, Trash2, Plus, Shield, Eye, Edit } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface Collaborator {\n id: string\n userId: string\n role: \"EDITOR\" | \"VIEWER\"\n invitedAt: string\n user: {\n id: string\n name: string | null\n email: string\n avatar: string | null\n }\n}\n\nexport function CollaboratorDialog() {\n const { data: session } = useSession()\n const { currentTree } = useFamily()\n const { showConfirm, showAlert } = useDialog()\n const [open, setOpen] = useState(false)\n const [collaborators, setCollaborators] = useState([])\n const [isInviting, setIsInviting] = useState(false)\n const [email, setEmail] = useState(\"\")\n const [role, setRole] = useState<\"EDITOR\" | \"VIEWER\">(\"VIEWER\")\n const [password, setPassword] = useState(\"\")\n const [error, setError] = useState(\"\")\n const [success, setSuccess] = useState(\"\")\n\n // 加载协作者\n useEffect(() => {\n if (open && currentTree?.id) {\n loadCollaborators()\n }\n }, [open, currentTree?.id])\n\n const loadCollaborators = async () => {\n if (!currentTree?.id) return\n \n try {\n const res = await fetch(`/api/trees/${currentTree.id}/collaborators`)\n if (res.ok) {\n const data = await res.json()\n setCollaborators(data.collaborators)\n }\n } catch (err) {\n console.error(\"加载协作者失败:\", err)\n }\n }\n\n const handleInvite = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!currentTree?.id) return\n\n setIsInviting(true)\n setError(\"\")\n setSuccess(\"\")\n\n try {\n const res = await fetch(`/api/trees/${currentTree.id}/invite`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n role,\n password: password || undefined,\n }),\n })\n\n const data = await res.json()\n\n if (!res.ok) {\n throw new Error(data.error || \"邀请失败\")\n }\n\n setSuccess(data.message)\n setEmail(\"\")\n setPassword(\"\")\n loadCollaborators()\n } catch (err: any) {\n setError(err.message)\n } finally {\n setIsInviting(false)\n }\n }\n\n const handleRemove = async (userId: string) => {\n if (!currentTree?.id) return\n \n const confirmed = await showConfirm(\"确定要移除此协作者吗?\", \"移除协作者\")\n if (!confirmed) return\n\n try {\n const res = await fetch(`/api/trees/${currentTree.id}/collaborators?userId=${userId}`, {\n method: 'DELETE',\n })\n\n if (!res.ok) throw new Error('移除失败')\n\n loadCollaborators()\n } catch (err) {\n console.error(err)\n await showAlert(\"移除失败\", \"错误\")\n }\n }\n\n if (!currentTree) return null\n if (currentTree.ownerId !== session?.user?.id) return null\n\n return (\n \n \n \n \n \n \n 协作管理 - {currentTree.name}\n \n 邀请其他用户协作编辑或查看您的家族树。\n \n \n \n
\n {/* 邀请表单 */}\n
\n
\n
\n \n setEmail(e.target.value)}\n required\n />\n
\n
\n \n \n
\n
\n \n
\n setPassword(e.target.value)}\n minLength={6}\n className=\"flex-1\"\n />\n \n
\n

如果是现有用户,此密码将被忽略。

\n
\n
\n\n {error && (\n \n 错误\n {error}\n \n )}\n\n {success && (\n \n 成功\n {success}\n \n )}\n
\n\n {/* 协作者列表 */}\n
\n

现有协作者

\n {collaborators.length === 0 ? (\n
\n 暂无协作者\n
\n ) : (\n
\n {collaborators.map((collab) => (\n \n
\n \n \n {collab.user.name?.charAt(0).toUpperCase() || collab.user.email.charAt(0).toUpperCase()}\n \n \n
\n
{collab.user.name || \"用户\"}
\n
{collab.user.email}
\n
\n
\n
\n \n {collab.role === 'EDITOR' ? '编辑者' : '查看者'}\n \n handleRemove(collab.userId)}\n >\n \n \n
\n
\n ))}\n
\n )}\n
\n
\n \n \n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;;AAbA;;;;;;;;;;;;;AA4BO,SAAS;;IACd,MAAM,EAAE,MAAM,OAAO,EAAE,GAAG,IAAA,waAAU;IACpC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,oMAAS;IACjC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAA,qNAAS;IAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAA,+VAAQ,EAAC;IACjC,MAAM,CAAC,eAAe,iBAAiB,GAAG,IAAA,+VAAQ,EAAiB,EAAE;IACrE,MAAM,CAAC,YAAY,cAAc,GAAG,IAAA,+VAAQ,EAAC;IAC7C,MAAM,CAAC,OAAO,SAAS,GAAG,IAAA,+VAAQ,EAAC;IACnC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAA,+VAAQ,EAAsB;IACtD,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,+VAAQ,EAAC;IACzC,MAAM,CAAC,OAAO,SAAS,GAAG,IAAA,+VAAQ,EAAC;IACnC,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,+VAAQ,EAAC;IAEvC,QAAQ;IACR,IAAA,gWAAS;wCAAC;YACR,IAAI,QAAQ,aAAa,IAAI;gBAC3B;YACF;QACF;uCAAG;QAAC;QAAM,aAAa;KAAG;IAE1B,MAAM,oBAAoB;QACxB,IAAI,CAAC,aAAa,IAAI;QAEtB,IAAI;YACF,MAAM,MAAM,MAAM,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,cAAc,CAAC;YACpE,IAAI,IAAI,EAAE,EAAE;gBACV,MAAM,OAAO,MAAM,IAAI,IAAI;gBAC3B,iBAAiB,KAAK,aAAa;YACrC;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC,YAAY;QAC5B;IACF;IAEA,MAAM,eAAe,OAAO;QAC1B,EAAE,cAAc;QAChB,IAAI,CAAC,aAAa,IAAI;QAEtB,cAAc;QACd,SAAS;QACT,WAAW;QAEX,IAAI;YACF,MAAM,MAAM,MAAM,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE;gBAC7D,QAAQ;gBACR,SAAS;oBACP,gBAAgB;gBAClB;gBACA,MAAM,KAAK,SAAS,CAAC;oBACnB;oBACA;oBACA,UAAU,YAAY;gBACxB;YACF;YAEA,MAAM,OAAO,MAAM,IAAI,IAAI;YAE3B,IAAI,CAAC,IAAI,EAAE,EAAE;gBACX,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI;YAChC;YAEA,WAAW,KAAK,OAAO;YACvB,SAAS;YACT,YAAY;YACZ;QACF,EAAE,OAAO,KAAU;YACjB,SAAS,IAAI,OAAO;QACtB,SAAU;YACR,cAAc;QAChB;IACF;IAEA,MAAM,eAAe,OAAO;QAC1B,IAAI,CAAC,aAAa,IAAI;QAEtB,MAAM,YAAY,MAAM,YAAY,eAAe;QACnD,IAAI,CAAC,WAAW;QAEhB,IAAI;YACF,MAAM,MAAM,MAAM,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,sBAAsB,EAAE,QAAQ,EAAE;gBACrF,QAAQ;YACV;YAEA,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,IAAI,MAAM;YAE7B;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC;YACd,MAAM,UAAU,QAAQ;QAC1B;IACF;IAEA,IAAI,CAAC,aAAa,OAAO;IACzB,IAAI,YAAY,OAAO,KAAK,SAAS,MAAM,IAAI,OAAO;IAEtD,qBACE,mXAAC,+LAAM;QAAC,MAAM;QAAM,cAAc;;0BAChC,mXAAC,sMAAa;gBAAC,OAAO;0BACpB,cAAA,mXAAC,+LAAM;oBAAC,SAAQ;oBAAU,WAAU;;sCAClC,mXAAC,2VAAK;4BAAC,WAAU;;;;;;wBAAY;;;;;;;;;;;;0BAIjC,mXAAC,sMAAa;gBAAC,WAAU;;kCACvB,mXAAC,qMAAY;;0CACX,mXAAC,oMAAW;;oCAAC;oCAAQ,YAAY,IAAI;;;;;;;0CACrC,mXAAC,0MAAiB;0CAAC;;;;;;;;;;;;kCAKrB,mXAAC;wBAAI,WAAU;;0CAEb,mXAAC;gCAAK,UAAU;gCAAc,WAAU;;kDACtC,mXAAC;wCAAI,WAAU;;0DACb,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,SAAQ;kEAAQ;;;;;;kEACvB,mXAAC,6LAAK;wDACJ,IAAG;wDACH,MAAK;wDACL,aAAY;wDACZ,OAAO;wDACP,UAAU,CAAC,IAAM,SAAS,EAAE,MAAM,CAAC,KAAK;wDACxC,QAAQ;;;;;;;;;;;;0DAGZ,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,SAAQ;kEAAO;;;;;;kEACtB,mXAAC,+LAAM;wDAAC,OAAO;wDAAM,eAAe,CAAC,IAAW,QAAQ;;0EACtD,mXAAC,sMAAa;0EACZ,cAAA,mXAAC,oMAAW;;;;;;;;;;0EAEd,mXAAC,sMAAa;;kFACZ,mXAAC,mMAAU;wEAAC,OAAM;kFAChB,cAAA,mXAAC;4EAAI,WAAU;;8FACb,mXAAC,iWAAI;oFAAC,WAAU;;;;;;gFAAiB;;;;;;;;;;;;kFAIrC,mXAAC,mMAAU;wEAAC,OAAM;kFAChB,cAAA,mXAAC;4EAAI,WAAU;;8FACb,mXAAC,qVAAG;oFAAC,WAAU;;;;;;gFAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAO1C,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,SAAQ;kEAAW;;;;;;kEAC1B,mXAAC;wDAAI,WAAU;;0EACb,mXAAC,6LAAK;gEACJ,IAAG;gEACH,MAAK;gEACL,aAAY;gEACZ,OAAO;gEACP,UAAU,CAAC,IAAM,YAAY,EAAE,MAAM,CAAC,KAAK;gEAC3C,WAAW;gEACX,WAAU;;;;;;0EAEZ,mXAAC,+LAAM;gEAAC,MAAK;gEAAS,UAAU;0EAC7B,aAAa,WAAW;;;;;;;;;;;;kEAG7B,mXAAC;wDAAE,WAAU;kEAAgC;;;;;;;;;;;;;;;;;;oCAIhD,uBACC,mXAAC,6LAAK;wCAAC,SAAQ;;0DACb,mXAAC,kMAAU;0DAAC;;;;;;0DACZ,mXAAC,wMAAgB;0DAAE;;;;;;;;;;;;oCAItB,yBACC,mXAAC,6LAAK;wCAAC,WAAU;;0DACf,mXAAC,kMAAU;0DAAC;;;;;;0DACZ,mXAAC,wMAAgB;0DAAE;;;;;;;;;;;;;;;;;;0CAMzB,mXAAC;gCAAI,WAAU;;kDACb,mXAAC;wCAAG,WAAU;kDAA4C;;;;;;oCACzD,cAAc,MAAM,KAAK,kBACxB,mXAAC;wCAAI,WAAU;kDAAyE;;;;;6DAIxF,mXAAC;wCAAI,WAAU;kDACZ,cAAc,GAAG,CAAC,CAAC,uBAClB,mXAAC;gDAEC,WAAU;;kEAEV,mXAAC;wDAAI,WAAU;;0EACb,mXAAC,+LAAM;gEAAC,WAAU;0EAChB,cAAA,mXAAC,uMAAc;8EACZ,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,WAAW;;;;;;;;;;;0EAGzF,mXAAC;;kFACC,mXAAC;wEAAI,WAAU;kFAAuB,OAAO,IAAI,CAAC,IAAI,IAAI;;;;;;kFAC1D,mXAAC;wEAAI,WAAU;kFAAiC,OAAO,IAAI,CAAC,KAAK;;;;;;;;;;;;;;;;;;kEAGrE,mXAAC;wDAAI,WAAU;;0EACb,mXAAC;gEAAK,WAAW,CAAC,4CAA4C,EAC5D,OAAO,IAAI,KAAK,WACZ,6CACA,4CACJ;0EACC,OAAO,IAAI,KAAK,WAAW,QAAQ;;;;;;0EAEtC,mXAAC,+LAAM;gEACL,SAAQ;gEACR,MAAK;gEACL,WAAU;gEACV,SAAS,IAAM,aAAa,OAAO,MAAM;0EAEzC,cAAA,mXAAC,kWAAM;oEAAC,WAAU;;;;;;;;;;;;;;;;;;+CA5BjB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwClC;GA1OgB;;QACY,waAAU;QACZ,oMAAS;QACE,qNAAS;;;KAH9B"}}, - {"offset": {"line": 3101, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\nimport Link from \"next/link\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { UserPlus, Network, Map, Calendar, Users, ArrowRight, Clock, Search, BookOpen, BarChart3, Calculator } from \"lucide-react\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useMemo, useState, useEffect, useRef } from \"react\"\nimport { StatisticsCharts } from \"@/components/dashboard/statistics-charts\"\nimport { format } from \"date-fns\"\nimport { useSession } from \"next-auth/react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { CollaboratorDialog } from \"@/components/tree/collaborator-dialog\"\n\ninterface ActivityLog {\n id: string\n action: string\n entityType: string\n entityId?: string | null\n entityName?: string | null\n timestamp: string\n user?: {\n name?: string | null\n email?: string | null\n }\n}\n\nexport default function DashboardPage() {\n const { treeData, isLoading, currentTree } = useFamily()\n const { data: session } = useSession()\n const [recentActivities, setRecentActivities] = useState([])\n \n // 加载最近的操作日志\n useEffect(() => {\n if (currentTree?.id && session?.user?.id) {\n fetch(`/api/trees/${currentTree.id}/activity-logs?limit=10`)\n .then(res => {\n if (!res.ok) {\n throw new Error('获取活动日志失败')\n }\n return res.json()\n })\n .then(data => {\n if (data.logs) {\n setRecentActivities(data.logs)\n }\n })\n .catch(err => {\n console.error('获取活动日志失败:', err)\n setRecentActivities([])\n })\n } else {\n setRecentActivities([])\n }\n }, [currentTree?.id, session?.user?.id])\n \n // 计算统计数据\n const stats = useMemo(() => {\n const members = Object.values(treeData.members)\n const totalMembers = members.length\n \n // 在世和已故人数\n const livingMembers = members.filter(m => !m.deathDate).length\n const deceasedMembers = members.filter(m => m.deathDate).length\n \n // 性别统计\n const maleCount = members.filter(m => m.gender === 'MALE').length\n const femaleCount = members.filter(m => m.gender === 'FEMALE').length\n \n // 计算最大代数(处理空数组的情况)\n const generations = members.map(m => m.generation || 0)\n const maxGeneration = generations.length > 0 ? Math.max(...generations) : 0\n \n // 计算最早出生年份\n const birthYears = members\n .map(m => m.birthDate ? new Date(m.birthDate).getFullYear() : null)\n .filter(y => y !== null) as number[]\n const earliestYear = birthYears.length > 0 ? Math.min(...birthYears) : new Date().getFullYear()\n const yearsSpan = birthYears.length > 0 ? new Date().getFullYear() - earliestYear : 0\n \n // 计算平均寿命(只统计已故成员)\n const deceasedWithAge = members.filter(m => m.birthDate && m.deathDate)\n const totalAge = deceasedWithAge.reduce((sum, m) => {\n const birthYear = new Date(m.birthDate!).getFullYear()\n const deathYear = new Date(m.deathDate!).getFullYear()\n return sum + (deathYear - birthYear)\n }, 0)\n const averageLifespan = deceasedWithAge.length > 0 \n ? Math.round(totalAge / deceasedWithAge.length) \n : 0\n \n return {\n totalMembers,\n livingMembers,\n deceasedMembers,\n maleCount,\n femaleCount,\n maxGeneration,\n yearsSpan,\n earliestYear,\n averageLifespan\n }\n }, [treeData])\n \n // 获取最近的成员(按ID排序,取最新的5个)\n const recentMembers = useMemo(() => {\n return Object.values(treeData.members)\n .sort((a, b) => parseInt(b.id) - parseInt(a.id))\n .slice(0, 5)\n }, [treeData])\n \n // 获取本月纪念日(生日和忌日)\n const monthlyAnniversaries = useMemo(() => {\n const currentMonth = new Date().getMonth() + 1\n const members = Object.values(treeData.members)\n \n const anniversaries: Array<{\n member: any\n type: 'birth' | 'death'\n date: string\n day: number\n }> = []\n \n members.forEach(member => {\n // 检查生日\n if (member.birthDate) {\n const birthMonth = new Date(member.birthDate).getMonth() + 1\n const birthDay = new Date(member.birthDate).getDate()\n if (birthMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'birth',\n date: member.birthDate,\n day: birthDay\n })\n }\n }\n \n // 检查忌日\n if (member.deathDate) {\n const deathMonth = new Date(member.deathDate).getMonth() + 1\n const deathDay = new Date(member.deathDate).getDate()\n if (deathMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'death',\n date: member.deathDate,\n day: deathDay\n })\n }\n }\n })\n \n // 按日期排序\n return anniversaries.sort((a, b) => a.day - b.day).slice(0, 5)\n }, [treeData])\n return (\n
\n \n\n
\n
\n
\n
\n

\n {currentTree?.name || '家族族谱'}\n

\n {currentTree?.currentUserRole && (\n \n {currentTree.currentUserRole === 'OWNER' ? '所有者' : \n currentTree.currentUserRole === 'EDITOR' ? '编辑者' : '查看者'}\n \n )}\n
\n

\n {currentTree?.description || '记录家族历史,传承家族文化'}\n {stats.maxGeneration > 0 && ` · 第 ${stats.maxGeneration} 代传人`}\n

\n
\n
\n {session && currentTree?.ownerId === session.user?.id && (\n \n )}\n {(currentTree?.currentUserRole === \"OWNER\" || currentTree?.currentUserRole === \"EDITOR\") && (\n \n \n \n )}\n
\n
\n\n
\n } \n />\n } \n />\n } \n />\n 0 ? Math.round(stats.livingMembers / stats.totalMembers * 100) : 0}%`} \n icon={} \n />\n 0 ? `${stats.averageLifespan} 岁` : '暂无数据'} \n subtitle={`已统计 ${stats.deceasedMembers} 人`} \n icon={} \n />\n \n \n
\n

性别比例

\n
\n \n
\n
\n
\n
\n \n 1\n \n :\n \n {stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0'}\n \n
\n
\n 男性 : 女性\n
\n \n {/* 双色进度条 */}\n
\n
\n \n \n 男性 {stats.maleCount}\n \n \n 女性 {stats.femaleCount}\n \n \n
\n
\n
0 ? (stats.maleCount / stats.totalMembers * 100) : 0}%` }}\n >\n {stats.totalMembers > 0 && stats.maleCount > 0 && (\n \n {Math.round(stats.maleCount / stats.totalMembers * 100)}%\n \n )}\n
\n
0 ? (stats.femaleCount / stats.totalMembers * 100) : 0}%` }}\n >\n {stats.totalMembers > 0 && stats.femaleCount > 0 && (\n \n {Math.round(stats.femaleCount / stats.totalMembers * 100)}%\n \n )}\n
\n
\n
\n
\n
\n
\n \n
\n\n \n
\n \n 最近更新\n 近期纪念日\n 统计图表\n 迁徙记录\n \n \n \n \n
\n\n \n
\n \n \n 近期修谱动态\n 记录家族成员的最新变动与修订\n \n \n \n
\n {recentActivities.length > 0 ? (\n recentActivities.map((activity, i) => (\n
\n
\n
\n
\n
\n
\n
\n \n {activity.action === 'create' ? '创建' :\n activity.action === 'update' ? '更新' :\n activity.action === 'delete' ? '删除' : '导入'}\n \n {activity.entityName || '未知'}\n \n {format(new Date(activity.timestamp), 'MM-dd HH:mm')}\n \n
\n

\n {activity.action === 'create' && '新增了家族成员'}\n {activity.action === 'update' && '更新了成员信息'}\n {activity.action === 'delete' && '删除了成员'}\n {activity.action === 'import' && '导入了家族数据'}\n

\n
\n
\n ))\n ) : (\n
\n 暂无修谱记录\n
\n )}\n
\n
\n
\n
\n\n
\n \n \n \n \n 本月祭祖/纪念\n \n \n \n {monthlyAnniversaries.length > 0 ? (\n monthlyAnniversaries.map((anniversary, index) => {\n const yearsAgo = new Date().getFullYear() - new Date(anniversary.date).getFullYear()\n return (\n \n
\n
\n \n {new Date(anniversary.date).getMonth() + 1}月\n \n {anniversary.day}\n
\n
\n

\n {anniversary.member.fullName} {anniversary.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {anniversary.member.generation} 世 · 距今 {yearsAgo} 年\n {anniversary.type === 'death' && ' · 已故'}\n

\n
\n
\n \n )\n })\n ) : (\n
\n 本月暂无纪念日\n
\n )}\n
\n
\n
\n
\n
\n\n {/* 近期纪念日标签页 */}\n \n \n \n 近期纪念日\n 未来三个月内的生日和忌日\n \n \n
\n {(() => {\n const now = new Date()\n const threeMonthsLater = new Date(now.getFullYear(), now.getMonth() + 3, now.getDate())\n const members = Object.values(treeData.members)\n const upcomingEvents: Array<{\n member: any\n type: 'birth' | 'death'\n date: Date\n originalDate: string\n }> = []\n\n members.forEach(member => {\n // 生日\n if (member.birthDate) {\n const birthDate = new Date(member.birthDate)\n const thisYearBirth = new Date(now.getFullYear(), birthDate.getMonth(), birthDate.getDate())\n if (thisYearBirth >= now && thisYearBirth <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'birth',\n date: thisYearBirth,\n originalDate: member.birthDate\n })\n }\n }\n\n // 忌日\n if (member.deathDate) {\n const deathDate = new Date(member.deathDate)\n const thisYearDeath = new Date(now.getFullYear(), deathDate.getMonth(), deathDate.getDate())\n if (thisYearDeath >= now && thisYearDeath <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'death',\n date: thisYearDeath,\n originalDate: member.deathDate\n })\n }\n }\n })\n\n upcomingEvents.sort((a, b) => a.date.getTime() - b.date.getTime())\n\n return upcomingEvents.length > 0 ? (\n upcomingEvents.map((event, index) => {\n const yearsAgo = now.getFullYear() - new Date(event.originalDate).getFullYear()\n return (\n \n \n \n
\n
\n {event.date.getMonth() + 1}月\n {event.date.getDate()}\n
\n
\n

\n {event.member.fullName} {event.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {event.member.generation} 世 · {yearsAgo} 年\n {event.type === 'death' && ' · 已故'}\n

\n
\n
\n
\n
\n \n )\n })\n ) : (\n
\n 未来三个月暂无纪念日\n
\n )\n })()}\n
\n
\n
\n
\n\n {/* 统计图表标签页 */}\n \n \n \n\n {/* 迁徙记录标签页 */}\n \n \n \n 家族迁徙记录\n 记录家族成员的籍贯分布\n \n \n
\n {useMemo(() => {\n const members = Object.values(treeData.members)\n const locationGroups: Record = {}\n\n members.forEach(member => {\n if (member.ancestralHome) {\n if (!locationGroups[member.ancestralHome]) {\n locationGroups[member.ancestralHome] = []\n }\n locationGroups[member.ancestralHome].push(member)\n }\n })\n\n const sortedLocations = Object.entries(locationGroups)\n .sort((a, b) => b[1].length - a[1].length)\n\n return sortedLocations.length > 0 ? (\n sortedLocations.map(([location, locationMembers]) => (\n
\n
\n

{location}

\n \n {locationMembers.length} 人\n \n
\n
\n {locationMembers.map((member: any) => (\n \n
\n

{member.fullName}

\n

第 {member.generation} 世

\n
\n \n ))}\n
\n
\n ))\n ) : (\n
\n 暂无迁徙记录\n
\n )\n }, [treeData])}\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nfunction StatCard({\n title,\n value,\n subtitle,\n icon,\n}: { title: string; value: string; subtitle: string; icon: React.ReactNode }) {\n return (\n \n \n
\n

{title}

\n
\n {icon}\n
\n
\n
\n {value}\n

{subtitle}

\n
\n
\n
\n \n )\n}\n"],"names":[],"mappings":"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"}}] + {"offset": {"line": 3101, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\nimport Link from \"next/link\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { UserPlus, Network, Map, Calendar, Users, ArrowRight, Clock, Search, BookOpen, BarChart3, Calculator } from \"lucide-react\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useMemo, useState, useEffect, useRef } from \"react\"\nimport { StatisticsCharts } from \"@/components/dashboard/statistics-charts\"\nimport { format } from \"date-fns\"\nimport { useSession } from \"next-auth/react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { CollaboratorDialog } from \"@/components/tree/collaborator-dialog\"\n\ninterface ActivityLog {\n id: string\n action: string\n entityType: string\n entityId?: string | null\n entityName?: string | null\n timestamp: string\n user?: {\n name?: string | null\n email?: string | null\n }\n}\n\nexport default function DashboardPage() {\n const { treeData, isLoading, currentTree } = useFamily()\n const { data: session } = useSession()\n const [recentActivities, setRecentActivities] = useState([])\n \n // 加载最近的操作日志\n useEffect(() => {\n if (currentTree?.id && session?.user?.id) {\n fetch(`/api/trees/${currentTree.id}/activity-logs?limit=10`)\n .then(res => {\n if (!res.ok) {\n throw new Error('获取活动日志失败')\n }\n return res.json()\n })\n .then(data => {\n if (data.logs) {\n setRecentActivities(data.logs)\n }\n })\n .catch(err => {\n console.error('获取活动日志失败:', err)\n setRecentActivities([])\n })\n } else {\n setRecentActivities([])\n }\n }, [currentTree?.id, session?.user?.id])\n \n // 计算统计数据\n const stats = useMemo(() => {\n const members = Object.values(treeData.members)\n const totalMembers = members.length\n \n // 在世和已故人数\n const livingMembers = members.filter(m => !m.deathDate).length\n const deceasedMembers = members.filter(m => m.deathDate).length\n \n // 性别统计\n const maleCount = members.filter(m => m.gender === 'MALE').length\n const femaleCount = members.filter(m => m.gender === 'FEMALE').length\n \n // 计算最大代数(处理空数组的情况)\n const generations = members.map(m => m.generation || 0)\n const maxGeneration = generations.length > 0 ? Math.max(...generations) : 0\n \n // 计算最早出生年份\n const birthYears = members\n .map(m => m.birthDate ? new Date(m.birthDate).getFullYear() : null)\n .filter(y => y !== null) as number[]\n const earliestYear = birthYears.length > 0 ? Math.min(...birthYears) : new Date().getFullYear()\n const yearsSpan = birthYears.length > 0 ? new Date().getFullYear() - earliestYear : 0\n \n // 计算平均寿命(只统计已故成员)\n const deceasedWithAge = members.filter(m => m.birthDate && m.deathDate)\n const totalAge = deceasedWithAge.reduce((sum, m) => {\n const birthYear = new Date(m.birthDate!).getFullYear()\n const deathYear = new Date(m.deathDate!).getFullYear()\n return sum + (deathYear - birthYear)\n }, 0)\n const averageLifespan = deceasedWithAge.length > 0 \n ? Math.round(totalAge / deceasedWithAge.length) \n : 0\n \n return {\n totalMembers,\n livingMembers,\n deceasedMembers,\n maleCount,\n femaleCount,\n maxGeneration,\n yearsSpan,\n earliestYear,\n averageLifespan\n }\n }, [treeData])\n \n // 获取最近的成员(按ID排序,取最新的5个)\n const recentMembers = useMemo(() => {\n return Object.values(treeData.members)\n .sort((a, b) => parseInt(b.id) - parseInt(a.id))\n .slice(0, 5)\n }, [treeData])\n \n // 获取本月纪念日(生日和忌日)\n const monthlyAnniversaries = useMemo(() => {\n const currentMonth = new Date().getMonth() + 1\n const members = Object.values(treeData.members)\n \n const anniversaries: Array<{\n member: any\n type: 'birth' | 'death'\n date: string\n day: number\n }> = []\n \n members.forEach(member => {\n // 检查生日\n if (member.birthDate) {\n const birthMonth = new Date(member.birthDate).getMonth() + 1\n const birthDay = new Date(member.birthDate).getDate()\n if (birthMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'birth',\n date: member.birthDate,\n day: birthDay\n })\n }\n }\n \n // 检查忌日\n if (member.deathDate) {\n const deathMonth = new Date(member.deathDate).getMonth() + 1\n const deathDay = new Date(member.deathDate).getDate()\n if (deathMonth === currentMonth) {\n anniversaries.push({\n member,\n type: 'death',\n date: member.deathDate,\n day: deathDay\n })\n }\n }\n })\n \n // 按日期排序\n return anniversaries.sort((a, b) => a.day - b.day).slice(0, 5)\n }, [treeData])\n return (\n
\n \n\n
\n
\n
\n
\n

\n {currentTree?.name || '家族族谱'}\n

\n {currentTree?.currentUserRole && (\n \n {currentTree.currentUserRole === 'OWNER' ? '所有者' : \n currentTree.currentUserRole === 'EDITOR' ? '编辑者' : '查看者'}\n \n )}\n
\n

\n {currentTree?.description || '记录家族历史,传承家族文化'}\n {stats.maxGeneration > 0 && ` · 第 ${stats.maxGeneration} 代传人`}\n

\n
\n
\n {session && currentTree?.ownerId === session.user?.id && (\n \n )}\n {(currentTree?.currentUserRole === \"OWNER\" || currentTree?.currentUserRole === \"EDITOR\") && (\n \n \n \n )}\n
\n
\n\n
\n } \n />\n } \n />\n } \n />\n 0 ? Math.round(stats.livingMembers / stats.totalMembers * 100) : 0}%`} \n icon={} \n />\n 0 ? `${stats.averageLifespan} 岁` : '暂无数据'} \n subtitle={`已统计 ${stats.deceasedMembers} 人`} \n icon={} \n />\n \n \n
\n

性别比例

\n
\n \n
\n
\n
\n
\n 1\n :\n \n {stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0'}\n \n
\n
\n 男性 {stats.maleCount} · 女性 {stats.femaleCount}\n
\n
\n
\n
\n \n
\n\n \n
\n \n 最近更新\n 近期纪念日\n 统计图表\n 迁徙记录\n \n \n \n \n
\n\n \n
\n \n \n 近期修谱动态\n 记录家族成员的最新变动与修订\n \n \n \n
\n {recentActivities.length > 0 ? (\n recentActivities.map((activity, i) => (\n
\n
\n
\n
\n
\n
\n
\n \n {activity.action === 'create' ? '创建' :\n activity.action === 'update' ? '更新' :\n activity.action === 'delete' ? '删除' : '导入'}\n \n {activity.entityName || '未知'}\n \n {format(new Date(activity.timestamp), 'MM-dd HH:mm')}\n \n
\n

\n {activity.action === 'create' && '新增了家族成员'}\n {activity.action === 'update' && '更新了成员信息'}\n {activity.action === 'delete' && '删除了成员'}\n {activity.action === 'import' && '导入了家族数据'}\n

\n
\n
\n ))\n ) : (\n
\n 暂无修谱记录\n
\n )}\n
\n
\n
\n
\n\n
\n \n \n \n \n 本月祭祖/纪念\n \n \n \n {monthlyAnniversaries.length > 0 ? (\n monthlyAnniversaries.map((anniversary, index) => {\n const yearsAgo = new Date().getFullYear() - new Date(anniversary.date).getFullYear()\n return (\n \n
\n
\n \n {new Date(anniversary.date).getMonth() + 1}月\n \n {anniversary.day}\n
\n
\n

\n {anniversary.member.fullName} {anniversary.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {anniversary.member.generation} 世 · 距今 {yearsAgo} 年\n {anniversary.type === 'death' && ' · 已故'}\n

\n
\n
\n \n )\n })\n ) : (\n
\n 本月暂无纪念日\n
\n )}\n
\n
\n
\n
\n
\n\n {/* 近期纪念日标签页 */}\n \n \n \n 近期纪念日\n 未来三个月内的生日和忌日\n \n \n
\n {(() => {\n const now = new Date()\n const threeMonthsLater = new Date(now.getFullYear(), now.getMonth() + 3, now.getDate())\n const members = Object.values(treeData.members)\n const upcomingEvents: Array<{\n member: any\n type: 'birth' | 'death'\n date: Date\n originalDate: string\n }> = []\n\n members.forEach(member => {\n // 生日\n if (member.birthDate) {\n const birthDate = new Date(member.birthDate)\n const thisYearBirth = new Date(now.getFullYear(), birthDate.getMonth(), birthDate.getDate())\n if (thisYearBirth >= now && thisYearBirth <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'birth',\n date: thisYearBirth,\n originalDate: member.birthDate\n })\n }\n }\n\n // 忌日\n if (member.deathDate) {\n const deathDate = new Date(member.deathDate)\n const thisYearDeath = new Date(now.getFullYear(), deathDate.getMonth(), deathDate.getDate())\n if (thisYearDeath >= now && thisYearDeath <= threeMonthsLater) {\n upcomingEvents.push({\n member,\n type: 'death',\n date: thisYearDeath,\n originalDate: member.deathDate\n })\n }\n }\n })\n\n upcomingEvents.sort((a, b) => a.date.getTime() - b.date.getTime())\n\n return upcomingEvents.length > 0 ? (\n upcomingEvents.map((event, index) => {\n const yearsAgo = now.getFullYear() - new Date(event.originalDate).getFullYear()\n return (\n \n \n \n
\n
\n {event.date.getMonth() + 1}月\n {event.date.getDate()}\n
\n
\n

\n {event.member.fullName} {event.type === 'birth' ? '诞辰' : '忌日'}\n

\n

\n 第 {event.member.generation} 世 · {yearsAgo} 年\n {event.type === 'death' && ' · 已故'}\n

\n
\n
\n
\n
\n \n )\n })\n ) : (\n
\n 未来三个月暂无纪念日\n
\n )\n })()}\n
\n
\n
\n
\n\n {/* 统计图表标签页 */}\n \n \n \n\n {/* 迁徙记录标签页 */}\n \n \n \n 家族迁徙记录\n 记录家族成员的籍贯分布\n \n \n
\n {useMemo(() => {\n const members = Object.values(treeData.members)\n const locationGroups: Record = {}\n\n members.forEach(member => {\n if (member.ancestralHome) {\n if (!locationGroups[member.ancestralHome]) {\n locationGroups[member.ancestralHome] = []\n }\n locationGroups[member.ancestralHome].push(member)\n }\n })\n\n const sortedLocations = Object.entries(locationGroups)\n .sort((a, b) => b[1].length - a[1].length)\n\n return sortedLocations.length > 0 ? (\n sortedLocations.map(([location, locationMembers]) => (\n
\n
\n

{location}

\n \n {locationMembers.length} 人\n \n
\n
\n {locationMembers.map((member: any) => (\n \n
\n

{member.fullName}

\n

第 {member.generation} 世

\n
\n \n ))}\n
\n
\n ))\n ) : (\n
\n 暂无迁徙记录\n
\n )\n }, [treeData])}\n
\n
\n
\n
\n
\n
\n
\n )\n}\n\nfunction StatCard({\n title,\n value,\n subtitle,\n icon,\n}: { title: string; value: string; subtitle: string; icon: React.ReactNode }) {\n return (\n \n \n
\n

{title}

\n
\n {icon}\n
\n
\n
\n {value}\n

{subtitle}

\n
\n
\n
\n \n )\n}\n"],"names":[],"mappings":"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"}}] } \ No newline at end of file diff --git a/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css b/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css index dc07c7cf..b26d7244 100644 --- a/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css +++ b/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css @@ -195,7 +195,6 @@ --color-blue-200: #bedbff; --color-blue-400: #54a2ff; --color-blue-500: #3080ff; - --color-blue-600: #155dfc; --color-blue-700: #1447e6; --color-blue-800: #193cb8; --color-blue-900: #1c398e; @@ -205,21 +204,21 @@ --color-purple-200: #e9d5ff; --color-purple-500: #ac4bff; --color-purple-700: #8200da; + --color-pink-50: #fdf2f8; --color-pink-100: #fce7f3; + --color-pink-200: #fccee8; --color-pink-400: #fb64b6; - --color-pink-500: #f6339a; - --color-pink-600: #e30076; --color-pink-700: #c4005c; + --color-pink-800: #a2004c; + --color-pink-950: #510424; --color-gray-50: #f9fafb; --color-gray-100: #f3f4f6; --color-gray-200: #e5e7eb; --color-gray-500: #6a7282; --color-gray-700: #364153; --color-neutral-100: #f5f5f5; - --color-neutral-200: #e5e5e5; --color-neutral-400: #a1a1a1; --color-neutral-500: #737373; - --color-neutral-600: #525252; --color-black: #000; --color-white: #fff; --spacing: .25rem; @@ -246,8 +245,6 @@ --text-3xl--line-height: calc(2.25 / 1.875); --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5 / 2.25); - --text-5xl: 3rem; - --text-5xl--line-height: 1; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; @@ -305,7 +302,6 @@ --color-blue-200: lab(86.15% -4.04379 -21.0797); --color-blue-400: lab(65.0361% -1.42065 -56.9802); --color-blue-500: lab(54.1736% 13.3369 -74.6839); - --color-blue-600: lab(44.0605% 29.0279 -86.0352); --color-blue-700: lab(36.9089% 35.0961 -85.6872); --color-blue-800: lab(30.2514% 27.7853 -70.2699); --color-blue-900: lab(26.1542% 15.7545 -51.5504); @@ -315,21 +311,21 @@ --color-purple-200: lab(87.8405% 13.4282 -18.7159); --color-purple-500: lab(52.0183% 66.11 -78.2316); --color-purple-700: lab(36.1758% 69.8525 -80.0381); + --color-pink-50: lab(96.4459% 4.53997 -1.49434); --color-pink-100: lab(93.5864% 9.01193 -3.15079); + --color-pink-200: lab(87.4504% 19.6 -6.46662); --color-pink-400: lab(64.5597% 64.3615 -12.7988); - --color-pink-500: lab(56.9303% 76.8162 -8.07021); - --color-pink-600: lab(49.5493% 79.8381 2.31768); --color-pink-700: lab(42.1737% 71.8009 7.42233); + --color-pink-800: lab(34.9559% 60.2885 5.99639); + --color-pink-950: lab(15.6116% 35.2166 3.53979); --color-gray-50: lab(98.2596% -.247031 -.706708); --color-gray-100: lab(96.1596% -.0823438 -1.13575); --color-gray-200: lab(91.6229% -.159115 -2.26791); --color-gray-500: lab(47.7841% -.393182 -10.0268); --color-gray-700: lab(27.1134% -.956401 -12.3224); --color-neutral-100: lab(96.52% -.0000298023 .0000119209); - --color-neutral-200: lab(90.952% 0 -.0000119209); --color-neutral-400: lab(66.128% -.0000298023 .0000119209); --color-neutral-500: lab(48.496% 0 0); - --color-neutral-600: lab(34.924% 0 0); } } } @@ -733,10 +729,6 @@ top: 100%; } - .-right-0\.5 { - right: calc(var(--spacing) * -.5); - } - .-right-1 { right: calc(var(--spacing) * -1); } @@ -765,10 +757,6 @@ right: calc(var(--spacing) * 4); } - .-bottom-0\.5 { - bottom: calc(var(--spacing) * -.5); - } - .-bottom-1 { bottom: calc(var(--spacing) * -1); } @@ -951,10 +939,6 @@ margin-block: calc(var(--spacing) * 1); } - .-mt-2 { - margin-top: calc(var(--spacing) * -2); - } - .-mt-4 { margin-top: calc(var(--spacing) * -4); } @@ -1202,10 +1186,6 @@ height: calc(var(--spacing) * 3); } - .h-3\.5 { - height: calc(var(--spacing) * 3.5); - } - .h-4 { height: calc(var(--spacing) * 4); } @@ -1390,10 +1370,6 @@ width: calc(var(--spacing) * 3); } - .w-3\.5 { - width: calc(var(--spacing) * 3.5); - } - .w-3\/4 { width: 75%; } @@ -1883,12 +1859,6 @@ gap: calc(var(--spacing) * 8); } - :where(.space-y-0 > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse))); - } - :where(.space-y-0\.5 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse)); @@ -2128,6 +2098,16 @@ border-color: var(--color-blue-200); } + .border-blue-200\/50 { + border-color: #bedbff80; + } + + @supports (color: color-mix(in lab, red, red)) { + .border-blue-200\/50 { + border-color: color-mix(in oklab, var(--color-blue-200) 50%, transparent); + } + } + .border-blue-500 { border-color: var(--color-blue-500); } @@ -2202,14 +2182,20 @@ } } - .border-neutral-200 { - border-color: var(--color-neutral-200); - } - .border-orange-200 { border-color: var(--color-orange-200); } + .border-pink-200\/50 { + border-color: #fccee880; + } + + @supports (color: color-mix(in lab, red, red)) { + .border-pink-200\/50 { + border-color: color-mix(in oklab, var(--color-pink-200) 50%, transparent); + } + } + .border-primary { border-color: var(--primary); } @@ -2336,6 +2322,16 @@ background-color: var(--color-blue-50); } + .bg-blue-50\/50 { + background-color: #eff6ff80; + } + + @supports (color: color-mix(in lab, red, red)) { + .bg-blue-50\/50 { + background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent); + } + } + .bg-blue-100 { background-color: var(--color-blue-100); } @@ -2390,36 +2386,6 @@ background-color: var(--foreground); } - .bg-foreground\/25 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/25 { - background-color: color-mix(in oklab, var(--foreground) 25%, transparent); - } - } - - .bg-foreground\/50 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/50 { - background-color: color-mix(in oklab, var(--foreground) 50%, transparent); - } - } - - .bg-foreground\/60 { - background-color: var(--foreground); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-foreground\/60 { - background-color: color-mix(in oklab, var(--foreground) 60%, transparent); - } - } - .bg-gray-50 { background-color: var(--color-gray-50); } @@ -2488,12 +2454,18 @@ background-color: var(--color-orange-500); } - .bg-pink-100 { - background-color: var(--color-pink-100); + .bg-pink-50\/50 { + background-color: #fdf2f880; } - .bg-pink-500 { - background-color: var(--color-pink-500); + @supports (color: color-mix(in lab, red, red)) { + .bg-pink-50\/50 { + background-color: color-mix(in oklab, var(--color-pink-50) 50%, transparent); + } + } + + .bg-pink-100 { + background-color: var(--color-pink-100); } .bg-popover { @@ -2534,36 +2506,6 @@ } } - .bg-primary\/40 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/40 { - background-color: color-mix(in oklab, var(--primary) 40%, transparent); - } - } - - .bg-primary\/60 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/60 { - background-color: color-mix(in oklab, var(--primary) 60%, transparent); - } - } - - .bg-primary\/70 { - background-color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .bg-primary\/70 { - background-color: color-mix(in oklab, var(--primary) 70%, transparent); - } - } - .bg-purple-50 { background-color: var(--color-purple-50); } @@ -2622,26 +2564,11 @@ background-image: url("https://www.transparenttextures.com/patterns/rice-paper.png"); } - .from-blue-500 { - --tw-gradient-from: var(--color-blue-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .from-blue-600 { - --tw-gradient-from: var(--color-blue-600); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-card { --tw-gradient-from: var(--card); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .from-pink-500 { - --tw-gradient-from: var(--color-pink-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-primary\/5 { --tw-gradient-from: var(--primary); } @@ -2682,22 +2609,6 @@ --tw-gradient-stops: var(--tw-gradient-via-stops); } - .via-purple-500 { - --tw-gradient-via: var(--color-purple-500); - --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-via-stops); - } - - .to-blue-400 { - --tw-gradient-to: var(--color-blue-400); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-blue-500 { - --tw-gradient-to: var(--color-blue-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-card\/50 { --tw-gradient-to: var(--card); } @@ -2712,21 +2623,6 @@ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .to-pink-400 { - --tw-gradient-to: var(--color-pink-400); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-pink-500 { - --tw-gradient-to: var(--color-pink-500); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - - .to-pink-600 { - --tw-gradient-to: var(--color-pink-600); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-primary\/50 { --tw-gradient-to: var(--primary); } @@ -3022,11 +2918,6 @@ line-height: var(--tw-leading, var(--text-4xl--line-height)); } - .text-5xl { - font-size: var(--text-5xl); - line-height: var(--tw-leading, var(--text-5xl--line-height)); - } - .text-base { font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); @@ -3178,10 +3069,6 @@ color: var(--color-blue-400); } - .text-blue-600 { - color: var(--color-blue-600); - } - .text-blue-700 { color: var(--color-blue-700); } @@ -3274,10 +3161,6 @@ color: var(--color-neutral-500); } - .text-neutral-600 { - color: var(--color-neutral-600); - } - .text-orange-700 { color: var(--color-orange-700); } @@ -3286,10 +3169,6 @@ color: var(--color-pink-400); } - .text-pink-600 { - color: var(--color-pink-600); - } - .text-pink-700 { color: var(--color-pink-700); } @@ -3316,16 +3195,6 @@ } } - .text-primary\/80 { - color: var(--primary); - } - - @supports (color: color-mix(in lab, red, red)) { - .text-primary\/80 { - color: color-mix(in oklab, var(--primary) 80%, transparent); - } - } - .text-purple-700 { color: var(--color-purple-700); } @@ -3611,11 +3480,6 @@ transition-duration: .3s; } - .duration-500 { - --tw-duration: .5s; - transition-duration: .5s; - } - .duration-1000 { --tw-duration: 1s; transition-duration: 1s; @@ -4158,12 +4022,6 @@ } } - @media (hover: hover) { - .hover\:bg-card:hover { - background-color: var(--card); - } - } - @media (hover: hover) { .hover\:bg-destructive:hover { background-color: var(--destructive); @@ -5897,10 +5755,30 @@ border-color: var(--color-blue-800); } + .dark\:border-blue-800\/30:is(.dark *) { + border-color: #193cb84d; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:border-blue-800\/30:is(.dark *) { + border-color: color-mix(in oklab, var(--color-blue-800) 30%, transparent); + } + } + .dark\:border-input:is(.dark *) { border-color: var(--input); } + .dark\:border-pink-800\/30:is(.dark *) { + border-color: #a2004c4d; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:border-pink-800\/30:is(.dark *) { + border-color: color-mix(in oklab, var(--color-pink-800) 30%, transparent); + } + } + .dark\:bg-blue-900\/20:is(.dark *) { background-color: #1c398e33; } @@ -5915,6 +5793,16 @@ background-color: var(--color-blue-950); } + .dark\:bg-blue-950\/20:is(.dark *) { + background-color: #16245633; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:bg-blue-950\/20:is(.dark *) { + background-color: color-mix(in oklab, var(--color-blue-950) 20%, transparent); + } + } + .dark\:bg-destructive\/60:is(.dark *) { background-color: var(--destructive); } @@ -5935,6 +5823,16 @@ } } + .dark\:bg-pink-950\/20:is(.dark *) { + background-color: #51042433; + } + + @supports (color: color-mix(in lab, red, red)) { + .dark\:bg-pink-950\/20:is(.dark *) { + background-color: color-mix(in oklab, var(--color-pink-950) 20%, transparent); + } + } + .dark\:bg-transparent:is(.dark *) { background-color: #0000; } @@ -5957,18 +5855,10 @@ color: var(--color-blue-200); } - .dark\:text-blue-400:is(.dark *) { - color: var(--color-blue-400); - } - .dark\:text-muted-foreground:is(.dark *) { color: var(--muted-foreground); } - .dark\:text-pink-400:is(.dark *) { - color: var(--color-pink-400); - } - .dark\:text-yellow-200:is(.dark *) { color: var(--color-yellow-200); } diff --git a/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css.map b/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css.map index 1d9df7e4..2d6d36c8 100644 --- a/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css.map +++ b/.next/dev/static/chunks/[root-of-the-server]__6d150df4._.css.map @@ -4,5 +4,5 @@ "sections": [ {"offset": {"line": 1, "column": 0}, "map": {"version":3,"sources":["turbopack:///[next]/internal/font/google/geist_a7695b8e.module.css"],"sourcesContent":["/* cyrillic */\n@font-face {\n font-family: 'Geist';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwYGFWNOITddY4.woff2%22,%22preload%22:false,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwSGFWNOITddY4.woff2%22,%22preload%22:false,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwcGFWNOITd.woff2%22,%22preload%22:true,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@font-face {\n font-family: 'Geist Fallback';\n src: local(\"Arial\");\n ascent-override: 95.94%;\ndescent-override: 28.16%;\nline-gap-override: 0.00%;\nsize-adjust: 104.76%;\n\n}\n.className {\n font-family: 'Geist', 'Geist Fallback';\n font-style: normal;\n\n}\n"],"names":[],"mappings":"AACA;;;;;;;;;AASA;;;;;;;;;AASA;;;;;;;;;AAQA;;;;;;;;;AASA","ignoreList":[0]}}, {"offset": {"line": 43, "column": 0}, "map": {"version":3,"sources":["turbopack:///[next]/internal/font/google/geist_mono_354fc78.module.css"],"sourcesContent":["/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geistmono/v4/or3nQ6H-1_WfwkMZI_qYFrMdmhHkjkotbA.woff2%22,%22preload%22:false,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geistmono/v4/or3nQ6H-1_WfwkMZI_qYFrkdmhHkjkotbA.woff2%22,%22preload%22:false,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 100 900;\n font-display: swap;\n src: url(@vercel/turbopack-next/internal/font/google/font?{%22url%22:%22https://fonts.gstatic.com/s/geistmono/v4/or3nQ6H-1_WfwkMZI_qYFrcdmhHkjko.woff2%22,%22preload%22:true,%22has_size_adjust%22:true}) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@font-face {\n font-family: 'Geist Mono Fallback';\n src: local(\"Arial\");\n ascent-override: 74.67%;\ndescent-override: 21.92%;\nline-gap-override: 0.00%;\nsize-adjust: 134.59%;\n\n}\n.className {\n font-family: 'Geist Mono', 'Geist Mono Fallback';\n font-style: normal;\n\n}\n"],"names":[],"mappings":"AACA;;;;;;;;;AASA;;;;;;;;;AASA;;;;;;;;;AAQA;;;;;;;;;AASA","ignoreList":[0]}}, - {"offset": {"line": 85, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/globals.css"],"sourcesContent":["/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-200: oklch(92.2% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-neutral-600: oklch(43.9% 0 0);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-6xl: 72rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --radius-xs: 0.125rem;\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --aspect-video: 16 / 9;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --default-mono-font-family: \"Geist Mono\", monospace;\n --color-border: var(--border);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .\\@container\\/field-group {\n container-type: inline-size;\n container-name: field-group;\n }\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .invisible {\n visibility: hidden;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .inset-x-0 {\n inset-inline: calc(var(--spacing) * 0);\n }\n .inset-y-0 {\n inset-block: calc(var(--spacing) * 0);\n }\n .-top-1 {\n top: calc(var(--spacing) * -1);\n }\n .-top-3 {\n top: calc(var(--spacing) * -3);\n }\n .-top-12 {\n top: calc(var(--spacing) * -12);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n .top-2\\.5 {\n top: calc(var(--spacing) * 2.5);\n }\n .top-3\\.5 {\n top: calc(var(--spacing) * 3.5);\n }\n .top-4 {\n top: calc(var(--spacing) * 4);\n }\n .top-20 {\n top: calc(var(--spacing) * 20);\n }\n .top-\\[1px\\] {\n top: 1px;\n }\n .top-\\[50\\%\\] {\n top: 50%;\n }\n .top-\\[60\\%\\] {\n top: 60%;\n }\n .top-full {\n top: 100%;\n }\n .-right-0\\.5 {\n right: calc(var(--spacing) * -0.5);\n }\n .-right-1 {\n right: calc(var(--spacing) * -1);\n }\n .-right-12 {\n right: calc(var(--spacing) * -12);\n }\n .right-0 {\n right: calc(var(--spacing) * 0);\n }\n .right-1 {\n right: calc(var(--spacing) * 1);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n .-bottom-0\\.5 {\n bottom: calc(var(--spacing) * -0.5);\n }\n .-bottom-1 {\n bottom: calc(var(--spacing) * -1);\n }\n .-bottom-12 {\n bottom: calc(var(--spacing) * -12);\n }\n .bottom-0 {\n bottom: calc(var(--spacing) * 0);\n }\n .bottom-2 {\n bottom: calc(var(--spacing) * 2);\n }\n .bottom-4 {\n bottom: calc(var(--spacing) * 4);\n }\n .-left-12 {\n left: calc(var(--spacing) * -12);\n }\n .-left-16 {\n left: calc(var(--spacing) * -16);\n }\n .-left-\\[9px\\] {\n left: calc(9px * -1);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-2 {\n left: calc(var(--spacing) * 2);\n }\n .left-2\\.5 {\n left: calc(var(--spacing) * 2.5);\n }\n .left-4 {\n left: calc(var(--spacing) * 4);\n }\n .left-\\[50\\%\\] {\n left: 50%;\n }\n .isolate {\n isolation: isolate;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-30 {\n z-index: 30;\n }\n .z-50 {\n z-index: 50;\n }\n .z-\\[1\\] {\n z-index: 1;\n }\n .z-\\[100\\] {\n z-index: 100;\n }\n .order-first {\n order: -9999;\n }\n .order-last {\n order: 9999;\n }\n .col-span-full {\n grid-column: 1 / -1;\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .\\!m-0 {\n margin: calc(var(--spacing) * 0) !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1);\n }\n .mx-2 {\n margin-inline: calc(var(--spacing) * 2);\n }\n .mx-3\\.5 {\n margin-inline: calc(var(--spacing) * 3.5);\n }\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .-my-2 {\n margin-block: calc(var(--spacing) * -2);\n }\n .my-0 {\n margin-block: calc(var(--spacing) * 0);\n }\n .my-0\\.5 {\n margin-block: calc(var(--spacing) * 0.5);\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1);\n }\n .-mt-2 {\n margin-top: calc(var(--spacing) * -2);\n }\n .-mt-4 {\n margin-top: calc(var(--spacing) * -4);\n }\n .mt-0 {\n margin-top: calc(var(--spacing) * 0);\n }\n .mt-0\\.5 {\n margin-top: calc(var(--spacing) * 0.5);\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(var(--spacing) * 1.5);\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-auto {\n margin-top: auto;\n }\n .mr-1 {\n margin-right: calc(var(--spacing) * 1);\n }\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-8 {\n margin-bottom: calc(var(--spacing) * 8);\n }\n .-ml-4 {\n margin-left: calc(var(--spacing) * -4);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\n }\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n .ml-6 {\n margin-left: calc(var(--spacing) * 6);\n }\n .ml-auto {\n margin-left: auto;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .table-caption {\n display: table-caption;\n }\n .table-cell {\n display: table-cell;\n }\n .table-row {\n display: table-row;\n }\n .field-sizing-content {\n field-sizing: content;\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .aspect-video {\n aspect-ratio: var(--aspect-video);\n }\n .size-\\(--cell-size\\) {\n width: var(--cell-size);\n height: var(--cell-size);\n }\n .size-2 {\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n }\n .size-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n height: calc(var(--spacing) * 2.5);\n }\n .size-3 {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n .size-4 {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n .size-6 {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n .size-7 {\n width: calc(var(--spacing) * 7);\n height: calc(var(--spacing) * 7);\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .size-auto {\n width: auto;\n height: auto;\n }\n .size-full {\n width: 100%;\n height: 100%;\n }\n .h-\\(--cell-size\\) {\n height: var(--cell-size);\n }\n .h-1 {\n height: calc(var(--spacing) * 1);\n }\n .h-1\\.5 {\n height: calc(var(--spacing) * 1.5);\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-2\\.5 {\n height: calc(var(--spacing) * 2.5);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-3\\.5 {\n height: calc(var(--spacing) * 3.5);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-12 {\n height: calc(var(--spacing) * 12);\n }\n .h-14 {\n height: calc(var(--spacing) * 14);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-20 {\n height: calc(var(--spacing) * 20);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-\\[1\\.15rem\\] {\n height: 1.15rem;\n }\n .h-\\[300px\\] {\n height: 300px;\n }\n .h-\\[400px\\] {\n height: 400px;\n }\n .h-\\[600px\\] {\n height: 600px;\n }\n .h-\\[calc\\(100\\%-1px\\)\\] {\n height: calc(100% - 1px);\n }\n .h-\\[var\\(--radix-navigation-menu-viewport-height\\)\\] {\n height: var(--radix-navigation-menu-viewport-height);\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .h-px {\n height: 1px;\n }\n .h-screen {\n height: 100vh;\n }\n .h-svh {\n height: 100svh;\n }\n .max-h-\\(--radix-context-menu-content-available-height\\) {\n max-height: var(--radix-context-menu-content-available-height);\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height);\n }\n .max-h-\\(--radix-select-content-available-height\\) {\n max-height: var(--radix-select-content-available-height);\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96);\n }\n .max-h-\\[60vh\\] {\n max-height: 60vh;\n }\n .max-h-\\[70vh\\] {\n max-height: 70vh;\n }\n .max-h-\\[300px\\] {\n max-height: 300px;\n }\n .max-h-screen {\n max-height: 100vh;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-4 {\n min-height: calc(var(--spacing) * 4);\n }\n .min-h-16 {\n min-height: calc(var(--spacing) * 16);\n }\n .min-h-\\[200px\\] {\n min-height: 200px;\n }\n .min-h-full {\n min-height: 100%;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .min-h-svh {\n min-height: 100svh;\n }\n .w-\\(--cell-size\\) {\n width: var(--cell-size);\n }\n .w-\\(--sidebar-width\\) {\n width: var(--sidebar-width);\n }\n .w-0 {\n width: calc(var(--spacing) * 0);\n }\n .w-1 {\n width: calc(var(--spacing) * 1);\n }\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n .w-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n }\n .w-3\\/4 {\n width: calc(3/4 * 100%);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-7 {\n width: calc(var(--spacing) * 7);\n }\n .w-8 {\n width: calc(var(--spacing) * 8);\n }\n .w-9 {\n width: calc(var(--spacing) * 9);\n }\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-14 {\n width: calc(var(--spacing) * 14);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-32 {\n width: calc(var(--spacing) * 32);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n .w-\\[100px\\] {\n width: 100px;\n }\n .w-\\[200px\\] {\n width: 200px;\n }\n .w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\] {\n width: var(--radix-dropdown-menu-trigger-width);\n }\n .w-auto {\n width: auto;\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-max {\n width: max-content;\n }\n .w-px {\n width: 1px;\n }\n .max-w-\\(--skeleton-width\\) {\n max-width: var(--skeleton-width);\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .max-w-4xl {\n max-width: var(--container-4xl);\n }\n .max-w-6xl {\n max-width: var(--container-6xl);\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem);\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-max {\n max-width: max-content;\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\n }\n .max-w-sm {\n max-width: var(--container-sm);\n }\n .min-w-\\(--cell-size\\) {\n min-width: var(--cell-size);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-5 {\n min-width: calc(var(--spacing) * 5);\n }\n .min-w-8 {\n min-width: calc(var(--spacing) * 8);\n }\n .min-w-9 {\n min-width: calc(var(--spacing) * 9);\n }\n .min-w-10 {\n min-width: calc(var(--spacing) * 10);\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .min-w-\\[12rem\\] {\n min-width: 12rem;\n }\n .min-w-\\[200px\\] {\n min-width: 200px;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n }\n .min-w-fit {\n min-width: fit-content;\n }\n .min-w-full {\n min-width: 100%;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-shrink {\n flex-shrink: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .grow {\n flex-grow: 1;\n }\n .grow-0 {\n flex-grow: 0;\n }\n .basis-full {\n flex-basis: 100%;\n }\n .caption-bottom {\n caption-side: bottom;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .origin-\\(--radix-context-menu-content-transform-origin\\) {\n transform-origin: var(--radix-context-menu-content-transform-origin);\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n }\n .origin-\\(--radix-hover-card-content-transform-origin\\) {\n transform-origin: var(--radix-hover-card-content-transform-origin);\n }\n .origin-\\(--radix-menubar-content-transform-origin\\) {\n transform-origin: var(--radix-menubar-content-transform-origin);\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin);\n }\n .origin-\\(--radix-select-content-transform-origin\\) {\n transform-origin: var(--radix-select-content-transform-origin);\n }\n .origin-\\(--radix-tooltip-content-transform-origin\\) {\n transform-origin: var(--radix-tooltip-content-transform-origin);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-px {\n --tw-translate-x: -1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-px {\n --tw-translate-x: 1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0\\.5 {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[2px\\] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[calc\\(-50\\%_-_2px\\)\\] {\n --tw-translate-y: calc(-50% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .rotate-45 {\n rotate: 45deg;\n }\n .rotate-90 {\n rotate: 90deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-caret-blink {\n animation: caret-blink 1.25s ease-out infinite;\n }\n .animate-in {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n .animate-pulse {\n animation: var(--animate-pulse);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-move {\n cursor: move;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .cursor-text {\n cursor: text;\n }\n .touch-none {\n touch-action: none;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1);\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1);\n }\n .list-inside {\n list-style-position: inside;\n }\n .list-disc {\n list-style-type: disc;\n }\n .list-none {\n list-style-type: none;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .grid-cols-\\[0_1fr\\] {\n grid-template-columns: 0 1fr;\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-col-reverse {\n flex-direction: column-reverse;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-baseline {\n align-items: baseline;\n }\n .items-center {\n align-items: center;\n }\n .items-end {\n align-items: flex-end;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .justify-items-start {\n justify-items: start;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-2\\.5 {\n gap: calc(var(--spacing) * 2.5);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-7 {\n gap: calc(var(--spacing) * 7);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .space-y-0 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-0\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-x-4 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .gap-y-0\\.5 {\n row-gap: calc(var(--spacing) * 0.5);\n }\n .self-start {\n align-self: flex-start;\n }\n .self-stretch {\n align-self: stretch;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-\\[2px\\] {\n border-radius: 2px;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px;\n }\n .rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n border-radius: calc(var(--radius) - 5px);\n }\n .rounded-\\[inherit\\] {\n border-radius: inherit;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .rounded-xs {\n border-radius: var(--radius-xs);\n }\n .rounded-l-md {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n .rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n }\n .rounded-r-md {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-\\[1\\.5px\\] {\n border-style: var(--tw-border-style);\n border-width: 1.5px;\n }\n .border-y {\n border-block-style: var(--tw-border-style);\n border-block-width: 1px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n .border-l-2 {\n border-left-style: var(--tw-border-style);\n border-left-width: 2px;\n }\n .border-l-4 {\n border-left-style: var(--tw-border-style);\n border-left-width: 4px;\n }\n .border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .border-\\(--color-border\\) {\n border-color: var(--color-border);\n }\n .border-background {\n border-color: var(--background);\n }\n .border-blue-200 {\n border-color: var(--color-blue-200);\n }\n .border-blue-500 {\n border-color: var(--color-blue-500);\n }\n .border-border {\n border-color: var(--border);\n }\n .border-border\\/40 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 40%, transparent);\n }\n }\n .border-border\\/50 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n .border-border\\/60 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 60%, transparent);\n }\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-destructive\\/20 {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-green-200 {\n border-color: var(--color-green-200);\n }\n .border-input {\n border-color: var(--input);\n }\n .border-muted-foreground\\/50 {\n border-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted-foreground) 50%, transparent);\n }\n }\n .border-neutral-200 {\n border-color: var(--color-neutral-200);\n }\n .border-orange-200 {\n border-color: var(--color-orange-200);\n }\n .border-primary {\n border-color: var(--primary);\n }\n .border-primary\\/20 {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .border-purple-200 {\n border-color: var(--color-purple-200);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .border-sidebar-border {\n border-color: var(--sidebar-border);\n }\n .border-transparent {\n border-color: transparent;\n }\n .border-white {\n border-color: var(--color-white);\n }\n .border-yellow-400 {\n border-color: var(--color-yellow-400);\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .border-l-transparent {\n border-left-color: transparent;\n }\n .bg-\\(--color-bg\\) {\n background-color: var(--color-bg);\n }\n .bg-accent {\n background-color: var(--accent);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-background\\/50 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 50%, transparent);\n }\n }\n .bg-background\\/60 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n .bg-background\\/80 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 80%, transparent);\n }\n }\n .bg-background\\/90 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 90%, transparent);\n }\n }\n .bg-background\\/95 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 95%, transparent);\n }\n }\n .bg-black {\n background-color: var(--color-black);\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent);\n }\n }\n .bg-blue-50 {\n background-color: var(--color-blue-50);\n }\n .bg-blue-100 {\n background-color: var(--color-blue-100);\n }\n .bg-blue-500 {\n background-color: var(--color-blue-500);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-card\\/50 {\n background-color: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--card) 50%, transparent);\n }\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-destructive\\/10 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n .bg-destructive\\/15 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 15%, transparent);\n }\n }\n .bg-foreground {\n background-color: var(--foreground);\n }\n .bg-foreground\\/25 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 25%, transparent);\n }\n }\n .bg-foreground\\/50 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .bg-foreground\\/60 {\n background-color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--foreground) 60%, transparent);\n }\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-100 {\n background-color: var(--color-gray-100);\n }\n .bg-gray-500 {\n background-color: var(--color-gray-500);\n }\n .bg-green-50 {\n background-color: var(--color-green-50);\n }\n .bg-green-100 {\n background-color: var(--color-green-100);\n }\n .bg-green-500 {\n background-color: var(--color-green-500);\n }\n .bg-input {\n background-color: var(--input);\n }\n .bg-muted {\n background-color: var(--muted);\n }\n .bg-muted\\/30 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n .bg-muted\\/50 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n .bg-neutral-100 {\n background-color: var(--color-neutral-100);\n }\n .bg-neutral-400 {\n background-color: var(--color-neutral-400);\n }\n .bg-orange-50 {\n background-color: var(--color-orange-50);\n }\n .bg-orange-500 {\n background-color: var(--color-orange-500);\n }\n .bg-pink-100 {\n background-color: var(--color-pink-100);\n }\n .bg-pink-500 {\n background-color: var(--color-pink-500);\n }\n .bg-popover {\n background-color: var(--popover);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-primary\\/5 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n .bg-primary\\/10 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n .bg-primary\\/20 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .bg-primary\\/40 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 40%, transparent);\n }\n }\n .bg-primary\\/60 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 60%, transparent);\n }\n }\n .bg-primary\\/70 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .bg-purple-50 {\n background-color: var(--color-purple-50);\n }\n .bg-purple-100 {\n background-color: var(--color-purple-100);\n }\n .bg-purple-500 {\n background-color: var(--color-purple-500);\n }\n .bg-red-100 {\n background-color: var(--color-red-100);\n }\n .bg-red-500 {\n background-color: var(--color-red-500);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-sidebar {\n background-color: var(--sidebar);\n }\n .bg-sidebar-border {\n background-color: var(--sidebar-border);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .bg-yellow-50 {\n background-color: var(--color-yellow-50);\n }\n .bg-gradient-to-br {\n --tw-gradient-position: to bottom right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-gradient-to-r {\n --tw-gradient-position: to right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-\\[url\\(\\'https\\:\\/\\/www\\.transparenttextures\\.com\\/patterns\\/rice-paper\\.png\\'\\)\\] {\n background-image: url('https://www.transparenttextures.com/patterns/rice-paper.png');\n }\n .from-blue-500 {\n --tw-gradient-from: var(--color-blue-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-blue-600 {\n --tw-gradient-from: var(--color-blue-600);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-card {\n --tw-gradient-from: var(--card);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-pink-500 {\n --tw-gradient-from: var(--color-pink-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/5 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/50 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .via-background {\n --tw-gradient-via: var(--background);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-primary {\n --tw-gradient-via: var(--primary);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-purple-500 {\n --tw-gradient-via: var(--color-purple-500);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .to-blue-400 {\n --tw-gradient-to: var(--color-blue-400);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-blue-500 {\n --tw-gradient-to: var(--color-blue-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-card\\/50 {\n --tw-gradient-to: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--card) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-400 {\n --tw-gradient-to: var(--color-pink-400);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-500 {\n --tw-gradient-to: var(--color-pink-500);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-pink-600 {\n --tw-gradient-to: var(--color-pink-600);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-primary\\/50 {\n --tw-gradient-to: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-secondary\\/5 {\n --tw-gradient-to: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--secondary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .bg-repeat {\n background-repeat: repeat;\n }\n .fill-current {\n fill: currentcolor;\n }\n .fill-foreground {\n fill: var(--foreground);\n }\n .fill-primary {\n fill: var(--primary);\n }\n .object-contain {\n object-fit: contain;\n }\n .object-cover {\n object-fit: cover;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0);\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-2\\.5 {\n padding: calc(var(--spacing) * 2.5);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-12 {\n padding: calc(var(--spacing) * 12);\n }\n .p-\\[3px\\] {\n padding: 3px;\n }\n .p-px {\n padding: 1px;\n }\n .px-\\(--cell-size\\) {\n padding-inline: var(--cell-size);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-0\\.5 {\n padding-block: calc(var(--spacing) * 0.5);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .py-8 {\n padding-block: calc(var(--spacing) * 8);\n }\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n .py-12 {\n padding-block: calc(var(--spacing) * 12);\n }\n .pt-0 {\n padding-top: calc(var(--spacing) * 0);\n }\n .pt-3 {\n padding-top: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-20 {\n padding-top: calc(var(--spacing) * 20);\n }\n .pr-1 {\n padding-right: calc(var(--spacing) * 1);\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2);\n }\n .pr-2\\.5 {\n padding-right: calc(var(--spacing) * 2.5);\n }\n .pr-3 {\n padding-right: calc(var(--spacing) * 3);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pb-6 {\n padding-bottom: calc(var(--spacing) * 6);\n }\n .pb-8 {\n padding-bottom: calc(var(--spacing) * 8);\n }\n .pb-20 {\n padding-bottom: calc(var(--spacing) * 20);\n }\n .pl-1 {\n padding-left: calc(var(--spacing) * 1);\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .pl-4 {\n padding-left: calc(var(--spacing) * 4);\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8);\n }\n .pl-9 {\n padding-left: calc(var(--spacing) * 9);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .text-right {\n text-align: right;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-mono {\n font-family: \"Geist Mono\", monospace;\n }\n .font-sans {\n font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n }\n .font-serif {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-5xl {\n font-size: var(--text-5xl);\n line-height: var(--tw-leading, var(--text-5xl--line-height));\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-sm\\/relaxed {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n }\n .text-\\[9px\\] {\n font-size: 9px;\n }\n .text-\\[10px\\] {\n font-size: 10px;\n }\n .text-\\[11px\\] {\n font-size: 11px;\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .leading-normal {\n --tw-leading: var(--leading-normal);\n line-height: var(--leading-normal);\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .leading-snug {\n --tw-leading: var(--leading-snug);\n line-height: var(--leading-snug);\n }\n .leading-tight {\n --tw-leading: var(--leading-tight);\n line-height: var(--leading-tight);\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-normal {\n --tw-font-weight: var(--font-weight-normal);\n font-weight: var(--font-weight-normal);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n .tracking-wide {\n --tw-tracking: var(--tracking-wide);\n letter-spacing: var(--tracking-wide);\n }\n .tracking-wider {\n --tw-tracking: var(--tracking-wider);\n letter-spacing: var(--tracking-wider);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .text-balance {\n text-wrap: balance;\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .break-all {\n word-break: break-all;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre-line {\n white-space: pre-line;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-accent-foreground {\n color: var(--accent-foreground);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-background {\n color: var(--background);\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-blue-600 {\n color: var(--color-blue-600);\n }\n .text-blue-700 {\n color: var(--color-blue-700);\n }\n .text-blue-800 {\n color: var(--color-blue-800);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-current {\n color: currentcolor;\n }\n .text-destructive {\n color: var(--destructive);\n }\n .text-destructive-foreground {\n color: var(--destructive-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-foreground\\/50 {\n color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-green-700 {\n color: var(--color-green-700);\n }\n .text-green-800 {\n color: var(--color-green-800);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-muted-foreground\\/60 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);\n }\n }\n .text-muted-foreground\\/70 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 70%, transparent);\n }\n }\n .text-muted-foreground\\/80 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 80%, transparent);\n }\n }\n .text-neutral-500 {\n color: var(--color-neutral-500);\n }\n .text-neutral-600 {\n color: var(--color-neutral-600);\n }\n .text-orange-700 {\n color: var(--color-orange-700);\n }\n .text-pink-400 {\n color: var(--color-pink-400);\n }\n .text-pink-600 {\n color: var(--color-pink-600);\n }\n .text-pink-700 {\n color: var(--color-pink-700);\n }\n .text-popover-foreground {\n color: var(--popover-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-primary\\/70 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .text-primary\\/80 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 80%, transparent);\n }\n }\n .text-purple-700 {\n color: var(--color-purple-700);\n }\n .text-red-400 {\n color: var(--color-red-400);\n }\n .text-red-600 {\n color: var(--color-red-600);\n }\n .text-red-700 {\n color: var(--color-red-700);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-sidebar-foreground {\n color: var(--sidebar-foreground);\n }\n .text-sidebar-foreground\\/70 {\n color: var(--sidebar-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--sidebar-foreground) 70%, transparent);\n }\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-800 {\n color: var(--color-yellow-800);\n }\n .uppercase {\n text-transform: uppercase;\n }\n .italic {\n font-style: italic;\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .underline {\n text-decoration-line: underline;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-50 {\n opacity: 50%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-90 {\n opacity: 90%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-border\\)\\)\\] {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-border)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-none {\n --tw-shadow: 0 0 #0000;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-0 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-2 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-4 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-background {\n --tw-ring-color: var(--background);\n }\n .ring-blue-200 {\n --tw-ring-color: var(--color-blue-200);\n }\n .ring-ring\\/50 {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n .ring-sidebar-ring {\n --tw-ring-color: var(--sidebar-ring);\n }\n .ring-yellow-200 {\n --tw-ring-color: var(--color-yellow-200);\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--background);\n }\n .outline-hidden {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .backdrop-blur {\n --tw-backdrop-blur: blur(8px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[left\\,right\\,width\\] {\n transition-property: left,right,width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[margin\\,opacity\\] {\n transition-property: margin,opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\,height\\,padding\\] {\n transition-property: width,height,padding;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\] {\n transition-property: width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-none {\n transition-property: none;\n }\n .duration-100 {\n --tw-duration: 100ms;\n transition-duration: 100ms;\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-500 {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n .duration-1000 {\n --tw-duration: 1000ms;\n transition-duration: 1000ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .ease-linear {\n --tw-ease: linear;\n transition-timing-function: linear;\n }\n .ease-out {\n --tw-ease: var(--ease-out);\n transition-timing-function: var(--ease-out);\n }\n .fade-in-0 {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .slide-in-from-bottom-5 {\n --tw-enter-translate-y: calc(5*var(--spacing));\n --tw-enter-translate-y: calc(.05*100%);\n }\n .zoom-in-95 {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n .\\[--cell-size\\:--spacing\\(8\\)\\] {\n --cell-size: calc(var(--spacing) * 8);\n }\n .slide-in-from-top-2 {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n .group-last\\:hidden {\n &:is(:where(.group):last-child *) {\n display: none;\n }\n }\n .group-focus-within\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):focus-within *) {\n opacity: 100%;\n }\n }\n .group-hover\\:scale-110 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:bg-primary\\/20 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n }\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-hover\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8 {\n &:is(:where(.group\\/menu-item):has(*[data-sidebar=\"menu-action\"]) *) {\n padding-right: calc(var(--spacing) * 8);\n }\n }\n .group-has-\\[\\[data-orientation\\=horizontal\\]\\]\\/field\\:text-balance {\n &:is(:where(.group\\/field):has(*:is([data-orientation=horizontal])) *) {\n text-wrap: balance;\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:translate-y-0\\.5 {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:self-start {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n align-self: flex-start;\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pt-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-top: calc(var(--spacing) * 2.5);\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pb-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-bottom: calc(var(--spacing) * 2.5);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:-mt-8 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n margin-top: calc(var(--spacing) * -8);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n display: none;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:size-8\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--spacing) * 8) !important;\n height: calc(var(--spacing) * 8) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\) {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: var(--sidebar-width-icon);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)));\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:overflow-hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-0\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 0) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-2\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 2) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:opacity-0 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n opacity: 0%;\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n right: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n left: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:w-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n width: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/field\\:opacity-50 {\n &:is(:where(.group\\/field)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50 {\n &:is(:where(.group\\/input-group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:relative {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n position: relative;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:z-10 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n z-index: 10;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:border-ring {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n border-color: var(--ring);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-\\[3px\\] {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-ring\\/50 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .group-data-\\[side\\=left\\]\\:-right-4 {\n &:is(:where(.group)[data-side=\"left\"] *) {\n right: calc(var(--spacing) * -4);\n }\n }\n .group-data-\\[side\\=left\\]\\:border-r {\n &:is(:where(.group)[data-side=\"left\"] *) {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .group-data-\\[side\\=right\\]\\:left-0 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n left: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[side\\=right\\]\\:rotate-180 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[side\\=right\\]\\:border-l {\n &:is(:where(.group)[data-side=\"right\"] *) {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .group-data-\\[state\\=open\\]\\:rotate-180 {\n &:is(:where(.group)[data-state=\"open\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:rounded-lg {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-radius: var(--radius);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border-sidebar-border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-color: var(--sidebar-border);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:shadow-sm {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[variant\\=outline\\]\\/field-group\\:-mb-2 {\n &:is(:where(.group\\/field-group)[data-variant=\"outline\"] *) {\n margin-bottom: calc(var(--spacing) * -2);\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n display: block;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"top\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:top-full {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n top: 100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:mt-1\\.5 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n margin-top: calc(var(--spacing) * 1.5);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:overflow-hidden {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:rounded-md {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:border {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:bg-popover {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n background-color: var(--popover);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:text-popover-foreground {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n color: var(--popover-foreground);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:shadow {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:duration-200 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n }\n .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n &:is(:where(.group):is(.destructive) *) {\n border-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted) 40%, transparent);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:text-red-300 {\n &:is(:where(.group):is(.destructive) *) {\n color: var(--color-red-300);\n }\n }\n .peer-hover\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button):hover ~ *) {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50%;\n }\n }\n .peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button)[data-active=\"true\"] ~ *) {\n color: var(--sidebar-accent-foreground);\n }\n }\n .peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"default\"] ~ *) {\n top: calc(var(--spacing) * 1.5);\n }\n }\n .peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"lg\"] ~ *) {\n top: calc(var(--spacing) * 2.5);\n }\n }\n .peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1 {\n &:is(:where(.peer\\/menu-button)[data-size=\"sm\"] ~ *) {\n top: calc(var(--spacing) * 1);\n }\n }\n .selection\\:bg-primary {\n & *::selection {\n background-color: var(--primary);\n }\n &::selection {\n background-color: var(--primary);\n }\n }\n .selection\\:text-primary-foreground {\n & *::selection {\n color: var(--primary-foreground);\n }\n &::selection {\n color: var(--primary-foreground);\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7);\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--foreground);\n }\n }\n .placeholder\\:text-muted-foreground {\n &::placeholder {\n color: var(--muted-foreground);\n }\n }\n .after\\:absolute {\n &::after {\n content: var(--tw-content);\n position: absolute;\n }\n }\n .after\\:-inset-2 {\n &::after {\n content: var(--tw-content);\n inset: calc(var(--spacing) * -2);\n }\n }\n .after\\:inset-y-0 {\n &::after {\n content: var(--tw-content);\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .after\\:left-1\\/2 {\n &::after {\n content: var(--tw-content);\n left: calc(1/2 * 100%);\n }\n }\n .after\\:w-1 {\n &::after {\n content: var(--tw-content);\n width: calc(var(--spacing) * 1);\n }\n }\n .after\\:w-\\[2px\\] {\n &::after {\n content: var(--tw-content);\n width: 2px;\n }\n }\n .after\\:-translate-x-1\\/2 {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:after\\:left-full {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n &::after {\n content: var(--tw-content);\n left: 100%;\n }\n }\n }\n .first\\:rounded-l-md {\n &:first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .first\\:border-l {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .last\\:mt-0 {\n &:last-child {\n margin-top: calc(var(--spacing) * 0);\n }\n }\n .last\\:rounded-r-md {\n &:last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .last\\:border-0 {\n &:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .last\\:border-b-0 {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n .hover\\:scale-105 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:border-blue-400 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-blue-400);\n }\n }\n }\n .hover\\:border-primary {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n }\n }\n }\n .hover\\:border-primary\\/30 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-accent\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 5%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-background {\n &:hover {\n @media (hover: hover) {\n background-color: var(--background);\n }\n }\n }\n .hover\\:bg-card {\n &:hover {\n @media (hover: hover) {\n background-color: var(--card);\n }\n }\n }\n .hover\\:bg-destructive {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n }\n }\n }\n .hover\\:bg-muted\\/30 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-sidebar-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:text-destructive {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive);\n }\n }\n }\n .hover\\:text-destructive-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n .hover\\:text-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--foreground);\n }\n }\n }\n .hover\\:text-muted-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--muted-foreground);\n }\n }\n }\n .hover\\:text-primary {\n &:hover {\n @media (hover: hover) {\n color: var(--primary);\n }\n }\n }\n .hover\\:text-sidebar-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .hover\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .hover\\:shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-accent\\)\\)\\] {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-accent)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-lg {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-md {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:ring-4 {\n &:hover {\n @media (hover: hover) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar {\n &:hover {\n @media (hover: hover) {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n background-color: var(--sidebar);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 30%, transparent);\n }\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:bg-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-red-50 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-red-50);\n }\n }\n }\n }\n .hover\\:after\\:bg-sidebar-border {\n &:hover {\n @media (hover: hover) {\n &::after {\n content: var(--tw-content);\n background-color: var(--sidebar-border);\n }\n }\n }\n }\n .focus\\:z-10 {\n &:focus {\n z-index: 10;\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--accent);\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n .focus\\:opacity-100 {\n &:focus {\n opacity: 100%;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--ring);\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--destructive);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-red-400 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--color-red-400);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-offset-color: var(--color-red-600);\n }\n }\n }\n .focus-visible\\:z-10 {\n &:focus-visible {\n z-index: 10;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-0 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-1 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-2 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-4 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-primary {\n &:focus-visible {\n --tw-ring-color: var(--primary);\n }\n }\n .focus-visible\\:ring-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .focus-visible\\:ring-offset-1 {\n &:focus-visible {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus-visible\\:outline-hidden {\n &:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus-visible\\:outline-1 {\n &:focus-visible {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n }\n .focus-visible\\:outline-ring {\n &:focus-visible {\n outline-color: var(--ring);\n }\n }\n .active\\:bg-sidebar-accent {\n &:active {\n background-color: var(--sidebar-accent);\n }\n }\n .active\\:text-sidebar-accent-foreground {\n &:active {\n color: var(--sidebar-accent-foreground);\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .in-data-\\[side\\=left\\]\\:cursor-w-resize {\n :where(*[data-side=\"left\"]) & {\n cursor: w-resize;\n }\n }\n .in-data-\\[side\\=right\\]\\:cursor-e-resize {\n :where(*[data-side=\"right\"]) & {\n cursor: e-resize;\n }\n }\n .has-focus\\:border-ring {\n &:has(*:focus) {\n border-color: var(--ring);\n }\n }\n .has-focus\\:ring-\\[3px\\] {\n &:has(*:focus) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-focus\\:ring-ring\\/50 {\n &:has(*:focus) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-disabled\\:opacity-50 {\n &:has(*:disabled) {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-data-\\[state\\=checked\\]\\:border-primary {\n &:has(*[data-state=\"checked\"]) {\n border-color: var(--primary);\n }\n }\n .has-data-\\[state\\=checked\\]\\:bg-primary\\/5 {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n }\n .has-data-\\[variant\\=inset\\]\\:bg-sidebar {\n &:has(*[data-variant=\"inset\"]) {\n background-color: var(--sidebar);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n border-color: var(--ring);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-\\[3px\\] {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50 {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive {\n &:has(*:is([data-slot][aria-invalid=true])) {\n border-color: var(--destructive);\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20 {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto {\n &:has(>[data-align=block-end]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col {\n &:has(>[data-align=block-end]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto {\n &:has(>[data-align=block-start]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col {\n &:has(>[data-align=block-start]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2 {\n &:has(>[data-slot=button-group]) {\n gap: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>\\[data-slot\\=checkbox-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=checkbox-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:w-full {\n &:has(>[data-slot=field]) {\n width: 100%;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:flex-col {\n &:has(>[data-slot=field]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:rounded-md {\n &:has(>[data-slot=field]) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:border {\n &:has(>[data-slot=field]) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .has-\\[\\>\\[data-slot\\=radio-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=radio-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>button\\]\\:mr-\\[-0\\.4rem\\] {\n &:has(>button) {\n margin-right: -0.4rem;\n }\n }\n .has-\\[\\>button\\]\\:ml-\\[-0\\.45rem\\] {\n &:has(>button) {\n margin-left: -0.45rem;\n }\n }\n .has-\\[\\>kbd\\]\\:mr-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-right: -0.35rem;\n }\n }\n .has-\\[\\>kbd\\]\\:ml-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-left: -0.35rem;\n }\n }\n .has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\] {\n &:has(>svg) {\n grid-template-columns: calc(var(--spacing) * 4) 1fr;\n }\n }\n .has-\\[\\>svg\\]\\:gap-x-3 {\n &:has(>svg) {\n column-gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:p-0 {\n &:has(>svg) {\n padding: calc(var(--spacing) * 0);\n }\n }\n .has-\\[\\>svg\\]\\:px-2 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .has-\\[\\>textarea\\]\\:h-auto {\n &:has(>textarea) {\n height: auto;\n }\n }\n .aria-disabled\\:pointer-events-none {\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .aria-disabled\\:opacity-50 {\n &[aria-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .aria-selected\\:text-muted-foreground {\n &[aria-selected=\"true\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:z-10 {\n &[data-active=\"true\"] {\n z-index: 10;\n }\n }\n .data-\\[active\\=true\\]\\:border-ring {\n &[data-active=\"true\"] {\n border-color: var(--ring);\n }\n }\n .data-\\[active\\=true\\]\\:bg-accent\\/50 {\n &[data-active=\"true\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:bg-sidebar-accent {\n &[data-active=\"true\"] {\n background-color: var(--sidebar-accent);\n }\n }\n .data-\\[active\\=true\\]\\:font-medium {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .data-\\[active\\=true\\]\\:font-semibold {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n }\n .data-\\[active\\=true\\]\\:text-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-foreground {\n &[data-active=\"true\"] {\n color: var(--foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-sidebar-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--sidebar-accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:ring-\\[3px\\] {\n &[data-active=\"true\"] {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[active\\=true\\]\\:ring-ring\\/50 {\n &[data-active=\"true\"] {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:hover\\:bg-accent {\n &[data-active=\"true\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[active\\=true\\]\\:focus\\:bg-accent {\n &[data-active=\"true\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:border-destructive {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/20 {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50%;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive {\n &[data-error=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8);\n }\n }\n .data-\\[invalid\\=true\\]\\:text-destructive {\n &[data-invalid=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[motion\\=from-end\\]\\:slide-in-from-right-52 {\n &[data-motion=\"from-end\"] {\n --tw-enter-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=from-start\\]\\:slide-in-from-left-52 {\n &[data-motion=\"from-start\"] {\n --tw-enter-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\=to-end\\]\\:slide-out-to-right-52 {\n &[data-motion=\"to-end\"] {\n --tw-exit-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=to-start\\]\\:slide-out-to-left-52 {\n &[data-motion=\"to-start\"] {\n --tw-exit-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:animate-in {\n &[data-motion^=\"from-\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:fade-in {\n &[data-motion^=\"from-\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:animate-out {\n &[data-motion^=\"to-\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:fade-out {\n &[data-motion^=\"to-\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-1\\.5 {\n &[data-orientation=\"horizontal\"] {\n height: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-full {\n &[data-orientation=\"horizontal\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-px {\n &[data-orientation=\"horizontal\"] {\n height: 1px;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:w-full {\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-auto {\n &[data-orientation=\"vertical\"] {\n height: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-full {\n &[data-orientation=\"vertical\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:min-h-44 {\n &[data-orientation=\"vertical\"] {\n min-height: calc(var(--spacing) * 44);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-1\\.5 {\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-auto {\n &[data-orientation=\"vertical\"] {\n width: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-full {\n &[data-orientation=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-px {\n &[data-orientation=\"vertical\"] {\n width: 1px;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:flex-col {\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:h-px {\n &[data-panel-group-direction=\"vertical\"] {\n height: 1px;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:flex-col {\n &[data-panel-group-direction=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:left-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n left: calc(var(--spacing) * 0);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:h-1 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n height: calc(var(--spacing) * 1);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n width: 100%;\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:translate-x-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:-translate-y-1\\/2 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-md {\n &[data-range-end=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-r-md {\n &[data-range-end=\"true\"] {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:bg-primary {\n &[data-range-end=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-end\\=true\\]\\:text-primary-foreground {\n &[data-range-end=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[range-middle\\=true\\]\\:rounded-none {\n &[data-range-middle=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[range-middle\\=true\\]\\:bg-accent {\n &[data-range-middle=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[range-middle\\=true\\]\\:text-accent-foreground {\n &[data-range-middle=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-md {\n &[data-range-start=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-l-md {\n &[data-range-start=\"true\"] {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:bg-primary {\n &[data-range-start=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-start\\=true\\]\\:text-primary-foreground {\n &[data-range-start=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected-single\\=true\\]\\:bg-primary {\n &[data-selected-single=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[selected-single\\=true\\]\\:text-primary-foreground {\n &[data-selected-single=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected\\=true\\]\\:rounded-none {\n &[data-selected=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: calc(2*var(--spacing));\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: calc(2*var(--spacing));\n }\n }\n .data-\\[size\\=default\\]\\:h-9 {\n &[data-size=\"default\"] {\n height: calc(var(--spacing) * 9);\n }\n }\n .data-\\[size\\=sm\\]\\:h-8 {\n &[data-size=\"sm\"] {\n height: calc(var(--spacing) * 8);\n }\n }\n .\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90 {\n :is(& > *) {\n &[data-slot=\"alert-description\"] {\n color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .data-\\[slot\\=checkbox-group\\]\\:gap-3 {\n &[data-slot=\"checkbox-group\"] {\n gap: calc(var(--spacing) * 3);\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12);\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:ring-0 {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:outline-none {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n .data-\\[state\\=active\\]\\:bg-background {\n &[data-state=\"active\"] {\n background-color: var(--background);\n }\n }\n .data-\\[state\\=active\\]\\:shadow-sm {\n &[data-state=\"active\"] {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[state\\=checked\\]\\:translate-x-\\[calc\\(100\\%-2px\\)\\] {\n &[data-state=\"checked\"] {\n --tw-translate-x: calc(100% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[state\\=closed\\]\\:animate-accordion-up {\n &[data-state=\"closed\"] {\n animation: accordion-up 0.2s ease-out;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=closed\\]\\:duration-300 {\n &[data-state=\"closed\"] {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-80 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(80/100);\n --tw-exit-opacity: .8;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-bottom {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-left {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: -100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right-full {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: calc(1*100%);\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-top {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: -100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:animate-out {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:fade-out-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:zoom-out-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n }\n .data-\\[state\\=hidden\\]\\:animate-out {\n &[data-state=\"hidden\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=hidden\\]\\:fade-out {\n &[data-state=\"hidden\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=on\\]\\:bg-accent {\n &[data-state=\"on\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=on\\]\\:text-accent-foreground {\n &[data-state=\"on\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:animate-accordion-down {\n &[data-state=\"open\"] {\n animation: accordion-down 0.2s ease-out;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent\\/50 {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[state\\=open\\]\\:bg-secondary {\n &[data-state=\"open\"] {\n background-color: var(--secondary);\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:opacity-100 {\n &[data-state=\"open\"] {\n opacity: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:duration-500 {\n &[data-state=\"open\"] {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-90 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(90*1%);\n --tw-enter-scale: .9;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-bottom {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-left {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-right {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top-full {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: calc(1*-100%);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:animate-in {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:fade-in-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:zoom-in-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:focus\\:bg-accent {\n &[data-state=\"open\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[state\\=selected\\]\\:bg-muted {\n &[data-state=\"selected\"] {\n background-color: var(--muted);\n }\n }\n .data-\\[state\\=unchecked\\]\\:translate-x-0 {\n &[data-state=\"unchecked\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=unchecked\\]\\:bg-input {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n }\n }\n .data-\\[state\\=visible\\]\\:animate-in {\n &[data-state=\"visible\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=visible\\]\\:fade-in {\n &[data-state=\"visible\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[swipe\\=cancel\\]\\:translate-x-0 {\n &[data-swipe=\"cancel\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\] {\n &[data-swipe=\"end\"] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:animate-out {\n &[data-swipe=\"end\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\] {\n &[data-swipe=\"move\"] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=move\\]\\:transition-none {\n &[data-swipe=\"move\"] {\n transition-property: none;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--destructive);\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--destructive);\n }\n }\n }\n .data-\\[variant\\=label\\]\\:text-sm {\n &[data-variant=\"label\"] {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .data-\\[variant\\=legend\\]\\:text-base {\n &[data-variant=\"legend\"] {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n }\n .data-\\[variant\\=outline\\]\\:border-l-0 {\n &[data-variant=\"outline\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .data-\\[variant\\=outline\\]\\:shadow-xs {\n &[data-variant=\"outline\"] {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[variant\\=outline\\]\\:first\\:border-l {\n &[data-variant=\"outline\"] {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n margin-top: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"bottom\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-lg {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-left-radius: var(--radius);\n border-top-right-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:left-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n left: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"left\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:border-r {\n &[data-vaul-drawer-direction=\"left\"] {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:right-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n right: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"right\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:border-l {\n &[data-vaul-drawer-direction=\"right\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:top-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n top: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:mb-24 {\n &[data-vaul-drawer-direction=\"top\"] {\n margin-bottom: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"top\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-lg {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-right-radius: var(--radius);\n border-bottom-left-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:border-b {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .nth-last-2\\:-mt-1 {\n &:nth-last-child(2) {\n margin-top: calc(var(--spacing) * -1);\n }\n }\n .supports-\\[backdrop-filter\\]\\:bg-background\\/60 {\n @supports (backdrop-filter: var(--tw)) {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n }\n .sm\\:top-auto {\n @media (width >= 40rem) {\n top: auto;\n }\n }\n .sm\\:right-0 {\n @media (width >= 40rem) {\n right: calc(var(--spacing) * 0);\n }\n }\n .sm\\:bottom-0 {\n @media (width >= 40rem) {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .sm\\:col-span-2 {\n @media (width >= 40rem) {\n grid-column: span 2 / span 2;\n }\n }\n .sm\\:block {\n @media (width >= 40rem) {\n display: block;\n }\n }\n .sm\\:flex {\n @media (width >= 40rem) {\n display: flex;\n }\n }\n .sm\\:max-w-\\[600px\\] {\n @media (width >= 40rem) {\n max-width: 600px;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg);\n }\n }\n .sm\\:max-w-sm {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n .sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .sm\\:flex-col {\n @media (width >= 40rem) {\n flex-direction: column;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end;\n }\n }\n .sm\\:gap-2\\.5 {\n @media (width >= 40rem) {\n gap: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pr-2\\.5 {\n @media (width >= 40rem) {\n padding-right: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pl-2\\.5 {\n @media (width >= 40rem) {\n padding-left: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left;\n }\n }\n .data-\\[state\\=open\\]\\:sm\\:slide-in-from-bottom-full {\n &[data-state=\"open\"] {\n @media (width >= 40rem) {\n --tw-enter-translate-y: calc(1*100%);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"left\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"right\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .md\\:absolute {\n @media (width >= 48rem) {\n position: absolute;\n }\n }\n .md\\:-left-24 {\n @media (width >= 48rem) {\n left: calc(var(--spacing) * -24);\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2;\n }\n }\n .md\\:ml-12 {\n @media (width >= 48rem) {\n margin-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .md\\:w-20 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 20);\n }\n }\n .md\\:w-80 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 80);\n }\n }\n .md\\:w-\\[var\\(--radix-navigation-menu-viewport-width\\)\\] {\n @media (width >= 48rem) {\n width: var(--radix-navigation-menu-viewport-width);\n }\n }\n .md\\:w-auto {\n @media (width >= 48rem) {\n width: auto;\n }\n }\n .md\\:max-w-\\[420px\\] {\n @media (width >= 48rem) {\n max-width: 420px;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .md\\:grid-cols-3 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .md\\:flex-row {\n @media (width >= 48rem) {\n flex-direction: row;\n }\n }\n .md\\:items-center {\n @media (width >= 48rem) {\n align-items: center;\n }\n }\n .md\\:gap-1\\.5 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 1.5);\n }\n }\n .md\\:p-12 {\n @media (width >= 48rem) {\n padding: calc(var(--spacing) * 12);\n }\n }\n .md\\:px-6 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 6);\n }\n }\n .md\\:pl-12 {\n @media (width >= 48rem) {\n padding-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:text-left {\n @media (width >= 48rem) {\n text-align: left;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .md\\:opacity-0 {\n @media (width >= 48rem) {\n opacity: 0%;\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:m-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin: calc(var(--spacing) * 2);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:ml-0 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin-left: calc(var(--spacing) * 0);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n border-radius: calc(var(--radius) + 4px);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ml-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n &:is(:where(.peer)[data-state=\"collapsed\"] ~ *) {\n margin-left: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .md\\:after\\:hidden {\n @media (width >= 48rem) {\n &::after {\n content: var(--tw-content);\n display: none;\n }\n }\n }\n .lg\\:col-span-2 {\n @media (width >= 64rem) {\n grid-column: span 2 / span 2;\n }\n }\n .lg\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-3 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-4 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .xl\\:grid-cols-4 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .\\@md\\/field-group\\:flex-row {\n @container field-group (width >= 28rem) {\n flex-direction: row;\n }\n }\n .\\@md\\/field-group\\:items-center {\n @container field-group (width >= 28rem) {\n align-items: center;\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n }\n .dark\\:border-blue-800 {\n &:is(.dark *) {\n border-color: var(--color-blue-800);\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:bg-blue-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-blue-950 {\n &:is(.dark *) {\n background-color: var(--color-blue-950);\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:bg-transparent {\n &:is(.dark *) {\n background-color: transparent;\n }\n }\n .dark\\:bg-yellow-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(42.1% 0.095 57.708) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-yellow-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-yellow-950 {\n &:is(.dark *) {\n background-color: var(--color-yellow-950);\n }\n }\n .dark\\:text-blue-200 {\n &:is(.dark *) {\n color: var(--color-blue-200);\n }\n }\n .dark\\:text-blue-400 {\n &:is(.dark *) {\n color: var(--color-blue-400);\n }\n }\n .dark\\:text-muted-foreground {\n &:is(.dark *) {\n color: var(--muted-foreground);\n }\n }\n .dark\\:text-pink-400 {\n &:is(.dark *) {\n color: var(--color-pink-400);\n }\n }\n .dark\\:text-yellow-200 {\n &:is(.dark *) {\n color: var(--color-yellow-200);\n }\n }\n .dark\\:ring-blue-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-blue-800);\n }\n }\n .dark\\:ring-yellow-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-yellow-800);\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-accent-foreground {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:has-data-\\[state\\=checked\\]\\:bg-primary\\/10 {\n &:is(.dark *) {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n }\n }\n .dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:border-input {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n border-color: var(--input);\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:bg-input\\/30 {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:text-foreground {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary-foreground {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary-foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-foreground {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-input\\/80 {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 80%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n &:is(.dark *) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n }\n .\\[\\&_\\.recharts-cartesian-axis-tick_text\\]\\:fill-muted-foreground {\n & .recharts-cartesian-axis-tick text {\n fill: var(--muted-foreground);\n }\n }\n .\\[\\&_\\.recharts-cartesian-grid_line\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border\\/50 {\n & .recharts-cartesian-grid line[stroke='#ccc'] {\n stroke: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n stroke: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n }\n .\\[\\&_\\.recharts-curve\\.recharts-tooltip-cursor\\]\\:stroke-border {\n & .recharts-curve.recharts-tooltip-cursor {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-dot\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-dot[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-layer\\]\\:outline-hidden {\n & .recharts-layer {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-polar-grid_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-polar-grid [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-radial-bar-background-sector\\]\\:fill-muted {\n & .recharts-radial-bar-background-sector {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-rectangle\\.recharts-tooltip-cursor\\]\\:fill-muted {\n & .recharts-rectangle.recharts-tooltip-cursor {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-reference-line_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-reference-line [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-sector\\]\\:outline-hidden {\n & .recharts-sector {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-sector\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-sector[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-surface\\]\\:outline-hidden {\n & .recharts-surface {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_img\\]\\:size-full {\n & img {\n width: 100%;\n height: 100%;\n }\n }\n .\\[\\&_img\\]\\:object-cover {\n & img {\n object-fit: cover;\n }\n }\n .\\[\\&_p\\]\\:leading-relaxed {\n & p {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-6 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_tr\\]\\:border-b {\n & tr {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .\\[\\&_tr\\:last-child\\]\\:border-0 {\n & tr:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\+\\[data-slot\\=item-content\\]\\]\\:flex-none {\n &+[data-slot=item-content] {\n flex: none;\n }\n }\n .\\[\\&\\:first-child\\[data-selected\\=true\\]_button\\]\\:rounded-l-md {\n &:first-child[data-selected=true] button {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-0 {\n &:has([role=checkbox]) {\n padding-right: calc(var(--spacing) * 0);\n }\n }\n .\\[\\.border-b\\]\\:pb-3 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-3 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_next\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_next>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_previous\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_previous>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\:last-child\\[data-selected\\=true\\]_button\\]\\:rounded-r-md {\n &:last-child[data-selected=true] button {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\>\\*\\]\\:w-full {\n &>* {\n width: 100%;\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:relative {\n &>* {\n &:focus-visible {\n position: relative;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:z-10 {\n &>* {\n &:focus-visible {\n z-index: 10;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:data-\\[slot\\=field\\]\\:p-4 {\n &>* {\n &[data-slot=\"field\"] {\n padding: calc(var(--spacing) * 4);\n }\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\*\\]\\:w-auto {\n @container field-group (width >= 28rem) {\n &>* {\n width: auto;\n }\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-l-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0 {\n &>*:not(:first-child) {\n border-top-style: var(--tw-border-style);\n border-top-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-l-0 {\n &>*:not(:first-child) {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-r-none {\n &>*:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none {\n &>*:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\.sr-only\\]\\:w-auto {\n &>.sr-only {\n width: auto;\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-group\\]\\]\\:gap-4 {\n &>[data-slot=field-group] {\n gap: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n @container field-group (width >= 28rem) {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n }\n .has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-r-md {\n &:has(*:is(select[aria-hidden=true]:last-child)) {\n &>[data-slot=select-trigger]:last-of-type {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n }\n .\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=\\'w-\\'\\]\\)\\]\\:w-fit {\n &>[data-slot=select-trigger]:not([class*='w-']) {\n width: fit-content;\n }\n }\n .\\[\\&\\>\\[role\\=checkbox\\]\\]\\:translate-y-\\[2px\\] {\n &>[role=checkbox] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n }\n .\\[\\&\\>a\\]\\:underline {\n &>a {\n text-decoration-line: underline;\n }\n }\n .\\[\\&\\>a\\]\\:underline-offset-4 {\n &>a {\n text-underline-offset: 4px;\n }\n }\n .\\[\\&\\>a\\:hover\\]\\:text-primary {\n &>a:hover {\n color: var(--primary);\n }\n }\n .\\[\\&\\>button\\]\\:hidden {\n &>button {\n display: none;\n }\n }\n .\\[\\&\\>input\\]\\:flex-1 {\n &>input {\n flex: 1;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3 {\n &:has(>[data-align=block-end]) {\n &>input {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3 {\n &:has(>[data-align=block-start]) {\n &>input {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pr-2 {\n &:has(>[data-align=inline-end]) {\n &>input {\n padding-right: calc(var(--spacing) * 2);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:pl-2 {\n &:has(>[data-align=inline-start]) {\n &>input {\n padding-left: calc(var(--spacing) * 2);\n }\n }\n }\n .\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n &>kbd {\n border-radius: calc(var(--radius) - 5px);\n }\n }\n .\\[\\&\\>span\\]\\:text-xs {\n &>span {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&\\>span\\]\\:opacity-70 {\n &>span {\n opacity: 70%;\n }\n }\n .\\[\\&\\>span\\:last-child\\]\\:truncate {\n &>span:last-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n .\\[\\&\\>svg\\]\\:pointer-events-none {\n &>svg {\n pointer-events: none;\n }\n }\n .\\[\\&\\>svg\\]\\:size-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:size-3\\.5 {\n &>svg {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\]\\:size-4 {\n &>svg {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>svg\\]\\:h-2\\.5 {\n &>svg {\n height: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:h-3 {\n &>svg {\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:w-2\\.5 {\n &>svg {\n width: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:w-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:shrink-0 {\n &>svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&\\>svg\\]\\:translate-y-0\\.5 {\n &>svg {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .\\[\\&\\>svg\\]\\:text-current {\n &>svg {\n color: currentcolor;\n }\n }\n .\\[\\&\\>svg\\]\\:text-muted-foreground {\n &>svg {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground {\n &>svg {\n color: var(--sidebar-accent-foreground);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>tr\\]\\:last\\:border-b-0 {\n &>tr {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n }\n .\\[\\&\\[data-panel-group-direction\\=vertical\\]\\>div\\]\\:rotate-90 {\n &[data-panel-group-direction=vertical]>div {\n rotate: 90deg;\n }\n }\n .\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180 {\n &[data-state=open]>svg {\n rotate: 180deg;\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-right-2 {\n [data-side=left][data-collapsible=offcanvas] & {\n right: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize {\n [data-side=left][data-state=collapsed] & {\n cursor: e-resize;\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-left-2 {\n [data-side=right][data-collapsible=offcanvas] & {\n left: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize {\n [data-side=right][data-state=collapsed] & {\n cursor: w-resize;\n }\n }\n .\\[\\[data-slot\\=card-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=card-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=popover-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=popover-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20 {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 20%, transparent);\n }\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background {\n [data-slot=tooltip-content] & {\n color: var(--background);\n }\n }\n .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10 {\n &:is(.dark *) {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 10%, transparent);\n }\n }\n }\n }\n .\\[\\[data-variant\\=legend\\]\\+\\&\\]\\:-mt-1\\.5 {\n [data-variant=legend]+& {\n margin-top: calc(var(--spacing) * -1.5);\n }\n }\n .\\[a\\&\\]\\:transition-colors {\n a& {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent\\/50 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-destructive\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-primary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-secondary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:text-accent-foreground {\n a& {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: forwards;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(0.97 0.01 90);\n --foreground: oklch(0.2 0.02 265);\n --card: oklch(0.98 0.005 90);\n --card-foreground: oklch(0.2 0.02 265);\n --popover: oklch(0.98 0.005 90);\n --popover-foreground: oklch(0.2 0.02 265);\n --primary: oklch(0.45 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.85 0.05 85);\n --secondary-foreground: oklch(0.3 0.05 50);\n --muted: oklch(0.92 0.01 90);\n --muted-foreground: oklch(0.45 0.02 265);\n --accent: oklch(0.94 0.02 85);\n --accent-foreground: oklch(0.3 0.05 50);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.88 0.01 90);\n --input: oklch(0.88 0.01 90);\n --ring: oklch(0.45 0.15 25);\n --radius: 0.5rem;\n --sidebar: oklch(0.96 0.01 90);\n --sidebar-foreground: oklch(0.25 0.02 265);\n --sidebar-primary: oklch(0.45 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.93 0.01 90);\n --sidebar-accent-foreground: oklch(0.25 0.02 265);\n --sidebar-border: oklch(0.88 0.01 90);\n --sidebar-ring: oklch(0.45 0.15 25);\n --chart-1: oklch(0.45 0.15 25);\n --chart-2: oklch(0.65 0.12 50);\n --chart-3: oklch(0.35 0.08 200);\n --chart-4: oklch(0.55 0.05 265);\n --chart-5: oklch(0.75 0.1 85);\n}\n.dark {\n --background: oklch(0.12 0.01 265);\n --foreground: oklch(0.95 0.01 90);\n --card: oklch(0.15 0.01 265);\n --card-foreground: oklch(0.95 0.01 90);\n --popover: oklch(0.15 0.01 265);\n --popover-foreground: oklch(0.95 0.01 90);\n --primary: oklch(0.6 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.3 0.05 50);\n --secondary-foreground: oklch(0.9 0.05 85);\n --muted: oklch(0.2 0.01 265);\n --muted-foreground: oklch(0.65 0.01 265);\n --accent: oklch(0.2 0.02 265);\n --accent-foreground: oklch(0.95 0.01 90);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.25 0.01 265);\n --input: oklch(0.25 0.01 265);\n --ring: oklch(0.6 0.15 25);\n --sidebar: oklch(0.14 0.01 265);\n --sidebar-foreground: oklch(0.95 0.01 90);\n --sidebar-primary: oklch(0.6 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.2 0.01 265);\n --sidebar-accent-foreground: oklch(0.95 0.01 90);\n --sidebar-border: oklch(0.25 0.01 265);\n --sidebar-ring: oklch(0.6 0.15 25);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-gradient-position {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-via {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-to {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-via-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from-position {\n syntax: \"\";\n inherits: false;\n initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n syntax: \"\";\n inherits: false;\n initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity,1);\n transform: translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity,1);\n transform: translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n to {\n height: 0;\n }\n}\n@keyframes caret-blink {\n 0%,70%,100% {\n opacity: 1;\n }\n 20%,50% {\n opacity: 0;\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-content: \"\";\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: forwards;\n --tw-animation-iteration-count: 1;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}\n"],"names":[],"mappings":"AACA;EAq8ME;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAr8MJ;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFF;EAgHE;;;;;;;EAAA;;;;;;;EAMA;;;;;;;;;;EASA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;;;;EAKA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;;;;;;;EAAA;;;;;;;;;;;EAUA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;IACE;;;;IAEE;MAAgD;;;;;;EAKpD;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EA82LA;;;;;EAGE;IAAgD;;;;;EAIlD;;;;;EAIA;;;;;;;AAxnMF;;AAAA;EAoQE;;;;EAIA;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;;;;;;EAWA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAI3B;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;EAMA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAIE;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAMF;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;;EAKA;;;;;;EAKA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EA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"}}] + {"offset": {"line": 85, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/globals.css"],"sourcesContent":["/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-6xl: 72rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -0.025em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --radius-xs: 0.125rem;\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --aspect-video: 16 / 9;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --default-mono-font-family: \"Geist Mono\", monospace;\n --color-border: var(--border);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .\\@container\\/field-group {\n container-type: inline-size;\n container-name: field-group;\n }\n .pointer-events-auto {\n pointer-events: auto;\n }\n .pointer-events-none {\n pointer-events: none;\n }\n .invisible {\n visibility: hidden;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .static {\n position: static;\n }\n .sticky {\n position: sticky;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .inset-x-0 {\n inset-inline: calc(var(--spacing) * 0);\n }\n .inset-y-0 {\n inset-block: calc(var(--spacing) * 0);\n }\n .-top-1 {\n top: calc(var(--spacing) * -1);\n }\n .-top-3 {\n top: calc(var(--spacing) * -3);\n }\n .-top-12 {\n top: calc(var(--spacing) * -12);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n .top-2\\.5 {\n top: calc(var(--spacing) * 2.5);\n }\n .top-3\\.5 {\n top: calc(var(--spacing) * 3.5);\n }\n .top-4 {\n top: calc(var(--spacing) * 4);\n }\n .top-20 {\n top: calc(var(--spacing) * 20);\n }\n .top-\\[1px\\] {\n top: 1px;\n }\n .top-\\[50\\%\\] {\n top: 50%;\n }\n .top-\\[60\\%\\] {\n top: 60%;\n }\n .top-full {\n top: 100%;\n }\n .-right-1 {\n right: calc(var(--spacing) * -1);\n }\n .-right-12 {\n right: calc(var(--spacing) * -12);\n }\n .right-0 {\n right: calc(var(--spacing) * 0);\n }\n .right-1 {\n right: calc(var(--spacing) * 1);\n }\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n .-bottom-1 {\n bottom: calc(var(--spacing) * -1);\n }\n .-bottom-12 {\n bottom: calc(var(--spacing) * -12);\n }\n .bottom-0 {\n bottom: calc(var(--spacing) * 0);\n }\n .bottom-2 {\n bottom: calc(var(--spacing) * 2);\n }\n .bottom-4 {\n bottom: calc(var(--spacing) * 4);\n }\n .-left-12 {\n left: calc(var(--spacing) * -12);\n }\n .-left-16 {\n left: calc(var(--spacing) * -16);\n }\n .-left-\\[9px\\] {\n left: calc(9px * -1);\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-2 {\n left: calc(var(--spacing) * 2);\n }\n .left-2\\.5 {\n left: calc(var(--spacing) * 2.5);\n }\n .left-4 {\n left: calc(var(--spacing) * 4);\n }\n .left-\\[50\\%\\] {\n left: 50%;\n }\n .isolate {\n isolation: isolate;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-30 {\n z-index: 30;\n }\n .z-50 {\n z-index: 50;\n }\n .z-\\[1\\] {\n z-index: 1;\n }\n .z-\\[100\\] {\n z-index: 100;\n }\n .order-first {\n order: -9999;\n }\n .order-last {\n order: 9999;\n }\n .col-span-full {\n grid-column: 1 / -1;\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .container {\n width: 100%;\n @media (width >= 40rem) {\n max-width: 40rem;\n }\n @media (width >= 48rem) {\n max-width: 48rem;\n }\n @media (width >= 64rem) {\n max-width: 64rem;\n }\n @media (width >= 80rem) {\n max-width: 80rem;\n }\n @media (width >= 96rem) {\n max-width: 96rem;\n }\n }\n .\\!m-0 {\n margin: calc(var(--spacing) * 0) !important;\n }\n .-mx-1 {\n margin-inline: calc(var(--spacing) * -1);\n }\n .mx-2 {\n margin-inline: calc(var(--spacing) * 2);\n }\n .mx-3\\.5 {\n margin-inline: calc(var(--spacing) * 3.5);\n }\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n .mx-auto {\n margin-inline: auto;\n }\n .-my-2 {\n margin-block: calc(var(--spacing) * -2);\n }\n .my-0 {\n margin-block: calc(var(--spacing) * 0);\n }\n .my-0\\.5 {\n margin-block: calc(var(--spacing) * 0.5);\n }\n .my-1 {\n margin-block: calc(var(--spacing) * 1);\n }\n .-mt-4 {\n margin-top: calc(var(--spacing) * -4);\n }\n .mt-0 {\n margin-top: calc(var(--spacing) * 0);\n }\n .mt-0\\.5 {\n margin-top: calc(var(--spacing) * 0.5);\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-1\\.5 {\n margin-top: calc(var(--spacing) * 1.5);\n }\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mt-auto {\n margin-top: auto;\n }\n .mr-1 {\n margin-right: calc(var(--spacing) * 1);\n }\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .mb-8 {\n margin-bottom: calc(var(--spacing) * 8);\n }\n .-ml-4 {\n margin-left: calc(var(--spacing) * -4);\n }\n .ml-1 {\n margin-left: calc(var(--spacing) * 1);\n }\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n .ml-6 {\n margin-left: calc(var(--spacing) * 6);\n }\n .ml-auto {\n margin-left: auto;\n }\n .line-clamp-1 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n .line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .hidden {\n display: none;\n }\n .inline-flex {\n display: inline-flex;\n }\n .table {\n display: table;\n }\n .table-caption {\n display: table-caption;\n }\n .table-cell {\n display: table-cell;\n }\n .table-row {\n display: table-row;\n }\n .field-sizing-content {\n field-sizing: content;\n }\n .aspect-square {\n aspect-ratio: 1 / 1;\n }\n .aspect-video {\n aspect-ratio: var(--aspect-video);\n }\n .size-\\(--cell-size\\) {\n width: var(--cell-size);\n height: var(--cell-size);\n }\n .size-2 {\n width: calc(var(--spacing) * 2);\n height: calc(var(--spacing) * 2);\n }\n .size-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n height: calc(var(--spacing) * 2.5);\n }\n .size-3 {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n .size-3\\.5 {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n .size-4 {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n .size-6 {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n .size-7 {\n width: calc(var(--spacing) * 7);\n height: calc(var(--spacing) * 7);\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .size-auto {\n width: auto;\n height: auto;\n }\n .size-full {\n width: 100%;\n height: 100%;\n }\n .h-\\(--cell-size\\) {\n height: var(--cell-size);\n }\n .h-1 {\n height: calc(var(--spacing) * 1);\n }\n .h-1\\.5 {\n height: calc(var(--spacing) * 1.5);\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-2\\.5 {\n height: calc(var(--spacing) * 2.5);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-7 {\n height: calc(var(--spacing) * 7);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .h-12 {\n height: calc(var(--spacing) * 12);\n }\n .h-14 {\n height: calc(var(--spacing) * 14);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-20 {\n height: calc(var(--spacing) * 20);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-\\[1\\.15rem\\] {\n height: 1.15rem;\n }\n .h-\\[300px\\] {\n height: 300px;\n }\n .h-\\[400px\\] {\n height: 400px;\n }\n .h-\\[600px\\] {\n height: 600px;\n }\n .h-\\[calc\\(100\\%-1px\\)\\] {\n height: calc(100% - 1px);\n }\n .h-\\[var\\(--radix-navigation-menu-viewport-height\\)\\] {\n height: var(--radix-navigation-menu-viewport-height);\n }\n .h-\\[var\\(--radix-select-trigger-height\\)\\] {\n height: var(--radix-select-trigger-height);\n }\n .h-auto {\n height: auto;\n }\n .h-full {\n height: 100%;\n }\n .h-px {\n height: 1px;\n }\n .h-screen {\n height: 100vh;\n }\n .h-svh {\n height: 100svh;\n }\n .max-h-\\(--radix-context-menu-content-available-height\\) {\n max-height: var(--radix-context-menu-content-available-height);\n }\n .max-h-\\(--radix-dropdown-menu-content-available-height\\) {\n max-height: var(--radix-dropdown-menu-content-available-height);\n }\n .max-h-\\(--radix-select-content-available-height\\) {\n max-height: var(--radix-select-content-available-height);\n }\n .max-h-96 {\n max-height: calc(var(--spacing) * 96);\n }\n .max-h-\\[60vh\\] {\n max-height: 60vh;\n }\n .max-h-\\[70vh\\] {\n max-height: 70vh;\n }\n .max-h-\\[300px\\] {\n max-height: 300px;\n }\n .max-h-screen {\n max-height: 100vh;\n }\n .min-h-0 {\n min-height: calc(var(--spacing) * 0);\n }\n .min-h-4 {\n min-height: calc(var(--spacing) * 4);\n }\n .min-h-16 {\n min-height: calc(var(--spacing) * 16);\n }\n .min-h-\\[200px\\] {\n min-height: 200px;\n }\n .min-h-full {\n min-height: 100%;\n }\n .min-h-screen {\n min-height: 100vh;\n }\n .min-h-svh {\n min-height: 100svh;\n }\n .w-\\(--cell-size\\) {\n width: var(--cell-size);\n }\n .w-\\(--sidebar-width\\) {\n width: var(--sidebar-width);\n }\n .w-0 {\n width: calc(var(--spacing) * 0);\n }\n .w-1 {\n width: calc(var(--spacing) * 1);\n }\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n .w-2\\.5 {\n width: calc(var(--spacing) * 2.5);\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-3\\/4 {\n width: calc(3/4 * 100%);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-7 {\n width: calc(var(--spacing) * 7);\n }\n .w-8 {\n width: calc(var(--spacing) * 8);\n }\n .w-9 {\n width: calc(var(--spacing) * 9);\n }\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n .w-14 {\n width: calc(var(--spacing) * 14);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-20 {\n width: calc(var(--spacing) * 20);\n }\n .w-32 {\n width: calc(var(--spacing) * 32);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .w-56 {\n width: calc(var(--spacing) * 56);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n .w-\\[100px\\] {\n width: 100px;\n }\n .w-\\[200px\\] {\n width: 200px;\n }\n .w-\\[var\\(--radix-dropdown-menu-trigger-width\\)\\] {\n width: var(--radix-dropdown-menu-trigger-width);\n }\n .w-auto {\n width: auto;\n }\n .w-fit {\n width: fit-content;\n }\n .w-full {\n width: 100%;\n }\n .w-max {\n width: max-content;\n }\n .w-px {\n width: 1px;\n }\n .max-w-\\(--skeleton-width\\) {\n max-width: var(--skeleton-width);\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .max-w-4xl {\n max-width: var(--container-4xl);\n }\n .max-w-6xl {\n max-width: var(--container-6xl);\n }\n .max-w-\\[calc\\(100\\%-2rem\\)\\] {\n max-width: calc(100% - 2rem);\n }\n .max-w-full {\n max-width: 100%;\n }\n .max-w-max {\n max-width: max-content;\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-none {\n max-width: none;\n }\n .max-w-sm {\n max-width: var(--container-sm);\n }\n .min-w-\\(--cell-size\\) {\n min-width: var(--cell-size);\n }\n .min-w-0 {\n min-width: calc(var(--spacing) * 0);\n }\n .min-w-5 {\n min-width: calc(var(--spacing) * 5);\n }\n .min-w-8 {\n min-width: calc(var(--spacing) * 8);\n }\n .min-w-9 {\n min-width: calc(var(--spacing) * 9);\n }\n .min-w-10 {\n min-width: calc(var(--spacing) * 10);\n }\n .min-w-\\[8rem\\] {\n min-width: 8rem;\n }\n .min-w-\\[12rem\\] {\n min-width: 12rem;\n }\n .min-w-\\[200px\\] {\n min-width: 200px;\n }\n .min-w-\\[var\\(--radix-select-trigger-width\\)\\] {\n min-width: var(--radix-select-trigger-width);\n }\n .min-w-fit {\n min-width: fit-content;\n }\n .min-w-full {\n min-width: 100%;\n }\n .flex-1 {\n flex: 1;\n }\n .flex-shrink {\n flex-shrink: 1;\n }\n .flex-shrink-0 {\n flex-shrink: 0;\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .grow {\n flex-grow: 1;\n }\n .grow-0 {\n flex-grow: 0;\n }\n .basis-full {\n flex-basis: 100%;\n }\n .caption-bottom {\n caption-side: bottom;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .origin-\\(--radix-context-menu-content-transform-origin\\) {\n transform-origin: var(--radix-context-menu-content-transform-origin);\n }\n .origin-\\(--radix-dropdown-menu-content-transform-origin\\) {\n transform-origin: var(--radix-dropdown-menu-content-transform-origin);\n }\n .origin-\\(--radix-hover-card-content-transform-origin\\) {\n transform-origin: var(--radix-hover-card-content-transform-origin);\n }\n .origin-\\(--radix-menubar-content-transform-origin\\) {\n transform-origin: var(--radix-menubar-content-transform-origin);\n }\n .origin-\\(--radix-popover-content-transform-origin\\) {\n transform-origin: var(--radix-popover-content-transform-origin);\n }\n .origin-\\(--radix-select-content-transform-origin\\) {\n transform-origin: var(--radix-select-content-transform-origin);\n }\n .origin-\\(--radix-tooltip-content-transform-origin\\) {\n transform-origin: var(--radix-tooltip-content-transform-origin);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-px {\n --tw-translate-x: -1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-\\[-50\\%\\] {\n --tw-translate-x: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-x-px {\n --tw-translate-x: 1px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-0\\.5 {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[-50\\%\\] {\n --tw-translate-y: -50%;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[2px\\] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .translate-y-\\[calc\\(-50\\%_-_2px\\)\\] {\n --tw-translate-y: calc(-50% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .rotate-45 {\n rotate: 45deg;\n }\n .rotate-90 {\n rotate: 90deg;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-caret-blink {\n animation: caret-blink 1.25s ease-out infinite;\n }\n .animate-in {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n .animate-pulse {\n animation: var(--animate-pulse);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-default {\n cursor: default;\n }\n .cursor-move {\n cursor: move;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .cursor-text {\n cursor: text;\n }\n .touch-none {\n touch-action: none;\n }\n .resize {\n resize: both;\n }\n .resize-none {\n resize: none;\n }\n .scroll-my-1 {\n scroll-margin-block: calc(var(--spacing) * 1);\n }\n .scroll-py-1 {\n scroll-padding-block: calc(var(--spacing) * 1);\n }\n .list-inside {\n list-style-position: inside;\n }\n .list-disc {\n list-style-type: disc;\n }\n .list-none {\n list-style-type: none;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .grid-cols-\\[0_1fr\\] {\n grid-template-columns: 0 1fr;\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-col-reverse {\n flex-direction: column-reverse;\n }\n .flex-row {\n flex-direction: row;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-baseline {\n align-items: baseline;\n }\n .items-center {\n align-items: center;\n }\n .items-end {\n align-items: flex-end;\n }\n .items-start {\n align-items: flex-start;\n }\n .items-stretch {\n align-items: stretch;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-end {\n justify-content: flex-end;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .justify-items-start {\n justify-items: start;\n }\n .gap-0\\.5 {\n gap: calc(var(--spacing) * 0.5);\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-2\\.5 {\n gap: calc(var(--spacing) * 2.5);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-7 {\n gap: calc(var(--spacing) * 7);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .space-y-0\\.5 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-1 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-2 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-3 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-x-4 {\n :where(& > :not(:last-child)) {\n --tw-space-x-reverse: 0;\n margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));\n margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));\n }\n }\n .gap-y-0\\.5 {\n row-gap: calc(var(--spacing) * 0.5);\n }\n .self-start {\n align-self: flex-start;\n }\n .self-stretch {\n align-self: stretch;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .overflow-auto {\n overflow: auto;\n }\n .overflow-hidden {\n overflow: hidden;\n }\n .overflow-x-auto {\n overflow-x: auto;\n }\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n .overflow-y-auto {\n overflow-y: auto;\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-\\[2px\\] {\n border-radius: 2px;\n }\n .rounded-\\[4px\\] {\n border-radius: 4px;\n }\n .rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n border-radius: calc(var(--radius) - 5px);\n }\n .rounded-\\[inherit\\] {\n border-radius: inherit;\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-none {\n border-radius: 0;\n }\n .rounded-sm {\n border-radius: calc(var(--radius) - 4px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .rounded-xs {\n border-radius: var(--radius-xs);\n }\n .rounded-l-md {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n .rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n }\n .rounded-r-md {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-0 {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-\\[1\\.5px\\] {\n border-style: var(--tw-border-style);\n border-width: 1.5px;\n }\n .border-y {\n border-block-style: var(--tw-border-style);\n border-block-width: 1px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n .border-l-2 {\n border-left-style: var(--tw-border-style);\n border-left-width: 2px;\n }\n .border-l-4 {\n border-left-style: var(--tw-border-style);\n border-left-width: 4px;\n }\n .border-dashed {\n --tw-border-style: dashed;\n border-style: dashed;\n }\n .border-none {\n --tw-border-style: none;\n border-style: none;\n }\n .border-\\(--color-border\\) {\n border-color: var(--color-border);\n }\n .border-background {\n border-color: var(--background);\n }\n .border-blue-200 {\n border-color: var(--color-blue-200);\n }\n .border-blue-200\\/50 {\n border-color: color-mix(in srgb, oklch(88.2% 0.059 254.128) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-blue-200) 50%, transparent);\n }\n }\n .border-blue-500 {\n border-color: var(--color-blue-500);\n }\n .border-border {\n border-color: var(--border);\n }\n .border-border\\/40 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 40%, transparent);\n }\n }\n .border-border\\/50 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n .border-border\\/60 {\n border-color: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--border) 60%, transparent);\n }\n }\n .border-destructive {\n border-color: var(--destructive);\n }\n .border-destructive\\/20 {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-green-200 {\n border-color: var(--color-green-200);\n }\n .border-input {\n border-color: var(--input);\n }\n .border-muted-foreground\\/50 {\n border-color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted-foreground) 50%, transparent);\n }\n }\n .border-orange-200 {\n border-color: var(--color-orange-200);\n }\n .border-pink-200\\/50 {\n border-color: color-mix(in srgb, oklch(89.9% 0.061 343.231) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-pink-200) 50%, transparent);\n }\n }\n .border-primary {\n border-color: var(--primary);\n }\n .border-primary\\/20 {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .border-purple-200 {\n border-color: var(--color-purple-200);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .border-sidebar-border {\n border-color: var(--sidebar-border);\n }\n .border-transparent {\n border-color: transparent;\n }\n .border-white {\n border-color: var(--color-white);\n }\n .border-yellow-400 {\n border-color: var(--color-yellow-400);\n }\n .border-t-transparent {\n border-top-color: transparent;\n }\n .border-l-transparent {\n border-left-color: transparent;\n }\n .bg-\\(--color-bg\\) {\n background-color: var(--color-bg);\n }\n .bg-accent {\n background-color: var(--accent);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-background\\/50 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 50%, transparent);\n }\n }\n .bg-background\\/60 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n .bg-background\\/80 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 80%, transparent);\n }\n }\n .bg-background\\/90 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 90%, transparent);\n }\n }\n .bg-background\\/95 {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 95%, transparent);\n }\n }\n .bg-black {\n background-color: var(--color-black);\n }\n .bg-black\\/50 {\n background-color: color-mix(in srgb, #000 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 50%, transparent);\n }\n }\n .bg-blue-50 {\n background-color: var(--color-blue-50);\n }\n .bg-blue-50\\/50 {\n background-color: color-mix(in srgb, oklch(97% 0.014 254.604) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-50) 50%, transparent);\n }\n }\n .bg-blue-100 {\n background-color: var(--color-blue-100);\n }\n .bg-blue-500 {\n background-color: var(--color-blue-500);\n }\n .bg-border {\n background-color: var(--border);\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-card\\/50 {\n background-color: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--card) 50%, transparent);\n }\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-destructive\\/10 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n .bg-destructive\\/15 {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 15%, transparent);\n }\n }\n .bg-foreground {\n background-color: var(--foreground);\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-100 {\n background-color: var(--color-gray-100);\n }\n .bg-gray-500 {\n background-color: var(--color-gray-500);\n }\n .bg-green-50 {\n background-color: var(--color-green-50);\n }\n .bg-green-100 {\n background-color: var(--color-green-100);\n }\n .bg-green-500 {\n background-color: var(--color-green-500);\n }\n .bg-input {\n background-color: var(--input);\n }\n .bg-muted {\n background-color: var(--muted);\n }\n .bg-muted\\/30 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n .bg-muted\\/50 {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n .bg-neutral-100 {\n background-color: var(--color-neutral-100);\n }\n .bg-neutral-400 {\n background-color: var(--color-neutral-400);\n }\n .bg-orange-50 {\n background-color: var(--color-orange-50);\n }\n .bg-orange-500 {\n background-color: var(--color-orange-500);\n }\n .bg-pink-50\\/50 {\n background-color: color-mix(in srgb, oklch(97.1% 0.014 343.198) 50%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-pink-50) 50%, transparent);\n }\n }\n .bg-pink-100 {\n background-color: var(--color-pink-100);\n }\n .bg-popover {\n background-color: var(--popover);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-primary\\/5 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n .bg-primary\\/10 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n .bg-primary\\/20 {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n .bg-purple-50 {\n background-color: var(--color-purple-50);\n }\n .bg-purple-100 {\n background-color: var(--color-purple-100);\n }\n .bg-purple-500 {\n background-color: var(--color-purple-500);\n }\n .bg-red-100 {\n background-color: var(--color-red-100);\n }\n .bg-red-500 {\n background-color: var(--color-red-500);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .bg-sidebar {\n background-color: var(--sidebar);\n }\n .bg-sidebar-border {\n background-color: var(--sidebar-border);\n }\n .bg-transparent {\n background-color: transparent;\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .bg-yellow-50 {\n background-color: var(--color-yellow-50);\n }\n .bg-gradient-to-br {\n --tw-gradient-position: to bottom right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-gradient-to-r {\n --tw-gradient-position: to right in oklab;\n background-image: linear-gradient(var(--tw-gradient-stops));\n }\n .bg-\\[url\\(\\'https\\:\\/\\/www\\.transparenttextures\\.com\\/patterns\\/rice-paper\\.png\\'\\)\\] {\n background-image: url('https://www.transparenttextures.com/patterns/rice-paper.png');\n }\n .from-card {\n --tw-gradient-from: var(--card);\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/5 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .from-primary\\/50 {\n --tw-gradient-from: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-from: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .via-background {\n --tw-gradient-via: var(--background);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .via-primary {\n --tw-gradient-via: var(--primary);\n --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);\n --tw-gradient-stops: var(--tw-gradient-via-stops);\n }\n .to-card\\/50 {\n --tw-gradient-to: var(--card);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--card) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-primary\\/50 {\n --tw-gradient-to: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--primary) 50%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .to-secondary\\/5 {\n --tw-gradient-to: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-gradient-to: color-mix(in oklab, var(--secondary) 5%, transparent);\n }\n --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n }\n .bg-repeat {\n background-repeat: repeat;\n }\n .fill-current {\n fill: currentcolor;\n }\n .fill-foreground {\n fill: var(--foreground);\n }\n .fill-primary {\n fill: var(--primary);\n }\n .object-contain {\n object-fit: contain;\n }\n .object-cover {\n object-fit: cover;\n }\n .p-0 {\n padding: calc(var(--spacing) * 0);\n }\n .p-1 {\n padding: calc(var(--spacing) * 1);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-2\\.5 {\n padding: calc(var(--spacing) * 2.5);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-12 {\n padding: calc(var(--spacing) * 12);\n }\n .p-\\[3px\\] {\n padding: 3px;\n }\n .p-px {\n padding: 1px;\n }\n .px-\\(--cell-size\\) {\n padding-inline: var(--cell-size);\n }\n .px-1 {\n padding-inline: calc(var(--spacing) * 1);\n }\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-2\\.5 {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-0\\.5 {\n padding-block: calc(var(--spacing) * 0.5);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .py-8 {\n padding-block: calc(var(--spacing) * 8);\n }\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n .py-12 {\n padding-block: calc(var(--spacing) * 12);\n }\n .pt-0 {\n padding-top: calc(var(--spacing) * 0);\n }\n .pt-3 {\n padding-top: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-20 {\n padding-top: calc(var(--spacing) * 20);\n }\n .pr-1 {\n padding-right: calc(var(--spacing) * 1);\n }\n .pr-2 {\n padding-right: calc(var(--spacing) * 2);\n }\n .pr-2\\.5 {\n padding-right: calc(var(--spacing) * 2.5);\n }\n .pr-3 {\n padding-right: calc(var(--spacing) * 3);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pr-8 {\n padding-right: calc(var(--spacing) * 8);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n .pb-6 {\n padding-bottom: calc(var(--spacing) * 6);\n }\n .pb-8 {\n padding-bottom: calc(var(--spacing) * 8);\n }\n .pb-20 {\n padding-bottom: calc(var(--spacing) * 20);\n }\n .pl-1 {\n padding-left: calc(var(--spacing) * 1);\n }\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n .pl-3 {\n padding-left: calc(var(--spacing) * 3);\n }\n .pl-4 {\n padding-left: calc(var(--spacing) * 4);\n }\n .pl-8 {\n padding-left: calc(var(--spacing) * 8);\n }\n .pl-9 {\n padding-left: calc(var(--spacing) * 9);\n }\n .text-center {\n text-align: center;\n }\n .text-left {\n text-align: left;\n }\n .text-right {\n text-align: right;\n }\n .align-middle {\n vertical-align: middle;\n }\n .font-mono {\n font-family: \"Geist Mono\", monospace;\n }\n .font-sans {\n font-family: \"Geist\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n }\n .font-serif {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-base {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-sm\\/relaxed {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .text-\\[0\\.8rem\\] {\n font-size: 0.8rem;\n }\n .text-\\[9px\\] {\n font-size: 9px;\n }\n .text-\\[10px\\] {\n font-size: 10px;\n }\n .text-\\[11px\\] {\n font-size: 11px;\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .leading-normal {\n --tw-leading: var(--leading-normal);\n line-height: var(--leading-normal);\n }\n .leading-relaxed {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n .leading-snug {\n --tw-leading: var(--leading-snug);\n line-height: var(--leading-snug);\n }\n .leading-tight {\n --tw-leading: var(--leading-tight);\n line-height: var(--leading-tight);\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-normal {\n --tw-font-weight: var(--font-weight-normal);\n font-weight: var(--font-weight-normal);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n .tracking-wide {\n --tw-tracking: var(--tracking-wide);\n letter-spacing: var(--tracking-wide);\n }\n .tracking-wider {\n --tw-tracking: var(--tracking-wider);\n letter-spacing: var(--tracking-wider);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .text-balance {\n text-wrap: balance;\n }\n .break-words {\n overflow-wrap: break-word;\n }\n .break-all {\n word-break: break-all;\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .whitespace-pre-line {\n white-space: pre-line;\n }\n .whitespace-pre-wrap {\n white-space: pre-wrap;\n }\n .text-accent-foreground {\n color: var(--accent-foreground);\n }\n .text-amber-700 {\n color: var(--color-amber-700);\n }\n .text-background {\n color: var(--background);\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-blue-700 {\n color: var(--color-blue-700);\n }\n .text-blue-800 {\n color: var(--color-blue-800);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-current {\n color: currentcolor;\n }\n .text-destructive {\n color: var(--destructive);\n }\n .text-destructive-foreground {\n color: var(--destructive-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-foreground\\/50 {\n color: var(--foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--foreground) 50%, transparent);\n }\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-green-700 {\n color: var(--color-green-700);\n }\n .text-green-800 {\n color: var(--color-green-800);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-muted-foreground\\/60 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 60%, transparent);\n }\n }\n .text-muted-foreground\\/70 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 70%, transparent);\n }\n }\n .text-muted-foreground\\/80 {\n color: var(--muted-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--muted-foreground) 80%, transparent);\n }\n }\n .text-neutral-500 {\n color: var(--color-neutral-500);\n }\n .text-orange-700 {\n color: var(--color-orange-700);\n }\n .text-pink-400 {\n color: var(--color-pink-400);\n }\n .text-pink-700 {\n color: var(--color-pink-700);\n }\n .text-popover-foreground {\n color: var(--popover-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-primary\\/70 {\n color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--primary) 70%, transparent);\n }\n }\n .text-purple-700 {\n color: var(--color-purple-700);\n }\n .text-red-400 {\n color: var(--color-red-400);\n }\n .text-red-600 {\n color: var(--color-red-600);\n }\n .text-red-700 {\n color: var(--color-red-700);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-sidebar-foreground {\n color: var(--sidebar-foreground);\n }\n .text-sidebar-foreground\\/70 {\n color: var(--sidebar-foreground);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--sidebar-foreground) 70%, transparent);\n }\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-800 {\n color: var(--color-yellow-800);\n }\n .uppercase {\n text-transform: uppercase;\n }\n .italic {\n font-style: italic;\n }\n .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n }\n .underline {\n text-decoration-line: underline;\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .antialiased {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .opacity-20 {\n opacity: 20%;\n }\n .opacity-50 {\n opacity: 50%;\n }\n .opacity-70 {\n opacity: 70%;\n }\n .opacity-90 {\n opacity: 90%;\n }\n .opacity-100 {\n opacity: 100%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-border\\)\\)\\] {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-border)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-md {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-none {\n --tw-shadow: 0 0 #0000;\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-0 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-2 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-4 {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .ring-background {\n --tw-ring-color: var(--background);\n }\n .ring-blue-200 {\n --tw-ring-color: var(--color-blue-200);\n }\n .ring-ring\\/50 {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n .ring-sidebar-ring {\n --tw-ring-color: var(--sidebar-ring);\n }\n .ring-yellow-200 {\n --tw-ring-color: var(--color-yellow-200);\n }\n .ring-offset-background {\n --tw-ring-offset-color: var(--background);\n }\n .outline-hidden {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .backdrop-blur {\n --tw-backdrop-blur: blur(8px);\n -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[color\\,box-shadow\\] {\n transition-property: color,box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[left\\,right\\,width\\] {\n transition-property: left,right,width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[margin\\,opacity\\] {\n transition-property: margin,opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\,height\\,padding\\] {\n transition-property: width,height,padding;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-\\[width\\] {\n transition-property: width;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-transform {\n transition-property: transform, translate, scale, rotate;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-none {\n transition-property: none;\n }\n .duration-100 {\n --tw-duration: 100ms;\n transition-duration: 100ms;\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .duration-300 {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n .duration-1000 {\n --tw-duration: 1000ms;\n transition-duration: 1000ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .ease-linear {\n --tw-ease: linear;\n transition-timing-function: linear;\n }\n .ease-out {\n --tw-ease: var(--ease-out);\n transition-timing-function: var(--ease-out);\n }\n .fade-in-0 {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .slide-in-from-bottom-5 {\n --tw-enter-translate-y: calc(5*var(--spacing));\n --tw-enter-translate-y: calc(.05*100%);\n }\n .zoom-in-95 {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n .\\[--cell-size\\:--spacing\\(8\\)\\] {\n --cell-size: calc(var(--spacing) * 8);\n }\n .slide-in-from-top-2 {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n .group-last\\:hidden {\n &:is(:where(.group):last-child *) {\n display: none;\n }\n }\n .group-focus-within\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):focus-within *) {\n opacity: 100%;\n }\n }\n .group-hover\\:scale-110 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n --tw-scale-x: 110%;\n --tw-scale-y: 110%;\n --tw-scale-z: 110%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .group-hover\\:bg-primary\\/20 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 20%, transparent);\n }\n }\n }\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-hover\\/menu-item\\:opacity-100 {\n &:is(:where(.group\\/menu-item):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8 {\n &:is(:where(.group\\/menu-item):has(*[data-sidebar=\"menu-action\"]) *) {\n padding-right: calc(var(--spacing) * 8);\n }\n }\n .group-has-\\[\\[data-orientation\\=horizontal\\]\\]\\/field\\:text-balance {\n &:is(:where(.group\\/field):has(*:is([data-orientation=horizontal])) *) {\n text-wrap: balance;\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:translate-y-0\\.5 {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-has-\\[\\[data-slot\\=item-description\\]\\]\\/item\\:self-start {\n &:is(:where(.group\\/item):has(*:is([data-slot=item-description])) *) {\n align-self: flex-start;\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pt-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-top: calc(var(--spacing) * 2.5);\n }\n }\n .group-has-\\[\\>input\\]\\/input-group\\:pb-2\\.5 {\n &:is(:where(.group\\/input-group):has(>input) *) {\n padding-bottom: calc(var(--spacing) * 2.5);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:-mt-8 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n margin-top: calc(var(--spacing) * -8);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n display: none;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:size-8\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--spacing) * 8) !important;\n height: calc(var(--spacing) * 8) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\) {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: var(--sidebar-width-icon);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)));\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\] {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n width: calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px);\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:overflow-hidden {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-0\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 0) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:p-2\\! {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n padding: calc(var(--spacing) * 2) !important;\n }\n }\n .group-data-\\[collapsible\\=icon\\]\\:opacity-0 {\n &:is(:where(.group)[data-collapsible=\"icon\"] *) {\n opacity: 0%;\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n right: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\] {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n left: calc(var(--sidebar-width) * -1);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:w-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n width: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:translate-x-0 {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[disabled\\=true\\]\\:pointer-events-none {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n pointer-events: none;\n }\n }\n .group-data-\\[disabled\\=true\\]\\:opacity-50 {\n &:is(:where(.group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/field\\:opacity-50 {\n &:is(:where(.group\\/field)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[disabled\\=true\\]\\/input-group\\:opacity-50 {\n &:is(:where(.group\\/input-group)[data-disabled=\"true\"] *) {\n opacity: 50%;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:relative {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n position: relative;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:z-10 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n z-index: 10;\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:border-ring {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n border-color: var(--ring);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-\\[3px\\] {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[focused\\=true\\]\\/day\\:ring-ring\\/50 {\n &:is(:where(.group\\/day)[data-focused=\"true\"] *) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .group-data-\\[side\\=left\\]\\:-right-4 {\n &:is(:where(.group)[data-side=\"left\"] *) {\n right: calc(var(--spacing) * -4);\n }\n }\n .group-data-\\[side\\=left\\]\\:border-r {\n &:is(:where(.group)[data-side=\"left\"] *) {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .group-data-\\[side\\=right\\]\\:left-0 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n left: calc(var(--spacing) * 0);\n }\n }\n .group-data-\\[side\\=right\\]\\:rotate-180 {\n &:is(:where(.group)[data-side=\"right\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[side\\=right\\]\\:border-l {\n &:is(:where(.group)[data-side=\"right\"] *) {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .group-data-\\[state\\=open\\]\\:rotate-180 {\n &:is(:where(.group)[data-state=\"open\"] *) {\n rotate: 180deg;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:rounded-lg {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-radius: var(--radius);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[variant\\=floating\\]\\:border-sidebar-border {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n border-color: var(--sidebar-border);\n }\n }\n .group-data-\\[variant\\=floating\\]\\:shadow-sm {\n &:is(:where(.group)[data-variant=\"floating\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[variant\\=outline\\]\\/field-group\\:-mb-2 {\n &:is(:where(.group\\/field-group)[data-variant=\"outline\"] *) {\n margin-bottom: calc(var(--spacing) * -2);\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n display: block;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"bottom\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center {\n &:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=\"top\"] *) {\n text-align: center;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:top-full {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n top: 100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:mt-1\\.5 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n margin-top: calc(var(--spacing) * 1.5);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:overflow-hidden {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n overflow: hidden;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:rounded-md {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:border {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:bg-popover {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n background-color: var(--popover);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:text-popover-foreground {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n color: var(--popover-foreground);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:shadow {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:duration-200 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n }\n .group-\\[\\.destructive\\]\\:border-muted\\/40 {\n &:is(:where(.group):is(.destructive) *) {\n border-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--muted) 40%, transparent);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:text-red-300 {\n &:is(:where(.group):is(.destructive) *) {\n color: var(--color-red-300);\n }\n }\n .peer-hover\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button):hover ~ *) {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .peer-disabled\\:cursor-not-allowed {\n &:is(:where(.peer):disabled ~ *) {\n cursor: not-allowed;\n }\n }\n .peer-disabled\\:opacity-50 {\n &:is(:where(.peer):disabled ~ *) {\n opacity: 50%;\n }\n }\n .peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground {\n &:is(:where(.peer\\/menu-button)[data-active=\"true\"] ~ *) {\n color: var(--sidebar-accent-foreground);\n }\n }\n .peer-data-\\[size\\=default\\]\\/menu-button\\:top-1\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"default\"] ~ *) {\n top: calc(var(--spacing) * 1.5);\n }\n }\n .peer-data-\\[size\\=lg\\]\\/menu-button\\:top-2\\.5 {\n &:is(:where(.peer\\/menu-button)[data-size=\"lg\"] ~ *) {\n top: calc(var(--spacing) * 2.5);\n }\n }\n .peer-data-\\[size\\=sm\\]\\/menu-button\\:top-1 {\n &:is(:where(.peer\\/menu-button)[data-size=\"sm\"] ~ *) {\n top: calc(var(--spacing) * 1);\n }\n }\n .selection\\:bg-primary {\n & *::selection {\n background-color: var(--primary);\n }\n &::selection {\n background-color: var(--primary);\n }\n }\n .selection\\:text-primary-foreground {\n & *::selection {\n color: var(--primary-foreground);\n }\n &::selection {\n color: var(--primary-foreground);\n }\n }\n .file\\:inline-flex {\n &::file-selector-button {\n display: inline-flex;\n }\n }\n .file\\:h-7 {\n &::file-selector-button {\n height: calc(var(--spacing) * 7);\n }\n }\n .file\\:border-0 {\n &::file-selector-button {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .file\\:bg-transparent {\n &::file-selector-button {\n background-color: transparent;\n }\n }\n .file\\:text-sm {\n &::file-selector-button {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .file\\:font-medium {\n &::file-selector-button {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .file\\:text-foreground {\n &::file-selector-button {\n color: var(--foreground);\n }\n }\n .placeholder\\:text-muted-foreground {\n &::placeholder {\n color: var(--muted-foreground);\n }\n }\n .after\\:absolute {\n &::after {\n content: var(--tw-content);\n position: absolute;\n }\n }\n .after\\:-inset-2 {\n &::after {\n content: var(--tw-content);\n inset: calc(var(--spacing) * -2);\n }\n }\n .after\\:inset-y-0 {\n &::after {\n content: var(--tw-content);\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .after\\:left-1\\/2 {\n &::after {\n content: var(--tw-content);\n left: calc(1/2 * 100%);\n }\n }\n .after\\:w-1 {\n &::after {\n content: var(--tw-content);\n width: calc(var(--spacing) * 1);\n }\n }\n .after\\:w-\\[2px\\] {\n &::after {\n content: var(--tw-content);\n width: 2px;\n }\n }\n .after\\:-translate-x-1\\/2 {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .group-data-\\[collapsible\\=offcanvas\\]\\:after\\:left-full {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n &::after {\n content: var(--tw-content);\n left: 100%;\n }\n }\n }\n .first\\:rounded-l-md {\n &:first-child {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .first\\:border-l {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .last\\:mt-0 {\n &:last-child {\n margin-top: calc(var(--spacing) * 0);\n }\n }\n .last\\:rounded-r-md {\n &:last-child {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .last\\:border-0 {\n &:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .last\\:border-b-0 {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n .hover\\:scale-105 {\n &:hover {\n @media (hover: hover) {\n --tw-scale-x: 105%;\n --tw-scale-y: 105%;\n --tw-scale-z: 105%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n }\n }\n .hover\\:border-blue-400 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--color-blue-400);\n }\n }\n }\n .hover\\:border-primary {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n }\n }\n }\n .hover\\:border-primary\\/30 {\n &:hover {\n @media (hover: hover) {\n border-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--primary) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-accent\\/5 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 5%, transparent);\n }\n }\n }\n }\n .hover\\:bg-accent\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-background {\n &:hover {\n @media (hover: hover) {\n background-color: var(--background);\n }\n }\n }\n .hover\\:bg-destructive {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n }\n }\n }\n .hover\\:bg-muted\\/30 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 30%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/50 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 50%, transparent);\n }\n }\n }\n }\n .hover\\:bg-muted\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--muted);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--muted) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:bg-sidebar-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:text-destructive {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive);\n }\n }\n }\n .hover\\:text-destructive-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n .hover\\:text-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--foreground);\n }\n }\n }\n .hover\\:text-muted-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--muted-foreground);\n }\n }\n }\n .hover\\:text-primary {\n &:hover {\n @media (hover: hover) {\n color: var(--primary);\n }\n }\n }\n .hover\\:text-sidebar-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .hover\\:opacity-90 {\n &:hover {\n @media (hover: hover) {\n opacity: 90%;\n }\n }\n }\n .hover\\:opacity-100 {\n &:hover {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .hover\\:shadow-\\[0_0_0_1px_hsl\\(var\\(--sidebar-accent\\)\\)\\] {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-accent)));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-lg {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:shadow-md {\n &:hover {\n @media (hover: hover) {\n --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:ring-4 {\n &:hover {\n @media (hover: hover) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .hover\\:group-data-\\[collapsible\\=offcanvas\\]\\:bg-sidebar {\n &:hover {\n @media (hover: hover) {\n &:is(:where(.group)[data-collapsible=\"offcanvas\"] *) {\n background-color: var(--sidebar);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:border-destructive\\/30 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n border-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--destructive) 30%, transparent);\n }\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:bg-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-destructive-foreground {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--destructive-foreground);\n }\n }\n }\n }\n .group-\\[\\.destructive\\]\\:hover\\:text-red-50 {\n &:is(:where(.group):is(.destructive) *) {\n &:hover {\n @media (hover: hover) {\n color: var(--color-red-50);\n }\n }\n }\n }\n .hover\\:after\\:bg-sidebar-border {\n &:hover {\n @media (hover: hover) {\n &::after {\n content: var(--tw-content);\n background-color: var(--sidebar-border);\n }\n }\n }\n }\n .focus\\:z-10 {\n &:focus {\n z-index: 10;\n }\n }\n .focus\\:bg-accent {\n &:focus {\n background-color: var(--accent);\n }\n }\n .focus\\:text-accent-foreground {\n &:focus {\n color: var(--accent-foreground);\n }\n }\n .focus\\:opacity-100 {\n &:focus {\n opacity: 100%;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-ring {\n &:focus {\n --tw-ring-color: var(--ring);\n }\n }\n .focus\\:ring-offset-2 {\n &:focus {\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus\\:outline-hidden {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-destructive {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--destructive);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-red-400 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-color: var(--color-red-400);\n }\n }\n }\n .group-\\[\\.destructive\\]\\:focus\\:ring-offset-red-600 {\n &:is(:where(.group):is(.destructive) *) {\n &:focus {\n --tw-ring-offset-color: var(--color-red-600);\n }\n }\n }\n .focus-visible\\:z-10 {\n &:focus-visible {\n z-index: 10;\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-0 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-1 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-2 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-4 {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-primary {\n &:focus-visible {\n --tw-ring-color: var(--primary);\n }\n }\n .focus-visible\\:ring-ring {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .focus-visible\\:ring-offset-1 {\n &:focus-visible {\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n }\n }\n .focus-visible\\:outline-hidden {\n &:focus-visible {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .focus-visible\\:outline-1 {\n &:focus-visible {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n }\n .focus-visible\\:outline-ring {\n &:focus-visible {\n outline-color: var(--ring);\n }\n }\n .active\\:bg-sidebar-accent {\n &:active {\n background-color: var(--sidebar-accent);\n }\n }\n .active\\:text-sidebar-accent-foreground {\n &:active {\n color: var(--sidebar-accent-foreground);\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:cursor-not-allowed {\n &:disabled {\n cursor: not-allowed;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .in-data-\\[side\\=left\\]\\:cursor-w-resize {\n :where(*[data-side=\"left\"]) & {\n cursor: w-resize;\n }\n }\n .in-data-\\[side\\=right\\]\\:cursor-e-resize {\n :where(*[data-side=\"right\"]) & {\n cursor: e-resize;\n }\n }\n .has-focus\\:border-ring {\n &:has(*:focus) {\n border-color: var(--ring);\n }\n }\n .has-focus\\:ring-\\[3px\\] {\n &:has(*:focus) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-focus\\:ring-ring\\/50 {\n &:has(*:focus) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-disabled\\:opacity-50 {\n &:has(*:disabled) {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-data-\\[state\\=checked\\]\\:border-primary {\n &:has(*[data-state=\"checked\"]) {\n border-color: var(--primary);\n }\n }\n .has-data-\\[state\\=checked\\]\\:bg-primary\\/5 {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 5%, transparent);\n }\n }\n }\n .has-data-\\[variant\\=inset\\]\\:bg-sidebar {\n &:has(*[data-variant=\"inset\"]) {\n background-color: var(--sidebar);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:border-ring {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n border-color: var(--ring);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-\\[3px\\] {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .has-\\[\\[data-slot\\=input-group-control\\]\\:focus-visible\\]\\:ring-ring\\/50 {\n &:has(*:is([data-slot=input-group-control]:focus-visible)) {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:border-destructive {\n &:has(*:is([data-slot][aria-invalid=true])) {\n border-color: var(--destructive);\n }\n }\n .has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/20 {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:h-auto {\n &:has(>[data-align=block-end]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:flex-col {\n &:has(>[data-align=block-end]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:h-auto {\n &:has(>[data-align=block-start]) {\n height: auto;\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:flex-col {\n &:has(>[data-align=block-start]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=button-group\\]\\]\\:gap-2 {\n &:has(>[data-slot=button-group]) {\n gap: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>\\[data-slot\\=checkbox-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=checkbox-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:w-full {\n &:has(>[data-slot=field]) {\n width: 100%;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:flex-col {\n &:has(>[data-slot=field]) {\n flex-direction: column;\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:rounded-md {\n &:has(>[data-slot=field]) {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .has-\\[\\>\\[data-slot\\=field\\]\\]\\:border {\n &:has(>[data-slot=field]) {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n }\n .has-\\[\\>\\[data-slot\\=radio-group\\]\\]\\:gap-3 {\n &:has(>[data-slot=radio-group]) {\n gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>button\\]\\:mr-\\[-0\\.4rem\\] {\n &:has(>button) {\n margin-right: -0.4rem;\n }\n }\n .has-\\[\\>button\\]\\:ml-\\[-0\\.45rem\\] {\n &:has(>button) {\n margin-left: -0.45rem;\n }\n }\n .has-\\[\\>kbd\\]\\:mr-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-right: -0.35rem;\n }\n }\n .has-\\[\\>kbd\\]\\:ml-\\[-0\\.35rem\\] {\n &:has(>kbd) {\n margin-left: -0.35rem;\n }\n }\n .has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\] {\n &:has(>svg) {\n grid-template-columns: calc(var(--spacing) * 4) 1fr;\n }\n }\n .has-\\[\\>svg\\]\\:gap-x-3 {\n &:has(>svg) {\n column-gap: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:p-0 {\n &:has(>svg) {\n padding: calc(var(--spacing) * 0);\n }\n }\n .has-\\[\\>svg\\]\\:px-2 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .has-\\[\\>textarea\\]\\:h-auto {\n &:has(>textarea) {\n height: auto;\n }\n }\n .aria-disabled\\:pointer-events-none {\n &[aria-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .aria-disabled\\:opacity-50 {\n &[aria-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .aria-selected\\:text-muted-foreground {\n &[aria-selected=\"true\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:z-10 {\n &[data-active=\"true\"] {\n z-index: 10;\n }\n }\n .data-\\[active\\=true\\]\\:border-ring {\n &[data-active=\"true\"] {\n border-color: var(--ring);\n }\n }\n .data-\\[active\\=true\\]\\:bg-accent\\/50 {\n &[data-active=\"true\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:bg-sidebar-accent {\n &[data-active=\"true\"] {\n background-color: var(--sidebar-accent);\n }\n }\n .data-\\[active\\=true\\]\\:font-medium {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .data-\\[active\\=true\\]\\:font-semibold {\n &[data-active=\"true\"] {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n }\n .data-\\[active\\=true\\]\\:text-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-foreground {\n &[data-active=\"true\"] {\n color: var(--foreground);\n }\n }\n .data-\\[active\\=true\\]\\:text-sidebar-accent-foreground {\n &[data-active=\"true\"] {\n color: var(--sidebar-accent-foreground);\n }\n }\n .data-\\[active\\=true\\]\\:ring-\\[3px\\] {\n &[data-active=\"true\"] {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[active\\=true\\]\\:ring-ring\\/50 {\n &[data-active=\"true\"] {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:hover\\:bg-accent {\n &[data-active=\"true\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[active\\=true\\]\\:focus\\:bg-accent {\n &[data-active=\"true\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:border-destructive {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n }\n .data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/20 {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n .data-\\[disabled\\]\\:pointer-events-none {\n &[data-disabled] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\]\\:opacity-50 {\n &[data-disabled] {\n opacity: 50%;\n }\n }\n .data-\\[disabled\\=true\\]\\:pointer-events-none {\n &[data-disabled=\"true\"] {\n pointer-events: none;\n }\n }\n .data-\\[disabled\\=true\\]\\:opacity-50 {\n &[data-disabled=\"true\"] {\n opacity: 50%;\n }\n }\n .data-\\[error\\=true\\]\\:text-destructive {\n &[data-error=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[inset\\]\\:pl-8 {\n &[data-inset] {\n padding-left: calc(var(--spacing) * 8);\n }\n }\n .data-\\[invalid\\=true\\]\\:text-destructive {\n &[data-invalid=\"true\"] {\n color: var(--destructive);\n }\n }\n .data-\\[motion\\=from-end\\]\\:slide-in-from-right-52 {\n &[data-motion=\"from-end\"] {\n --tw-enter-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=from-start\\]\\:slide-in-from-left-52 {\n &[data-motion=\"from-start\"] {\n --tw-enter-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\=to-end\\]\\:slide-out-to-right-52 {\n &[data-motion=\"to-end\"] {\n --tw-exit-translate-x: calc(52*var(--spacing));\n }\n }\n .data-\\[motion\\=to-start\\]\\:slide-out-to-left-52 {\n &[data-motion=\"to-start\"] {\n --tw-exit-translate-x: calc(52*var(--spacing)*-1);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:animate-in {\n &[data-motion^=\"from-\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=from-\\]\\:fade-in {\n &[data-motion^=\"from-\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:animate-out {\n &[data-motion^=\"to-\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[motion\\^\\=to-\\]\\:fade-out {\n &[data-motion^=\"to-\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-1\\.5 {\n &[data-orientation=\"horizontal\"] {\n height: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-full {\n &[data-orientation=\"horizontal\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:h-px {\n &[data-orientation=\"horizontal\"] {\n height: 1px;\n }\n }\n .data-\\[orientation\\=horizontal\\]\\:w-full {\n &[data-orientation=\"horizontal\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-auto {\n &[data-orientation=\"vertical\"] {\n height: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:h-full {\n &[data-orientation=\"vertical\"] {\n height: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:min-h-44 {\n &[data-orientation=\"vertical\"] {\n min-height: calc(var(--spacing) * 44);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-1\\.5 {\n &[data-orientation=\"vertical\"] {\n width: calc(var(--spacing) * 1.5);\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-auto {\n &[data-orientation=\"vertical\"] {\n width: auto;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-full {\n &[data-orientation=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:w-px {\n &[data-orientation=\"vertical\"] {\n width: 1px;\n }\n }\n .data-\\[orientation\\=vertical\\]\\:flex-col {\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:h-px {\n &[data-panel-group-direction=\"vertical\"] {\n height: 1px;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n width: 100%;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:flex-col {\n &[data-panel-group-direction=\"vertical\"] {\n flex-direction: column;\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:left-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n left: calc(var(--spacing) * 0);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:h-1 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n height: calc(var(--spacing) * 1);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:w-full {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n width: 100%;\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:translate-x-0 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[panel-group-direction\\=vertical\\]\\:after\\:-translate-y-1\\/2 {\n &[data-panel-group-direction=\"vertical\"] {\n &::after {\n content: var(--tw-content);\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n }\n .data-\\[placeholder\\]\\:text-muted-foreground {\n &[data-placeholder] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-md {\n &[data-range-end=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:rounded-r-md {\n &[data-range-end=\"true\"] {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-end\\=true\\]\\:bg-primary {\n &[data-range-end=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-end\\=true\\]\\:text-primary-foreground {\n &[data-range-end=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[range-middle\\=true\\]\\:rounded-none {\n &[data-range-middle=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[range-middle\\=true\\]\\:bg-accent {\n &[data-range-middle=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[range-middle\\=true\\]\\:text-accent-foreground {\n &[data-range-middle=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-md {\n &[data-range-start=\"true\"] {\n border-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:rounded-l-md {\n &[data-range-start=\"true\"] {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .data-\\[range-start\\=true\\]\\:bg-primary {\n &[data-range-start=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[range-start\\=true\\]\\:text-primary-foreground {\n &[data-range-start=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected-single\\=true\\]\\:bg-primary {\n &[data-selected-single=\"true\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[selected-single\\=true\\]\\:text-primary-foreground {\n &[data-selected-single=\"true\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[selected\\=true\\]\\:rounded-none {\n &[data-selected=\"true\"] {\n border-radius: 0;\n }\n }\n .data-\\[selected\\=true\\]\\:bg-accent {\n &[data-selected=\"true\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[selected\\=true\\]\\:text-accent-foreground {\n &[data-selected=\"true\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[side\\=bottom\\]\\:translate-y-1 {\n &[data-side=\"bottom\"] {\n --tw-translate-y: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=bottom\\]\\:slide-in-from-top-2 {\n &[data-side=\"bottom\"] {\n --tw-enter-translate-y: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=left\\]\\:-translate-x-1 {\n &[data-side=\"left\"] {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=left\\]\\:slide-in-from-right-2 {\n &[data-side=\"left\"] {\n --tw-enter-translate-x: calc(2*var(--spacing));\n }\n }\n .data-\\[side\\=right\\]\\:translate-x-1 {\n &[data-side=\"right\"] {\n --tw-translate-x: calc(var(--spacing) * 1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=right\\]\\:slide-in-from-left-2 {\n &[data-side=\"right\"] {\n --tw-enter-translate-x: calc(2*var(--spacing)*-1);\n }\n }\n .data-\\[side\\=top\\]\\:-translate-y-1 {\n &[data-side=\"top\"] {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[side\\=top\\]\\:slide-in-from-bottom-2 {\n &[data-side=\"top\"] {\n --tw-enter-translate-y: calc(2*var(--spacing));\n }\n }\n .data-\\[size\\=default\\]\\:h-9 {\n &[data-size=\"default\"] {\n height: calc(var(--spacing) * 9);\n }\n }\n .data-\\[size\\=sm\\]\\:h-8 {\n &[data-size=\"sm\"] {\n height: calc(var(--spacing) * 8);\n }\n }\n .\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90 {\n :is(& > *) {\n &[data-slot=\"alert-description\"] {\n color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .data-\\[slot\\=checkbox-group\\]\\:gap-3 {\n &[data-slot=\"checkbox-group\"] {\n gap: calc(var(--spacing) * 3);\n }\n }\n .\\*\\*\\:data-\\[slot\\=command-input-wrapper\\]\\:h-12 {\n :is(& *) {\n &[data-slot=\"command-input-wrapper\"] {\n height: calc(var(--spacing) * 12);\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:ring-0 {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n }\n .\\*\\*\\:data-\\[slot\\=navigation-menu-link\\]\\:focus\\:outline-none {\n :is(& *) {\n &[data-slot=\"navigation-menu-link\"] {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:line-clamp-1 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:flex {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n display: flex;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:items-center {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n align-items: center;\n }\n }\n }\n .\\*\\:data-\\[slot\\=select-value\\]\\:gap-2 {\n :is(& > *) {\n &[data-slot=\"select-value\"] {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n .data-\\[state\\=active\\]\\:bg-background {\n &[data-state=\"active\"] {\n background-color: var(--background);\n }\n }\n .data-\\[state\\=active\\]\\:shadow-sm {\n &[data-state=\"active\"] {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[state\\=checked\\]\\:translate-x-\\[calc\\(100\\%-2px\\)\\] {\n &[data-state=\"checked\"] {\n --tw-translate-x: calc(100% - 2px);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=checked\\]\\:border-primary {\n &[data-state=\"checked\"] {\n border-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:bg-primary {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n .data-\\[state\\=checked\\]\\:text-primary-foreground {\n &[data-state=\"checked\"] {\n color: var(--primary-foreground);\n }\n }\n .data-\\[state\\=closed\\]\\:animate-accordion-up {\n &[data-state=\"closed\"] {\n animation: accordion-up 0.2s ease-out;\n }\n }\n .data-\\[state\\=closed\\]\\:animate-out {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=closed\\]\\:duration-300 {\n &[data-state=\"closed\"] {\n --tw-duration: 300ms;\n transition-duration: 300ms;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-0 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=closed\\]\\:fade-out-80 {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(80/100);\n --tw-exit-opacity: .8;\n }\n }\n .data-\\[state\\=closed\\]\\:zoom-out-95 {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-bottom {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-left {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: -100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: 100%;\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-right-full {\n &[data-state=\"closed\"] {\n --tw-exit-translate-x: calc(1*100%);\n }\n }\n .data-\\[state\\=closed\\]\\:slide-out-to-top {\n &[data-state=\"closed\"] {\n --tw-exit-translate-y: -100%;\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:animate-out {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:fade-out-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-opacity: calc(0/100);\n --tw-exit-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=closed\\]\\:zoom-out-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"closed\"] {\n --tw-exit-scale: calc(95*1%);\n --tw-exit-scale: .95;\n }\n }\n }\n .data-\\[state\\=hidden\\]\\:animate-out {\n &[data-state=\"hidden\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=hidden\\]\\:fade-out {\n &[data-state=\"hidden\"] {\n --tw-exit-opacity: 0;\n }\n }\n .data-\\[state\\=on\\]\\:bg-accent {\n &[data-state=\"on\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=on\\]\\:text-accent-foreground {\n &[data-state=\"on\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:animate-accordion-down {\n &[data-state=\"open\"] {\n animation: accordion-down 0.2s ease-out;\n }\n }\n .data-\\[state\\=open\\]\\:animate-in {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n }\n }\n .data-\\[state\\=open\\]\\:bg-accent\\/50 {\n &[data-state=\"open\"] {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n .data-\\[state\\=open\\]\\:bg-secondary {\n &[data-state=\"open\"] {\n background-color: var(--secondary);\n }\n }\n .data-\\[state\\=open\\]\\:text-accent-foreground {\n &[data-state=\"open\"] {\n color: var(--accent-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:text-muted-foreground {\n &[data-state=\"open\"] {\n color: var(--muted-foreground);\n }\n }\n .data-\\[state\\=open\\]\\:opacity-100 {\n &[data-state=\"open\"] {\n opacity: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:duration-500 {\n &[data-state=\"open\"] {\n --tw-duration: 500ms;\n transition-duration: 500ms;\n }\n }\n .data-\\[state\\=open\\]\\:fade-in-0 {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-90 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(90*1%);\n --tw-enter-scale: .9;\n }\n }\n .data-\\[state\\=open\\]\\:zoom-in-95 {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-bottom {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-left {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-right {\n &[data-state=\"open\"] {\n --tw-enter-translate-x: 100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: -100%;\n }\n }\n .data-\\[state\\=open\\]\\:slide-in-from-top-full {\n &[data-state=\"open\"] {\n --tw-enter-translate-y: calc(1*-100%);\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:animate-in {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:fade-in-0 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-opacity: calc(0/100);\n --tw-enter-opacity: 0;\n }\n }\n }\n .group-data-\\[viewport\\=false\\]\\/navigation-menu\\:data-\\[state\\=open\\]\\:zoom-in-95 {\n &:is(:where(.group\\/navigation-menu)[data-viewport=\"false\"] *) {\n &[data-state=\"open\"] {\n --tw-enter-scale: calc(95*1%);\n --tw-enter-scale: .95;\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n background-color: var(--sidebar-accent);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground {\n &[data-state=\"open\"] {\n &:hover {\n @media (hover: hover) {\n color: var(--sidebar-accent-foreground);\n }\n }\n }\n }\n .data-\\[state\\=open\\]\\:focus\\:bg-accent {\n &[data-state=\"open\"] {\n &:focus {\n background-color: var(--accent);\n }\n }\n }\n .data-\\[state\\=selected\\]\\:bg-muted {\n &[data-state=\"selected\"] {\n background-color: var(--muted);\n }\n }\n .data-\\[state\\=unchecked\\]\\:translate-x-0 {\n &[data-state=\"unchecked\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[state\\=unchecked\\]\\:bg-input {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n }\n }\n .data-\\[state\\=visible\\]\\:animate-in {\n &[data-state=\"visible\"] {\n animation: enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[state\\=visible\\]\\:fade-in {\n &[data-state=\"visible\"] {\n --tw-enter-opacity: 0;\n }\n }\n .data-\\[swipe\\=cancel\\]\\:translate-x-0 {\n &[data-swipe=\"cancel\"] {\n --tw-translate-x: calc(var(--spacing) * 0);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:translate-x-\\[var\\(--radix-toast-swipe-end-x\\)\\] {\n &[data-swipe=\"end\"] {\n --tw-translate-x: var(--radix-toast-swipe-end-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=end\\]\\:animate-out {\n &[data-swipe=\"end\"] {\n animation: exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,forwards);\n }\n }\n .data-\\[swipe\\=move\\]\\:translate-x-\\[var\\(--radix-toast-swipe-move-x\\)\\] {\n &[data-swipe=\"move\"] {\n --tw-translate-x: var(--radix-toast-swipe-move-x);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .data-\\[swipe\\=move\\]\\:transition-none {\n &[data-swipe=\"move\"] {\n transition-property: none;\n }\n }\n .data-\\[variant\\=destructive\\]\\:text-destructive {\n &[data-variant=\"destructive\"] {\n color: var(--destructive);\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/10 {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 10%, transparent);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:focus\\:text-destructive {\n &[data-variant=\"destructive\"] {\n &:focus {\n color: var(--destructive);\n }\n }\n }\n .data-\\[variant\\=label\\]\\:text-sm {\n &[data-variant=\"label\"] {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .data-\\[variant\\=legend\\]\\:text-base {\n &[data-variant=\"legend\"] {\n font-size: var(--text-base);\n line-height: var(--tw-leading, var(--text-base--line-height));\n }\n }\n .data-\\[variant\\=outline\\]\\:border-l-0 {\n &[data-variant=\"outline\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .data-\\[variant\\=outline\\]\\:shadow-xs {\n &[data-variant=\"outline\"] {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .data-\\[variant\\=outline\\]\\:first\\:border-l {\n &[data-variant=\"outline\"] {\n &:first-child {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24 {\n &[data-vaul-drawer-direction=\"bottom\"] {\n margin-top: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"bottom\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-lg {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-left-radius: var(--radius);\n border-top-right-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t {\n &[data-vaul-drawer-direction=\"bottom\"] {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:left-0 {\n &[data-vaul-drawer-direction=\"left\"] {\n left: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"left\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:border-r {\n &[data-vaul-drawer-direction=\"left\"] {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n inset-block: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:right-0 {\n &[data-vaul-drawer-direction=\"right\"] {\n right: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4 {\n &[data-vaul-drawer-direction=\"right\"] {\n width: calc(3/4 * 100%);\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:border-l {\n &[data-vaul-drawer-direction=\"right\"] {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n inset-inline: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:top-0 {\n &[data-vaul-drawer-direction=\"top\"] {\n top: calc(var(--spacing) * 0);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:mb-24 {\n &[data-vaul-drawer-direction=\"top\"] {\n margin-bottom: calc(var(--spacing) * 24);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\] {\n &[data-vaul-drawer-direction=\"top\"] {\n max-height: 80vh;\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-lg {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-right-radius: var(--radius);\n border-bottom-left-radius: var(--radius);\n }\n }\n .data-\\[vaul-drawer-direction\\=top\\]\\:border-b {\n &[data-vaul-drawer-direction=\"top\"] {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .nth-last-2\\:-mt-1 {\n &:nth-last-child(2) {\n margin-top: calc(var(--spacing) * -1);\n }\n }\n .supports-\\[backdrop-filter\\]\\:bg-background\\/60 {\n @supports (backdrop-filter: var(--tw)) {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 60%, transparent);\n }\n }\n }\n .sm\\:top-auto {\n @media (width >= 40rem) {\n top: auto;\n }\n }\n .sm\\:right-0 {\n @media (width >= 40rem) {\n right: calc(var(--spacing) * 0);\n }\n }\n .sm\\:bottom-0 {\n @media (width >= 40rem) {\n bottom: calc(var(--spacing) * 0);\n }\n }\n .sm\\:col-span-2 {\n @media (width >= 40rem) {\n grid-column: span 2 / span 2;\n }\n }\n .sm\\:block {\n @media (width >= 40rem) {\n display: block;\n }\n }\n .sm\\:flex {\n @media (width >= 40rem) {\n display: flex;\n }\n }\n .sm\\:max-w-\\[600px\\] {\n @media (width >= 40rem) {\n max-width: 600px;\n }\n }\n .sm\\:max-w-lg {\n @media (width >= 40rem) {\n max-width: var(--container-lg);\n }\n }\n .sm\\:max-w-sm {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n .sm\\:grid-cols-2 {\n @media (width >= 40rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .sm\\:flex-col {\n @media (width >= 40rem) {\n flex-direction: column;\n }\n }\n .sm\\:flex-row {\n @media (width >= 40rem) {\n flex-direction: row;\n }\n }\n .sm\\:justify-end {\n @media (width >= 40rem) {\n justify-content: flex-end;\n }\n }\n .sm\\:gap-2\\.5 {\n @media (width >= 40rem) {\n gap: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pr-2\\.5 {\n @media (width >= 40rem) {\n padding-right: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:pl-2\\.5 {\n @media (width >= 40rem) {\n padding-left: calc(var(--spacing) * 2.5);\n }\n }\n .sm\\:text-left {\n @media (width >= 40rem) {\n text-align: left;\n }\n }\n .data-\\[state\\=open\\]\\:sm\\:slide-in-from-bottom-full {\n &[data-state=\"open\"] {\n @media (width >= 40rem) {\n --tw-enter-translate-y: calc(1*100%);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"left\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm {\n &[data-vaul-drawer-direction=\"right\"] {\n @media (width >= 40rem) {\n max-width: var(--container-sm);\n }\n }\n }\n .md\\:absolute {\n @media (width >= 48rem) {\n position: absolute;\n }\n }\n .md\\:-left-24 {\n @media (width >= 48rem) {\n left: calc(var(--spacing) * -24);\n }\n }\n .md\\:col-span-2 {\n @media (width >= 48rem) {\n grid-column: span 2 / span 2;\n }\n }\n .md\\:ml-12 {\n @media (width >= 48rem) {\n margin-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:block {\n @media (width >= 48rem) {\n display: block;\n }\n }\n .md\\:flex {\n @media (width >= 48rem) {\n display: flex;\n }\n }\n .md\\:w-20 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 20);\n }\n }\n .md\\:w-80 {\n @media (width >= 48rem) {\n width: calc(var(--spacing) * 80);\n }\n }\n .md\\:w-\\[var\\(--radix-navigation-menu-viewport-width\\)\\] {\n @media (width >= 48rem) {\n width: var(--radix-navigation-menu-viewport-width);\n }\n }\n .md\\:w-auto {\n @media (width >= 48rem) {\n width: auto;\n }\n }\n .md\\:max-w-\\[420px\\] {\n @media (width >= 48rem) {\n max-width: 420px;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .md\\:grid-cols-3 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .md\\:flex-row {\n @media (width >= 48rem) {\n flex-direction: row;\n }\n }\n .md\\:items-center {\n @media (width >= 48rem) {\n align-items: center;\n }\n }\n .md\\:gap-1\\.5 {\n @media (width >= 48rem) {\n gap: calc(var(--spacing) * 1.5);\n }\n }\n .md\\:p-12 {\n @media (width >= 48rem) {\n padding: calc(var(--spacing) * 12);\n }\n }\n .md\\:px-6 {\n @media (width >= 48rem) {\n padding-inline: calc(var(--spacing) * 6);\n }\n }\n .md\\:pl-12 {\n @media (width >= 48rem) {\n padding-left: calc(var(--spacing) * 12);\n }\n }\n .md\\:text-left {\n @media (width >= 48rem) {\n text-align: left;\n }\n }\n .md\\:text-sm {\n @media (width >= 48rem) {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n .md\\:opacity-0 {\n @media (width >= 48rem) {\n opacity: 0%;\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:m-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin: calc(var(--spacing) * 2);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:ml-0 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n margin-left: calc(var(--spacing) * 0);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:rounded-xl {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n border-radius: calc(var(--radius) + 4px);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:shadow-sm {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n }\n .md\\:peer-data-\\[variant\\=inset\\]\\:peer-data-\\[state\\=collapsed\\]\\:ml-2 {\n @media (width >= 48rem) {\n &:is(:where(.peer)[data-variant=\"inset\"] ~ *) {\n &:is(:where(.peer)[data-state=\"collapsed\"] ~ *) {\n margin-left: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .md\\:after\\:hidden {\n @media (width >= 48rem) {\n &::after {\n content: var(--tw-content);\n display: none;\n }\n }\n }\n .lg\\:col-span-2 {\n @media (width >= 64rem) {\n grid-column: span 2 / span 2;\n }\n }\n .lg\\:grid-cols-2 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-3 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n }\n .lg\\:grid-cols-4 {\n @media (width >= 64rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .xl\\:grid-cols-4 {\n @media (width >= 80rem) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n }\n .\\@md\\/field-group\\:flex-row {\n @container field-group (width >= 28rem) {\n flex-direction: row;\n }\n }\n .\\@md\\/field-group\\:items-center {\n @container field-group (width >= 28rem) {\n align-items: center;\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:items-start {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n align-items: flex-start;\n }\n }\n }\n .dark\\:border-blue-800 {\n &:is(.dark *) {\n border-color: var(--color-blue-800);\n }\n }\n .dark\\:border-blue-800\\/30 {\n &:is(.dark *) {\n border-color: color-mix(in srgb, oklch(42.4% 0.199 265.638) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-blue-800) 30%, transparent);\n }\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:border-pink-800\\/30 {\n &:is(.dark *) {\n border-color: color-mix(in srgb, oklch(45.9% 0.187 3.815) 30%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n border-color: color-mix(in oklab, var(--color-pink-800) 30%, transparent);\n }\n }\n }\n .dark\\:bg-blue-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-blue-950 {\n &:is(.dark *) {\n background-color: var(--color-blue-950);\n }\n }\n .dark\\:bg-blue-950\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(28.2% 0.091 267.935) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-blue-950) 20%, transparent);\n }\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:bg-pink-950\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(28.4% 0.109 3.907) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-pink-950) 20%, transparent);\n }\n }\n }\n .dark\\:bg-transparent {\n &:is(.dark *) {\n background-color: transparent;\n }\n }\n .dark\\:bg-yellow-900\\/20 {\n &:is(.dark *) {\n background-color: color-mix(in srgb, oklch(42.1% 0.095 57.708) 20%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-yellow-900) 20%, transparent);\n }\n }\n }\n .dark\\:bg-yellow-950 {\n &:is(.dark *) {\n background-color: var(--color-yellow-950);\n }\n }\n .dark\\:text-blue-200 {\n &:is(.dark *) {\n color: var(--color-blue-200);\n }\n }\n .dark\\:text-muted-foreground {\n &:is(.dark *) {\n color: var(--muted-foreground);\n }\n }\n .dark\\:text-yellow-200 {\n &:is(.dark *) {\n color: var(--color-yellow-200);\n }\n }\n .dark\\:ring-blue-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-blue-800);\n }\n }\n .dark\\:ring-yellow-800 {\n &:is(.dark *) {\n --tw-ring-color: var(--color-yellow-800);\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:text-accent-foreground {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:has-data-\\[state\\=checked\\]\\:bg-primary\\/10 {\n &:is(.dark *) {\n &:has(*[data-state=\"checked\"]) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n }\n }\n }\n }\n .dark\\:has-\\[\\[data-slot\\]\\[aria-invalid\\=true\\]\\]\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:has(*:is([data-slot][aria-invalid=true])) {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[active\\=true\\]\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[data-active=\"true\"] {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:border-input {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n border-color: var(--input);\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:bg-input\\/30 {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[state\\=active\\]\\:text-foreground {\n &:is(.dark *) {\n &[data-state=\"active\"] {\n color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary);\n }\n }\n }\n .dark\\:data-\\[state\\=checked\\]\\:bg-primary-foreground {\n &:is(.dark *) {\n &[data-state=\"checked\"] {\n background-color: var(--primary-foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-foreground {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--foreground);\n }\n }\n }\n .dark\\:data-\\[state\\=unchecked\\]\\:bg-input\\/80 {\n &:is(.dark *) {\n &[data-state=\"unchecked\"] {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 80%, transparent);\n }\n }\n }\n }\n .dark\\:data-\\[variant\\=destructive\\]\\:focus\\:bg-destructive\\/20 {\n &:is(.dark *) {\n &[data-variant=\"destructive\"] {\n &:focus {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n }\n }\n .\\[\\&_\\.recharts-cartesian-axis-tick_text\\]\\:fill-muted-foreground {\n & .recharts-cartesian-axis-tick text {\n fill: var(--muted-foreground);\n }\n }\n .\\[\\&_\\.recharts-cartesian-grid_line\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border\\/50 {\n & .recharts-cartesian-grid line[stroke='#ccc'] {\n stroke: var(--border);\n @supports (color: color-mix(in lab, red, red)) {\n stroke: color-mix(in oklab, var(--border) 50%, transparent);\n }\n }\n }\n .\\[\\&_\\.recharts-curve\\.recharts-tooltip-cursor\\]\\:stroke-border {\n & .recharts-curve.recharts-tooltip-cursor {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-dot\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-dot[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-layer\\]\\:outline-hidden {\n & .recharts-layer {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-polar-grid_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-polar-grid [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-radial-bar-background-sector\\]\\:fill-muted {\n & .recharts-radial-bar-background-sector {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-rectangle\\.recharts-tooltip-cursor\\]\\:fill-muted {\n & .recharts-rectangle.recharts-tooltip-cursor {\n fill: var(--muted);\n }\n }\n .\\[\\&_\\.recharts-reference-line_\\[stroke\\=\\'\\#ccc\\'\\]\\]\\:stroke-border {\n & .recharts-reference-line [stroke='#ccc'] {\n stroke: var(--border);\n }\n }\n .\\[\\&_\\.recharts-sector\\]\\:outline-hidden {\n & .recharts-sector {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\.recharts-sector\\[stroke\\=\\'\\#fff\\'\\]\\]\\:stroke-transparent {\n & .recharts-sector[stroke='#fff'] {\n stroke: transparent;\n }\n }\n .\\[\\&_\\.recharts-surface\\]\\:outline-hidden {\n & .recharts-surface {\n --tw-outline-style: none;\n outline-style: none;\n @media (forced-colors: active) {\n outline: 2px solid transparent;\n outline-offset: 2px;\n }\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:px-2 {\n & [cmdk-group-heading] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:py-1\\.5 {\n & [cmdk-group-heading] {\n padding-block: calc(var(--spacing) * 1.5);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-xs {\n & [cmdk-group-heading] {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:font-medium {\n & [cmdk-group-heading] {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n }\n .\\[\\&_\\[cmdk-group-heading\\]\\]\\:text-muted-foreground {\n & [cmdk-group-heading] {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\]\\:px-2 {\n & [cmdk-group] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-group\\]\\:not\\(\\[hidden\\]\\)_\\~\\[cmdk-group\\]\\]\\:pt-0 {\n & [cmdk-group]:not([hidden]) ~[cmdk-group] {\n padding-top: calc(var(--spacing) * 0);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:h-5 {\n & [cmdk-input-wrapper] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input-wrapper\\]_svg\\]\\:w-5 {\n & [cmdk-input-wrapper] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-input\\]\\]\\:h-12 {\n & [cmdk-input] {\n height: calc(var(--spacing) * 12);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:px-2 {\n & [cmdk-item] {\n padding-inline: calc(var(--spacing) * 2);\n }\n }\n .\\[\\&_\\[cmdk-item\\]\\]\\:py-3 {\n & [cmdk-item] {\n padding-block: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:h-5 {\n & [cmdk-item] svg {\n height: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_\\[cmdk-item\\]_svg\\]\\:w-5 {\n & [cmdk-item] svg {\n width: calc(var(--spacing) * 5);\n }\n }\n .\\[\\&_img\\]\\:size-full {\n & img {\n width: 100%;\n height: 100%;\n }\n }\n .\\[\\&_img\\]\\:object-cover {\n & img {\n object-fit: cover;\n }\n }\n .\\[\\&_p\\]\\:leading-relaxed {\n & p {\n --tw-leading: var(--leading-relaxed);\n line-height: var(--leading-relaxed);\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-6 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 6);\n height: calc(var(--spacing) * 6);\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground {\n & svg:not([class*='text-']) {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&_tr\\]\\:border-b {\n & tr {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n }\n .\\[\\&_tr\\:last-child\\]\\:border-0 {\n & tr:last-child {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\+\\[data-slot\\=item-content\\]\\]\\:flex-none {\n &+[data-slot=item-content] {\n flex: none;\n }\n }\n .\\[\\&\\:first-child\\[data-selected\\=true\\]_button\\]\\:rounded-l-md {\n &:first-child[data-selected=true] button {\n border-top-left-radius: calc(var(--radius) - 2px);\n border-bottom-left-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\:has\\(\\[role\\=checkbox\\]\\)\\]\\:pr-0 {\n &:has([role=checkbox]) {\n padding-right: calc(var(--spacing) * 0);\n }\n }\n .\\[\\.border-b\\]\\:pb-3 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-3 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_next\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_next>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .rtl\\:\\*\\*\\:\\[\\.rdp-button\\\\_previous\\>svg\\]\\:rotate-180 {\n &:where(:dir(rtl), [dir=\"rtl\"], [dir=\"rtl\"] *) {\n :is(& *) {\n &:is(.rdp-button_previous>svg) {\n rotate: 180deg;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:flex {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n display: flex;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:items-center {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n align-items: center;\n }\n }\n }\n }\n .\\*\\:\\[span\\]\\:last\\:gap-2 {\n :is(& > *) {\n &:is(span) {\n &:last-child {\n gap: calc(var(--spacing) * 2);\n }\n }\n }\n }\n .data-\\[variant\\=destructive\\]\\:\\*\\:\\[svg\\]\\:\\!text-destructive {\n &[data-variant=\"destructive\"] {\n :is(& > *) {\n &:is(svg) {\n color: var(--destructive) !important;\n }\n }\n }\n }\n .\\[\\&\\:last-child\\[data-selected\\=true\\]_button\\]\\:rounded-r-md {\n &:last-child[data-selected=true] button {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n .\\[\\&\\>\\*\\]\\:w-full {\n &>* {\n width: 100%;\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:relative {\n &>* {\n &:focus-visible {\n position: relative;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:focus-visible\\:z-10 {\n &>* {\n &:focus-visible {\n z-index: 10;\n }\n }\n }\n .\\[\\&\\>\\*\\]\\:data-\\[slot\\=field\\]\\:p-4 {\n &>* {\n &[data-slot=\"field\"] {\n padding: calc(var(--spacing) * 4);\n }\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\*\\]\\:w-auto {\n @container field-group (width >= 28rem) {\n &>* {\n width: auto;\n }\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-t-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:rounded-l-none {\n &>*:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-t-0 {\n &>*:not(:first-child) {\n border-top-style: var(--tw-border-style);\n border-top-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:first-child\\)\\]\\:border-l-0 {\n &>*:not(:first-child) {\n border-left-style: var(--tw-border-style);\n border-left-width: 0px;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-r-none {\n &>*:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n .\\[\\&\\>\\*\\:not\\(\\:last-child\\)\\]\\:rounded-b-none {\n &>*:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n .\\[\\&\\>\\.sr-only\\]\\:w-auto {\n &>.sr-only {\n width: auto;\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-group\\]\\]\\:gap-4 {\n &>[data-slot=field-group] {\n gap: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n .\\@md\\/field-group\\:\\[\\&\\>\\[data-slot\\=field-label\\]\\]\\:flex-auto {\n @container field-group (width >= 28rem) {\n &>[data-slot=field-label] {\n flex: auto;\n }\n }\n }\n .has-\\[select\\[aria-hidden\\=true\\]\\:last-child\\]\\:\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:last-of-type\\]\\:rounded-r-md {\n &:has(*:is(select[aria-hidden=true]:last-child)) {\n &>[data-slot=select-trigger]:last-of-type {\n border-top-right-radius: calc(var(--radius) - 2px);\n border-bottom-right-radius: calc(var(--radius) - 2px);\n }\n }\n }\n .\\[\\&\\>\\[data-slot\\=select-trigger\\]\\:not\\(\\[class\\*\\=\\'w-\\'\\]\\)\\]\\:w-fit {\n &>[data-slot=select-trigger]:not([class*='w-']) {\n width: fit-content;\n }\n }\n .\\[\\&\\>\\[role\\=checkbox\\]\\]\\:translate-y-\\[2px\\] {\n &>[role=checkbox] {\n --tw-translate-y: 2px;\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n .\\@md\\/field-group\\:has-\\[\\>\\[data-slot\\=field-content\\]\\]\\:\\[\\&\\>\\[role\\=checkbox\\]\\,\\[role\\=radio\\]\\]\\:mt-px {\n @container field-group (width >= 28rem) {\n &:has(>[data-slot=field-content]) {\n &>[role=checkbox],[role=radio] {\n margin-top: 1px;\n }\n }\n }\n }\n .\\[\\&\\>a\\]\\:underline {\n &>a {\n text-decoration-line: underline;\n }\n }\n .\\[\\&\\>a\\]\\:underline-offset-4 {\n &>a {\n text-underline-offset: 4px;\n }\n }\n .\\[\\&\\>a\\:hover\\]\\:text-primary {\n &>a:hover {\n color: var(--primary);\n }\n }\n .\\[\\&\\>button\\]\\:hidden {\n &>button {\n display: none;\n }\n }\n .\\[\\&\\>input\\]\\:flex-1 {\n &>input {\n flex: 1;\n }\n }\n .has-\\[\\>\\[data-align\\=block-end\\]\\]\\:\\[\\&\\>input\\]\\:pt-3 {\n &:has(>[data-align=block-end]) {\n &>input {\n padding-top: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=block-start\\]\\]\\:\\[\\&\\>input\\]\\:pb-3 {\n &:has(>[data-align=block-start]) {\n &>input {\n padding-bottom: calc(var(--spacing) * 3);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-end\\]\\]\\:\\[\\&\\>input\\]\\:pr-2 {\n &:has(>[data-align=inline-end]) {\n &>input {\n padding-right: calc(var(--spacing) * 2);\n }\n }\n }\n .has-\\[\\>\\[data-align\\=inline-start\\]\\]\\:\\[\\&\\>input\\]\\:pl-2 {\n &:has(>[data-align=inline-start]) {\n &>input {\n padding-left: calc(var(--spacing) * 2);\n }\n }\n }\n .\\[\\&\\>kbd\\]\\:rounded-\\[calc\\(var\\(--radius\\)-5px\\)\\] {\n &>kbd {\n border-radius: calc(var(--radius) - 5px);\n }\n }\n .\\[\\&\\>span\\]\\:text-xs {\n &>span {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n }\n .\\[\\&\\>span\\]\\:opacity-70 {\n &>span {\n opacity: 70%;\n }\n }\n .\\[\\&\\>span\\:last-child\\]\\:truncate {\n &>span:last-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n .\\[\\&\\>svg\\]\\:pointer-events-none {\n &>svg {\n pointer-events: none;\n }\n }\n .\\[\\&\\>svg\\]\\:size-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:size-3\\.5 {\n &>svg {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\]\\:size-4 {\n &>svg {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>svg\\]\\:h-2\\.5 {\n &>svg {\n height: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:h-3 {\n &>svg {\n height: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:w-2\\.5 {\n &>svg {\n width: calc(var(--spacing) * 2.5);\n }\n }\n .\\[\\&\\>svg\\]\\:w-3 {\n &>svg {\n width: calc(var(--spacing) * 3);\n }\n }\n .\\[\\&\\>svg\\]\\:shrink-0 {\n &>svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&\\>svg\\]\\:translate-y-0\\.5 {\n &>svg {\n --tw-translate-y: calc(var(--spacing) * 0.5);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n }\n .\\[\\&\\>svg\\]\\:text-current {\n &>svg {\n color: currentcolor;\n }\n }\n .\\[\\&\\>svg\\]\\:text-muted-foreground {\n &>svg {\n color: var(--muted-foreground);\n }\n }\n .\\[\\&\\>svg\\]\\:text-sidebar-accent-foreground {\n &>svg {\n color: var(--sidebar-accent-foreground);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 3.5);\n height: calc(var(--spacing) * 3.5);\n }\n }\n .\\[\\&\\>svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n &>svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\>tr\\]\\:last\\:border-b-0 {\n &>tr {\n &:last-child {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 0px;\n }\n }\n }\n .\\[\\&\\[data-panel-group-direction\\=vertical\\]\\>div\\]\\:rotate-90 {\n &[data-panel-group-direction=vertical]>div {\n rotate: 90deg;\n }\n }\n .\\[\\&\\[data-state\\=open\\]\\>svg\\]\\:rotate-180 {\n &[data-state=open]>svg {\n rotate: 180deg;\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-right-2 {\n [data-side=left][data-collapsible=offcanvas] & {\n right: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=left\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-e-resize {\n [data-side=left][data-state=collapsed] & {\n cursor: e-resize;\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-collapsible\\=offcanvas\\]_\\&\\]\\:-left-2 {\n [data-side=right][data-collapsible=offcanvas] & {\n left: calc(var(--spacing) * -2);\n }\n }\n .\\[\\[data-side\\=right\\]\\[data-state\\=collapsed\\]_\\&\\]\\:cursor-w-resize {\n [data-side=right][data-state=collapsed] & {\n cursor: w-resize;\n }\n }\n .\\[\\[data-slot\\=card-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=card-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=popover-content\\]_\\&\\]\\:bg-transparent {\n [data-slot=popover-content] & {\n background-color: transparent;\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20 {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 20%, transparent);\n }\n }\n }\n .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background {\n [data-slot=tooltip-content] & {\n color: var(--background);\n }\n }\n .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10 {\n &:is(.dark *) {\n [data-slot=tooltip-content] & {\n background-color: var(--background);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--background) 10%, transparent);\n }\n }\n }\n }\n .\\[\\[data-variant\\=legend\\]\\+\\&\\]\\:-mt-1\\.5 {\n [data-variant=legend]+& {\n margin-top: calc(var(--spacing) * -1.5);\n }\n }\n .\\[a\\&\\]\\:transition-colors {\n a& {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-accent\\/50 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-destructive\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-primary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:bg-secondary\\/90 {\n a& {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 90%, transparent);\n }\n }\n }\n }\n }\n .\\[a\\&\\]\\:hover\\:text-accent-foreground {\n a& {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: forwards;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(0.97 0.01 90);\n --foreground: oklch(0.2 0.02 265);\n --card: oklch(0.98 0.005 90);\n --card-foreground: oklch(0.2 0.02 265);\n --popover: oklch(0.98 0.005 90);\n --popover-foreground: oklch(0.2 0.02 265);\n --primary: oklch(0.45 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.85 0.05 85);\n --secondary-foreground: oklch(0.3 0.05 50);\n --muted: oklch(0.92 0.01 90);\n --muted-foreground: oklch(0.45 0.02 265);\n --accent: oklch(0.94 0.02 85);\n --accent-foreground: oklch(0.3 0.05 50);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.88 0.01 90);\n --input: oklch(0.88 0.01 90);\n --ring: oklch(0.45 0.15 25);\n --radius: 0.5rem;\n --sidebar: oklch(0.96 0.01 90);\n --sidebar-foreground: oklch(0.25 0.02 265);\n --sidebar-primary: oklch(0.45 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.93 0.01 90);\n --sidebar-accent-foreground: oklch(0.25 0.02 265);\n --sidebar-border: oklch(0.88 0.01 90);\n --sidebar-ring: oklch(0.45 0.15 25);\n --chart-1: oklch(0.45 0.15 25);\n --chart-2: oklch(0.65 0.12 50);\n --chart-3: oklch(0.35 0.08 200);\n --chart-4: oklch(0.55 0.05 265);\n --chart-5: oklch(0.75 0.1 85);\n}\n.dark {\n --background: oklch(0.12 0.01 265);\n --foreground: oklch(0.95 0.01 90);\n --card: oklch(0.15 0.01 265);\n --card-foreground: oklch(0.95 0.01 90);\n --popover: oklch(0.15 0.01 265);\n --popover-foreground: oklch(0.95 0.01 90);\n --primary: oklch(0.6 0.15 25);\n --primary-foreground: oklch(0.98 0.01 90);\n --secondary: oklch(0.3 0.05 50);\n --secondary-foreground: oklch(0.9 0.05 85);\n --muted: oklch(0.2 0.01 265);\n --muted-foreground: oklch(0.65 0.01 265);\n --accent: oklch(0.2 0.02 265);\n --accent-foreground: oklch(0.95 0.01 90);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.98 0 0);\n --border: oklch(0.25 0.01 265);\n --input: oklch(0.25 0.01 265);\n --ring: oklch(0.6 0.15 25);\n --sidebar: oklch(0.14 0.01 265);\n --sidebar-foreground: oklch(0.95 0.01 90);\n --sidebar-primary: oklch(0.6 0.15 25);\n --sidebar-primary-foreground: oklch(0.98 0.01 90);\n --sidebar-accent: oklch(0.2 0.01 265);\n --sidebar-accent-foreground: oklch(0.95 0.01 90);\n --sidebar-border: oklch(0.25 0.01 265);\n --sidebar-ring: oklch(0.6 0.15 25);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-family: \"Songti SC\", \"STSong\", \"SimSun\", \"Times New Roman\", serif;\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-space-x-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-gradient-position {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-via {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-to {\n syntax: \"\";\n inherits: false;\n initial-value: #0000;\n}\n@property --tw-gradient-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-via-stops {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-gradient-from-position {\n syntax: \"\";\n inherits: false;\n initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n syntax: \"\";\n inherits: false;\n initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ordinal {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-slashed-zero {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-figure {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-spacing {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-numeric-fraction {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-backdrop-blur {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-brightness {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-contrast {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-grayscale {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-invert {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-opacity {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-saturate {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-backdrop-sepia {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-content {\n syntax: \"*\";\n initial-value: \"\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity,1);\n transform: translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity,1);\n transform: translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))));\n }\n to {\n height: 0;\n }\n}\n@keyframes caret-blink {\n 0%,70%,100% {\n opacity: 1;\n }\n 20%,50% {\n opacity: 0;\n }\n}\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-space-x-reverse: 0;\n --tw-border-style: solid;\n --tw-gradient-position: initial;\n --tw-gradient-from: #0000;\n --tw-gradient-via: #0000;\n --tw-gradient-to: #0000;\n --tw-gradient-stops: initial;\n --tw-gradient-via-stops: initial;\n --tw-gradient-from-position: 0%;\n --tw-gradient-via-position: 50%;\n --tw-gradient-to-position: 100%;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-ordinal: initial;\n --tw-slashed-zero: initial;\n --tw-numeric-figure: initial;\n --tw-numeric-spacing: initial;\n --tw-numeric-fraction: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-backdrop-blur: initial;\n --tw-backdrop-brightness: initial;\n --tw-backdrop-contrast: initial;\n --tw-backdrop-grayscale: initial;\n --tw-backdrop-hue-rotate: initial;\n --tw-backdrop-invert: initial;\n --tw-backdrop-opacity: initial;\n --tw-backdrop-saturate: initial;\n --tw-backdrop-sepia: initial;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-content: \"\";\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: forwards;\n --tw-animation-iteration-count: 1;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}\n"],"names":[],"mappings":"AACA;EA62ME;IACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA72MJ;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFF;EA6GE;;;;;;;EAAA;;;;;;;EAMA;;;;;;;;;;EASA;;;;;;EAKA;;;;;EAIA;;;;;EAIA;;;;;;;EAKA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;;;;;;;EAAA;;;;;;;;;;;EAUA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;IACE;;;;IAEE;MAAgD;;;;;;EAKpD;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAAA;;;;EAGA;;;;EAyxLA;;;;;EAGE;IAAgD;;;;;EAIlD;;;;;EAIA;;;;;;;AAhiMF;;AAAA;EAiQE;;;;EAIA;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;;;;;;EAWA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAGzB;IAAyB;;;;;EAI3B;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;;EAMA;;;;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAMA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAIE;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAMF;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;;EAKA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;;EAIA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;;;EAKA;;;;;;EAKA;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAEE;IAAgD;;;;;EAG5B;;;;EAEtB;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;;EAIA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAEE;IAAgD;;;;;EAIlD;;;;EAGA;;;;EAGA;;;;EAGA;;;;EAG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"}}] } \ No newline at end of file diff --git a/.next/dev/static/development/_buildManifest.js b/.next/dev/static/development/_buildManifest.js index a11039da..94ca9144 100644 --- a/.next/dev/static/development/_buildManifest.js +++ b/.next/dev/static/development/_buildManifest.js @@ -1,7 +1,4 @@ self.__BUILD_MANIFEST = { - "/_error": [ - "static/chunks/pages/_error.js" - ], "__rewrites": { "afterFiles": [], "beforeFiles": [], diff --git a/.next/dev/trace b/.next/dev/trace index 330440bb..46c1d782 100644 --- a/.next/dev/trace +++ b/.next/dev/trace @@ -194,3 +194,21 @@ [{"name":"memory-usage","duration":5,"timestamp":115859249323,"id":12167,"parentId":12164,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"8972177408","memory.heapUsed":"6669030440","memory.heapTotal":"6871232512"},"startTime":1763885438117,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":190000,"timestamp":115883246681,"id":12168,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/relationship-test","isPageHidden":true},"startTime":1763885462330,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":188000,"timestamp":115883245793,"id":12169,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763885462330,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":193000,"timestamp":115883246213,"id":12170,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763885462375,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":167,"timestamp":115909528620,"id":12171,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators"},"startTime":1763885488395,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":121,"timestamp":115909528811,"id":12172,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators"},"startTime":1763885488395,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":152,"timestamp":115909529359,"id":12173,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators"},"startTime":1763885488396,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":129,"timestamp":115909529527,"id":12174,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators"},"startTime":1763885488396,"traceId":"96837134d747a51b"},{"name":"compile-path","duration":225208,"timestamp":115909530929,"id":12177,"tags":{"trigger":"/api/trees/[treeId]/collaborators"},"startTime":1763885488397,"traceId":"96837134d747a51b"}] [{"name":"handle-request","duration":1050248,"timestamp":115909530308,"id":12175,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators"},"startTime":1763885488397,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":115910580732,"id":12178,"parentId":12175,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/collaborators","memory.rss":"8975761408","memory.heapUsed":"6667631416","memory.heapTotal":"6859509760"},"startTime":1763885489447,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":9930,"timestamp":115919033832,"id":12180,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885497900,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":979047,"timestamp":115919033343,"id":12179,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885497899,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":10,"timestamp":115920012814,"id":12181,"parentId":12179,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9050058752","memory.heapUsed":"6729343760","memory.heapTotal":"6947438592"},"startTime":1763885498879,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":214,"timestamp":115920358957,"id":12182,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499225,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":128,"timestamp":115920359191,"id":12183,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499225,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":982,"timestamp":115920360797,"id":12184,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499227,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":647,"timestamp":115920361902,"id":12185,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499228,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3532,"timestamp":115920370819,"id":12187,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885499237,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":34911,"timestamp":115920369963,"id":12186,"tags":{"url":"/api/auth/session"},"startTime":1763885499236,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":20,"timestamp":115920405361,"id":12188,"parentId":12186,"tags":{"url":"/api/auth/session","memory.rss":"9052979200","memory.heapUsed":"6739249968","memory.heapTotal":"6949539840"},"startTime":1763885499271,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":254,"timestamp":115920436960,"id":12189,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499303,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":191,"timestamp":115920437253,"id":12190,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499303,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":511,"timestamp":115920438654,"id":12191,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885499305,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":320,"timestamp":115920439234,"id":12192,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885499305,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":389,"timestamp":115920440514,"id":12193,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499307,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":312,"timestamp":115920440967,"id":12194,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499307,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1096,"timestamp":115920446503,"id":12195,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885499313,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":551,"timestamp":115920447662,"id":12196,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885499314,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3607,"timestamp":115920450495,"id":12198,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885499317,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":27756,"timestamp":115920453469,"id":12200,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763885499319,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":52323,"timestamp":115920449670,"id":12197,"tags":{"url":"/api/auth/session"},"startTime":1763885499316,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":15,"timestamp":115920502541,"id":12201,"parentId":12197,"tags":{"url":"/api/auth/session","memory.rss":"9058168832","memory.heapUsed":"6733731552","memory.heapTotal":"6953996288"},"startTime":1763885499369,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":476,"timestamp":115920516408,"id":12202,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499382,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":383,"timestamp":115920516953,"id":12203,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499383,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":67183,"timestamp":115920453068,"id":12199,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885499319,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":115920520453,"id":12204,"parentId":12199,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9058213888","memory.heapUsed":"6734364216","memory.heapTotal":"6953996288"},"startTime":1763885499386,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":285,"timestamp":115920522281,"id":12205,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499388,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":218,"timestamp":115920522596,"id":12206,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885499389,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":239,"timestamp":115920528992,"id":12209,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885499395,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":139,"timestamp":115920529252,"id":12210,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885499395,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1990,"timestamp":115920527853,"id":12208,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885499394,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":272,"timestamp":115920537574,"id":12211,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885499404,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":277,"timestamp":115920537879,"id":12212,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885499404,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":15899,"timestamp":115920527035,"id":12207,"tags":{"url":"/api/auth/session"},"startTime":1763885499393,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":115920543215,"id":12213,"parentId":12207,"tags":{"url":"/api/auth/session","memory.rss":"9058488320","memory.heapUsed":"6735848896","memory.heapTotal":"6953996288"},"startTime":1763885499409,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":552,"timestamp":115920544165,"id":12215,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885499410,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":27411,"timestamp":115920543652,"id":12214,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885499410,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":115920571306,"id":12216,"parentId":12214,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9058725888","memory.heapUsed":"6737480792","memory.heapTotal":"6953996288"},"startTime":1763885499437,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":421,"timestamp":115920677589,"id":12218,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885499544,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":427,"timestamp":115920688302,"id":12219,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499554,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":198,"timestamp":115920688757,"id":12220,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499555,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":14019,"timestamp":115920677340,"id":12217,"tags":{"url":"/api/trees"},"startTime":1763885499543,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":115920691622,"id":12221,"parentId":12217,"tags":{"url":"/api/trees","memory.rss":"9058979840","memory.heapUsed":"6739076472","memory.heapTotal":"6954258432"},"startTime":1763885499558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":221,"timestamp":115920692049,"id":12222,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":165,"timestamp":115920692290,"id":12223,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":866,"timestamp":115920694011,"id":12225,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885499560,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":7918,"timestamp":115920694480,"id":12227,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885499560,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":36735,"timestamp":115920694245,"id":12226,"tags":{"url":"/api/trees"},"startTime":1763885499560,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":115920731259,"id":12228,"parentId":12226,"tags":{"url":"/api/trees","memory.rss":"9059397632","memory.heapUsed":"6741224416","memory.heapTotal":"6954520576"},"startTime":1763885499597,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":43631,"timestamp":115920693438,"id":12224,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885499559,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":115920737222,"id":12229,"parentId":12224,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9059409920","memory.heapUsed":"6741445128","memory.heapTotal":"6954782720"},"startTime":1763885499603,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":212,"timestamp":115920738725,"id":12230,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499605,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":291,"timestamp":115920738958,"id":12231,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499605,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":501,"timestamp":115920741845,"id":12232,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499608,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":218,"timestamp":115920742381,"id":12233,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885499608,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1411,"timestamp":115920743766,"id":12235,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885499610,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":29219,"timestamp":115920743424,"id":12234,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885499609,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":14,"timestamp":115920773350,"id":12236,"parentId":12234,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9059643392","memory.heapUsed":"6742790424","memory.heapTotal":"6954782720"},"startTime":1763885499639,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":804,"timestamp":115953276728,"id":12238,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885532142,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":20662,"timestamp":115953275338,"id":12237,"tags":{"url":"/api/trees"},"startTime":1763885532140,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":115953296189,"id":12239,"parentId":12237,"tags":{"url":"/api/trees","memory.rss":"9059872768","memory.heapUsed":"6744161592","memory.heapTotal":"6955044864"},"startTime":1763885532161,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":10804,"timestamp":115970764547,"id":12241,"parentId":3,"tags":{"inputPage":"/relationship/page"},"startTime":1763885549629,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":40774,"timestamp":115970764137,"id":12240,"tags":{"url":"/relationship?_rsc=vusbg"},"startTime":1763885549628,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":115970805138,"id":12242,"parentId":12240,"tags":{"url":"/relationship?_rsc=vusbg","memory.rss":"9061933056","memory.heapUsed":"6737812912","memory.heapTotal":"6930403328"},"startTime":1763885549669,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":591,"timestamp":115970833630,"id":12244,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885549698,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":11244,"timestamp":115970833216,"id":12243,"tags":{"url":"/api/trees"},"startTime":1763885549698,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":115970844600,"id":12245,"parentId":12243,"tags":{"url":"/api/trees","memory.rss":"9062166528","memory.heapUsed":"6739336944","memory.heapTotal":"6930403328"},"startTime":1763885549709,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":187,"timestamp":115971417489,"id":12246,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885550282,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":156,"timestamp":115971417695,"id":12247,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885550282,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":129,"timestamp":115971418812,"id":12248,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885550283,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":104,"timestamp":115971418953,"id":12249,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885550283,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":568,"timestamp":115971420332,"id":12251,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885550285,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":24680,"timestamp":115971419959,"id":12250,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885550284,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":115971444880,"id":12252,"parentId":12250,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9062502400","memory.heapUsed":"6739015280","memory.heapTotal":"6940364800"},"startTime":1763885550309,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":663,"timestamp":115971447970,"id":12254,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885550312,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":16286,"timestamp":115971447712,"id":12253,"tags":{"url":"/api/trees"},"startTime":1763885550312,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":115971464280,"id":12255,"parentId":12253,"tags":{"url":"/api/trees","memory.rss":"9062506496","memory.heapUsed":"6740408280","memory.heapTotal":"6940364800"},"startTime":1763885550329,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":607,"timestamp":115971467057,"id":12257,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885550331,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":12731,"timestamp":115971466751,"id":12256,"tags":{"url":"/api/trees"},"startTime":1763885550331,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":115971479713,"id":12258,"parentId":12256,"tags":{"url":"/api/trees","memory.rss":"9062506496","memory.heapUsed":"6741456544","memory.heapTotal":"6940364800"},"startTime":1763885550344,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":484,"timestamp":115973358291,"id":12260,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885552223,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":147,"timestamp":115973363918,"id":12261,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552228,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":103,"timestamp":115973364081,"id":12262,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552228,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":115,"timestamp":115973365095,"id":12263,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552229,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":99,"timestamp":115973365222,"id":12264,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552229,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":466,"timestamp":115973366080,"id":12266,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885552230,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18720,"timestamp":115973358026,"id":12259,"tags":{"url":"/api/trees"},"startTime":1763885552222,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":115973377026,"id":12267,"parentId":12259,"tags":{"url":"/api/trees","memory.rss":"9062531072","memory.heapUsed":"6743730472","memory.heapTotal":"6940626944"},"startTime":1763885552241,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1816,"timestamp":115973385398,"id":12269,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885552250,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":26778,"timestamp":115973365709,"id":12265,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885552230,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":17,"timestamp":115973392704,"id":12270,"parentId":12265,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9062531072","memory.heapUsed":"6741682936","memory.heapTotal":"6931714048"},"startTime":1763885552257,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":187,"timestamp":115973396483,"id":12271,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552261,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":125,"timestamp":115973396689,"id":12272,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552261,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":367,"timestamp":115973400166,"id":12273,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552264,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":202,"timestamp":115973400566,"id":12274,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885552265,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2623,"timestamp":115973484037,"id":12276,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885552348,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":107492,"timestamp":115973385113,"id":12268,"tags":{"url":"/api/trees"},"startTime":1763885552249,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":115973492852,"id":12277,"parentId":12268,"tags":{"url":"/api/trees","memory.rss":"9062531072","memory.heapUsed":"6742170184","memory.heapTotal":"6935121920"},"startTime":1763885552357,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":107766,"timestamp":115973402443,"id":12275,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885552267,"traceId":"96837134d747a51b"}] [{"name":"memory-usage","duration":6,"timestamp":115973511391,"id":12278,"parentId":12275,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9062531072","memory.heapUsed":"6742672296","memory.heapTotal":"6935121920"},"startTime":1763885552376,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1580,"timestamp":115985387768,"id":12280,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885564252,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":195,"timestamp":115985497438,"id":12281,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885564361,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":109,"timestamp":115985497652,"id":12282,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885564361,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":113,"timestamp":115985498342,"id":12283,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885564362,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":95,"timestamp":115985498467,"id":12284,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885564362,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":116567,"timestamp":115985387426,"id":12279,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885564251,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":115985504123,"id":12285,"parentId":12279,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9062539264","memory.heapUsed":"6744636424","memory.heapTotal":"6935908352"},"startTime":1763885564368,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1162,"timestamp":115990847354,"id":12287,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885569711,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":27191,"timestamp":115990846971,"id":12286,"tags":{"url":"/api/trees"},"startTime":1763885569711,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":10,"timestamp":115990874735,"id":12288,"parentId":12286,"tags":{"url":"/api/trees","memory.rss":"9062547456","memory.heapUsed":"6746247976","memory.heapTotal":"6939578368"},"startTime":1763885569738,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":88000,"timestamp":116036986423,"id":12289,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763885615965,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":93000,"timestamp":116036986493,"id":12290,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/relationship-test","isPageHidden":true},"startTime":1763885615965,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":107000,"timestamp":116036986475,"id":12291,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763885616075,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1269,"timestamp":116040945312,"id":12293,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885619797,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":16652,"timestamp":116040945026,"id":12292,"tags":{"url":"/api/trees"},"startTime":1763885619797,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116040961901,"id":12294,"parentId":12292,"tags":{"url":"/api/trees","memory.rss":"9066975232","memory.heapUsed":"6747115008","memory.heapTotal":"6937337856"},"startTime":1763885619814,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1970,"timestamp":116045092809,"id":12296,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885623944,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":58467,"timestamp":116045080749,"id":12295,"tags":{"url":"/api/trees"},"startTime":1763885623932,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":11,"timestamp":116045140100,"id":12297,"parentId":12295,"tags":{"url":"/api/trees","memory.rss":"9066979328","memory.heapUsed":"6747750488","memory.heapTotal":"6937600000"},"startTime":1763885623992,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":520,"timestamp":116082657623,"id":12299,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885661507,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":22209,"timestamp":116082657304,"id":12298,"tags":{"url":"/api/trees"},"startTime":1763885661507,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":24,"timestamp":116082680202,"id":12300,"parentId":12298,"tags":{"url":"/api/trees","memory.rss":"9066905600","memory.heapUsed":"6748187688","memory.heapTotal":"6939172864"},"startTime":1763885661530,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3502,"timestamp":116097523422,"id":12302,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885676372,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":17988,"timestamp":116097523101,"id":12301,"tags":{"url":"/api/trees"},"startTime":1763885676372,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116097541275,"id":12303,"parentId":12301,"tags":{"url":"/api/trees","memory.rss":"9066909696","memory.heapUsed":"6748807080","memory.heapTotal":"6938386432"},"startTime":1763885676390,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":155000,"timestamp":116123318614,"id":12304,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/relationship-test","isPageHidden":true},"startTime":1763885702360,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":149000,"timestamp":116123317675,"id":12305,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763885702361,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":157000,"timestamp":116123318074,"id":12306,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763885702388,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":5556,"timestamp":116129910607,"id":12308,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885708758,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":24426,"timestamp":116129910215,"id":12307,"tags":{"url":"/api/trees"},"startTime":1763885708758,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":9,"timestamp":116129935228,"id":12309,"parentId":12307,"tags":{"url":"/api/trees","memory.rss":"9068097536","memory.heapUsed":"6750000488","memory.heapTotal":"6939553792"},"startTime":1763885708783,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":35008,"timestamp":116129981427,"id":12311,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885708829,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":991844,"timestamp":116129980845,"id":12310,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885708828,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":18,"timestamp":116130973131,"id":12312,"parentId":12310,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9136164864","memory.heapUsed":"6811037280","memory.heapTotal":"7030091776"},"startTime":1763885709821,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":623,"timestamp":116131392678,"id":12313,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710240,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":400,"timestamp":116131393374,"id":12314,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710241,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":373,"timestamp":116131402804,"id":12315,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710250,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":686,"timestamp":116131403264,"id":12316,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710251,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2029,"timestamp":116131411296,"id":12318,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885710259,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":30282,"timestamp":116131410299,"id":12317,"tags":{"url":"/api/auth/session"},"startTime":1763885710258,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":17,"timestamp":116131440843,"id":12319,"parentId":12317,"tags":{"url":"/api/auth/session","memory.rss":"9137500160","memory.heapUsed":"6819439840","memory.heapTotal":"7030091776"},"startTime":1763885710288,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":544,"timestamp":116131457515,"id":12320,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710305,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":193,"timestamp":116131458084,"id":12321,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710306,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":357,"timestamp":116131468302,"id":12322,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710316,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":201,"timestamp":116131468687,"id":12323,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710316,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":438,"timestamp":116131473413,"id":12324,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885710321,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":390,"timestamp":116131473911,"id":12325,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885710321,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":356,"timestamp":116131481323,"id":12328,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885710329,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":180,"timestamp":116131481724,"id":12329,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885710329,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3560,"timestamp":116131479219,"id":12327,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885710327,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2854,"timestamp":116131510843,"id":12331,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763885710358,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":54539,"timestamp":116131478183,"id":12326,"tags":{"url":"/api/auth/session"},"startTime":1763885710326,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":14,"timestamp":116131532938,"id":12332,"parentId":12326,"tags":{"url":"/api/auth/session","memory.rss":"9142607872","memory.heapUsed":"6813498536","memory.heapTotal":"7034286080"},"startTime":1763885710381,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":210,"timestamp":116131541631,"id":12333,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710389,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":134,"timestamp":116131541861,"id":12334,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710389,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":299,"timestamp":116131542871,"id":12335,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710390,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":172,"timestamp":116131543207,"id":12336,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885710391,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":36120,"timestamp":116131510035,"id":12330,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885710358,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116131546360,"id":12339,"parentId":12330,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9142665216","memory.heapUsed":"6814210768","memory.heapTotal":"7034286080"},"startTime":1763885710394,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2838,"timestamp":116131544411,"id":12338,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885710392,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":15045,"timestamp":116131544056,"id":12337,"tags":{"url":"/api/auth/session"},"startTime":1763885710392,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116131559272,"id":12340,"parentId":12337,"tags":{"url":"/api/auth/session","memory.rss":"9142857728","memory.heapUsed":"6815018152","memory.heapTotal":"7034286080"},"startTime":1763885710407,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":346,"timestamp":116131602815,"id":12341,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885710450,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":187,"timestamp":116131603214,"id":12342,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885710451,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":914,"timestamp":116131607462,"id":12343,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885710455,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":339,"timestamp":116131608409,"id":12344,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885710456,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1045,"timestamp":116131610423,"id":12346,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885710458,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":23794,"timestamp":116131609874,"id":12345,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885710457,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116131633826,"id":12347,"parentId":12345,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9143156736","memory.heapUsed":"6817238400","memory.heapTotal":"7034286080"},"startTime":1763885710481,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":625,"timestamp":116131721486,"id":12349,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885710569,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":16336,"timestamp":116131721049,"id":12348,"tags":{"url":"/api/trees"},"startTime":1763885710569,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116131737533,"id":12350,"parentId":12348,"tags":{"url":"/api/trees","memory.rss":"9143406592","memory.heapUsed":"6818461824","memory.heapTotal":"7034548224"},"startTime":1763885710585,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":185,"timestamp":116131737911,"id":12351,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710585,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":112,"timestamp":116131738111,"id":12352,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710586,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":248,"timestamp":116131739992,"id":12353,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710588,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":239,"timestamp":116131740271,"id":12354,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710588,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":622,"timestamp":116131741290,"id":12356,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885710589,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1216,"timestamp":116131746288,"id":12358,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885710594,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":36038,"timestamp":116131741006,"id":12355,"tags":{"url":"/api/trees"},"startTime":1763885710589,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":23,"timestamp":116131778365,"id":12359,"parentId":12355,"tags":{"url":"/api/trees","memory.rss":"9143836672","memory.heapUsed":"6820718040","memory.heapTotal":"7035072512"},"startTime":1763885710626,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":40946,"timestamp":116131745857,"id":12357,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885710593,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116131787100,"id":12360,"parentId":12357,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9143848960","memory.heapUsed":"6820945376","memory.heapTotal":"7035072512"},"startTime":1763885710635,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":601,"timestamp":116131794574,"id":12361,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710642,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":661,"timestamp":116131795235,"id":12362,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710643,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":476,"timestamp":116131797701,"id":12363,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710645,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":213,"timestamp":116131798225,"id":12364,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885710646,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1671,"timestamp":116131800207,"id":12366,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885710648,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":29816,"timestamp":116131799592,"id":12365,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885710647,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":13,"timestamp":116131830237,"id":12367,"parentId":12365,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9144078336","memory.heapUsed":"6822284696","memory.heapTotal":"7035334656"},"startTime":1763885710678,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1277,"timestamp":116141347993,"id":12369,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885720195,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":73355,"timestamp":116141347550,"id":12368,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720195,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116141421105,"id":12370,"parentId":12368,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9147600896","memory.heapUsed":"6818992752","memory.heapTotal":"7038218240"},"startTime":1763885720268,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":423,"timestamp":116141611077,"id":12371,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720458,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":443,"timestamp":116141611545,"id":12372,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720459,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":340,"timestamp":116141615994,"id":12373,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720463,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":343,"timestamp":116141616396,"id":12374,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720464,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2206,"timestamp":116141620991,"id":12376,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885720468,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18034,"timestamp":116141620649,"id":12375,"tags":{"url":"/api/auth/session"},"startTime":1763885720468,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116141638915,"id":12377,"parentId":12375,"tags":{"url":"/api/auth/session","memory.rss":"9151741952","memory.heapUsed":"6829000704","memory.heapTotal":"7041892352"},"startTime":1763885720486,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":321,"timestamp":116141652957,"id":12378,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720500,"traceId":"96837134d747a51b"}] +[{"name":"ensure-page","duration":557,"timestamp":116141653984,"id":12379,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720501,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":208,"timestamp":116141657215,"id":12380,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720504,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":233,"timestamp":116141657444,"id":12381,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720505,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":132,"timestamp":116141657963,"id":12382,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720505,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":118,"timestamp":116141658107,"id":12383,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720505,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":504,"timestamp":116141659515,"id":12384,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720507,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":301,"timestamp":116141660084,"id":12385,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720507,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":879,"timestamp":116141661280,"id":12387,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885720508,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":4869,"timestamp":116141672151,"id":12389,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763885720519,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":28062,"timestamp":116141660942,"id":12386,"tags":{"url":"/api/auth/session"},"startTime":1763885720508,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116141689171,"id":12390,"parentId":12386,"tags":{"url":"/api/auth/session","memory.rss":"9152188416","memory.heapUsed":"6831755520","memory.heapTotal":"7042154496"},"startTime":1763885720536,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":251,"timestamp":116141697681,"id":12391,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720545,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":274,"timestamp":116141697953,"id":12392,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720545,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":296,"timestamp":116141702098,"id":12393,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720549,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":157,"timestamp":116141702426,"id":12394,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885720550,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":49966,"timestamp":116141671336,"id":12388,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885720519,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116141721557,"id":12395,"parentId":12388,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9155477504","memory.heapUsed":"6824488648","memory.heapTotal":"7045824512"},"startTime":1763885720569,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":6159,"timestamp":116141725909,"id":12397,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885720573,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":387,"timestamp":116141736785,"id":12398,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885720584,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":212,"timestamp":116141737206,"id":12399,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885720584,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":191,"timestamp":116141743695,"id":12400,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885720591,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":130,"timestamp":116141743906,"id":12401,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885720591,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":24668,"timestamp":116141724855,"id":12396,"tags":{"url":"/api/auth/session"},"startTime":1763885720572,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116141749717,"id":12402,"parentId":12396,"tags":{"url":"/api/auth/session","memory.rss":"9155719168","memory.heapUsed":"6826069256","memory.heapTotal":"7045824512"},"startTime":1763885720597,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1593,"timestamp":116141751680,"id":12404,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885720599,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":41817,"timestamp":116141751335,"id":12403,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885720599,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116141793393,"id":12405,"parentId":12403,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9155960832","memory.heapUsed":"6828367520","memory.heapTotal":"7045824512"},"startTime":1763885720641,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":684,"timestamp":116141915658,"id":12407,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885720763,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":183,"timestamp":116141925174,"id":12408,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720772,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":121,"timestamp":116141925374,"id":12409,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720773,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":158,"timestamp":116141925917,"id":12410,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720773,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":122,"timestamp":116141926088,"id":12411,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720773,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":13749,"timestamp":116141915242,"id":12406,"tags":{"url":"/api/trees"},"startTime":1763885720762,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116141929162,"id":12414,"parentId":12406,"tags":{"url":"/api/trees","memory.rss":"9156263936","memory.heapUsed":"6830898416","memory.heapTotal":"7046086656"},"startTime":1763885720776,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2567,"timestamp":116141927383,"id":12413,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885720775,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":894,"timestamp":116141943122,"id":12416,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885720790,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":32468,"timestamp":116141927042,"id":12412,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885720774,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116141959679,"id":12417,"parentId":12412,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9156657152","memory.heapUsed":"6832861368","memory.heapTotal":"7046610944"},"startTime":1763885720807,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":350,"timestamp":116141961719,"id":12418,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720809,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":185,"timestamp":116141962098,"id":12419,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720809,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":21349,"timestamp":116141942846,"id":12415,"tags":{"url":"/api/trees"},"startTime":1763885720790,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":11,"timestamp":116141964500,"id":12420,"parentId":12415,"tags":{"url":"/api/trees","memory.rss":"9156685824","memory.heapUsed":"6833230856","memory.heapTotal":"7046610944"},"startTime":1763885720812,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":708,"timestamp":116141965769,"id":12421,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720813,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":662,"timestamp":116141966564,"id":12422,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885720814,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":609,"timestamp":116141969163,"id":12424,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885720816,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18050,"timestamp":116141968655,"id":12423,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885720816,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116141986913,"id":12425,"parentId":12423,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9156902912","memory.heapUsed":"6834382184","memory.heapTotal":"7046873088"},"startTime":1763885720834,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":645,"timestamp":116164429695,"id":12427,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885743276,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":158716,"timestamp":116164429368,"id":12426,"tags":{"url":"/api/trees"},"startTime":1763885743276,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116164588368,"id":12428,"parentId":12426,"tags":{"url":"/api/trees","memory.rss":"9157144576","memory.heapUsed":"6835775152","memory.heapTotal":"7046873088"},"startTime":1763885743435,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1173,"timestamp":116205199088,"id":12430,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885784044,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":234,"timestamp":116205208581,"id":12431,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784054,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":154,"timestamp":116205208844,"id":12432,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784054,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":183,"timestamp":116205211071,"id":12433,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784056,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":127,"timestamp":116205211271,"id":12434,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784056,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":847,"timestamp":116205212897,"id":12436,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885784058,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":40354,"timestamp":116205196458,"id":12429,"tags":{"url":"/api/trees"},"startTime":1763885784041,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116205237061,"id":12437,"parentId":12429,"tags":{"url":"/api/trees","memory.rss":"9157554176","memory.heapUsed":"6837967040","memory.heapTotal":"7047397376"},"startTime":1763885784082,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":53557,"timestamp":116205212094,"id":12435,"tags":{"url":"/api/auth/session"},"startTime":1763885784057,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116205265830,"id":12438,"parentId":12435,"tags":{"url":"/api/auth/session","memory.rss":"9159270400","memory.heapUsed":"6829331440","memory.heapTotal":"7022231552"},"startTime":1763885784111,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":283,"timestamp":116205272141,"id":12439,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784117,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":241,"timestamp":116205272454,"id":12440,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784117,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":273,"timestamp":116205273642,"id":12441,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784119,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":215,"timestamp":116205273940,"id":12442,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784119,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":932,"timestamp":116205275720,"id":12444,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885784121,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":10622,"timestamp":116205275072,"id":12443,"tags":{"url":"/api/auth/session"},"startTime":1763885784120,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116205285874,"id":12445,"parentId":12443,"tags":{"url":"/api/auth/session","memory.rss":"9159499776","memory.heapUsed":"6830521336","memory.heapTotal":"7022231552"},"startTime":1763885784131,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":339,"timestamp":116205287614,"id":12446,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784133,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":163,"timestamp":116205287978,"id":12447,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784133,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":195,"timestamp":116205288696,"id":12448,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784134,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":132,"timestamp":116205288905,"id":12449,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885784134,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":526,"timestamp":116205289914,"id":12451,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885784135,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":12470,"timestamp":116205289572,"id":12450,"tags":{"url":"/api/auth/session"},"startTime":1763885784135,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116205302467,"id":12452,"parentId":12450,"tags":{"url":"/api/auth/session","memory.rss":"9159725056","memory.heapUsed":"6831703352","memory.heapTotal":"7022231552"},"startTime":1763885784148,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":346,"timestamp":116206281718,"id":12453,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785127,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":320,"timestamp":116206282100,"id":12454,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785127,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":373,"timestamp":116206284263,"id":12455,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785129,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":282,"timestamp":116206284672,"id":12456,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785130,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":883,"timestamp":116206286667,"id":12458,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885785132,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":50510,"timestamp":116206286043,"id":12457,"tags":{"url":"/api/auth/session"},"startTime":1763885785131,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116206336730,"id":12461,"parentId":12457,"tags":{"url":"/api/auth/session","memory.rss":"9160110080","memory.heapUsed":"6831015224","memory.heapTotal":"7031668736"},"startTime":1763885785182,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":4011,"timestamp":116206333328,"id":12460,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885785178,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":182,"timestamp":116206345330,"id":12462,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785190,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":127,"timestamp":116206345531,"id":12463,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785191,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":174,"timestamp":116206347006,"id":12464,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785192,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":266,"timestamp":116206347198,"id":12465,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885785192,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1035,"timestamp":116206348505,"id":12467,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885785194,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":23231,"timestamp":116206331932,"id":12459,"tags":{"url":"/api/trees"},"startTime":1763885785177,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":12,"timestamp":116206355423,"id":12468,"parentId":12459,"tags":{"url":"/api/trees","memory.rss":"9160110080","memory.heapUsed":"6832776712","memory.heapTotal":"7031668736"},"startTime":1763885785200,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":12564,"timestamp":116206348178,"id":12466,"tags":{"url":"/api/auth/session"},"startTime":1763885785193,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116206360937,"id":12469,"parentId":12466,"tags":{"url":"/api/auth/session","memory.rss":"9160110080","memory.heapUsed":"6833055600","memory.heapTotal":"7031668736"},"startTime":1763885785206,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":80000,"timestamp":116214613646,"id":12470,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763885793563,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":82000,"timestamp":116214613312,"id":12471,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763885793582,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":733,"timestamp":116236098828,"id":12473,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885814943,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":29155,"timestamp":116236098386,"id":12472,"tags":{"url":"/api/trees"},"startTime":1763885814942,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":17,"timestamp":116236127771,"id":12474,"parentId":12472,"tags":{"url":"/api/trees","memory.rss":"9160634368","memory.heapUsed":"6832744792","memory.heapTotal":"7023628288"},"startTime":1763885814972,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":75000,"timestamp":116264171507,"id":12475,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763885843178,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":73000,"timestamp":116264172243,"id":12476,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763885843205,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1433,"timestamp":116272833111,"id":12478,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885851676,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":22007,"timestamp":116272832735,"id":12477,"tags":{"url":"/api/trees"},"startTime":1763885851675,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116272854979,"id":12479,"parentId":12477,"tags":{"url":"/api/trees","memory.rss":"9162018816","memory.heapUsed":"6835454736","memory.heapTotal":"7027208192"},"startTime":1763885851698,"traceId":"96837134d747a51b"}] +[{"name":"ensure-page","duration":37697,"timestamp":116272888659,"id":12481,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885851731,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":1196471,"timestamp":116272887762,"id":12480,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885851730,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116274084622,"id":12482,"parentId":12480,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9215168512","memory.heapUsed":"6894919304","memory.heapTotal":"7109574656"},"startTime":1763885852927,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":363,"timestamp":116274399547,"id":12483,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853242,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":273,"timestamp":116274399940,"id":12484,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853243,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":793,"timestamp":116274402362,"id":12485,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853245,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":690,"timestamp":116274403308,"id":12486,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853246,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3750,"timestamp":116274425739,"id":12488,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885853268,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18837,"timestamp":116274425352,"id":12487,"tags":{"url":"/api/auth/session"},"startTime":1763885853268,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":12,"timestamp":116274444701,"id":12489,"parentId":12487,"tags":{"url":"/api/auth/session","memory.rss":"9227399168","memory.heapUsed":"6896013248","memory.heapTotal":"7116914688"},"startTime":1763885853287,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":195,"timestamp":116274481935,"id":12490,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853325,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":131,"timestamp":116274482148,"id":12491,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853325,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":195,"timestamp":116274483349,"id":12492,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885853326,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":159,"timestamp":116274483574,"id":12493,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885853326,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":681,"timestamp":116274484315,"id":12494,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853327,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":861,"timestamp":116274485106,"id":12495,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763885853328,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":727,"timestamp":116274489082,"id":12496,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885853332,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":755,"timestamp":116274489926,"id":12497,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885853333,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":6007,"timestamp":116274493291,"id":12499,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763885853336,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":6057,"timestamp":116274498436,"id":12501,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763885853341,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":31257,"timestamp":116274492313,"id":12498,"tags":{"url":"/api/auth/session"},"startTime":1763885853335,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116274523807,"id":12502,"parentId":12498,"tags":{"url":"/api/auth/session","memory.rss":"9227874304","memory.heapUsed":"6899157776","memory.heapTotal":"7116914688"},"startTime":1763885853366,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":35247,"timestamp":116274497725,"id":12500,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763885853340,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116274533160,"id":12503,"parentId":12500,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9227911168","memory.heapUsed":"6899624800","memory.heapTotal":"7116914688"},"startTime":1763885853376,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":375,"timestamp":116274549331,"id":12504,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885853392,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":171,"timestamp":116274549746,"id":12505,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885853392,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":272,"timestamp":116274555539,"id":12506,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885853398,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":198,"timestamp":116274555843,"id":12507,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885853399,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":4157,"timestamp":116274558863,"id":12509,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885853402,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":39770,"timestamp":116274558504,"id":12508,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885853401,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116274598522,"id":12510,"parentId":12508,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9228316672","memory.heapUsed":"6902511880","memory.heapTotal":"7117176832"},"startTime":1763885853441,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":509,"timestamp":116274704663,"id":12512,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885853547,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":170,"timestamp":116274714998,"id":12513,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":109,"timestamp":116274715190,"id":12514,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":142,"timestamp":116274715676,"id":12515,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":121,"timestamp":116274715830,"id":12516,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853558,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":585,"timestamp":116274717574,"id":12518,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885853560,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":35870,"timestamp":116274704323,"id":12511,"tags":{"url":"/api/trees"},"startTime":1763885853547,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116274740502,"id":12519,"parentId":12511,"tags":{"url":"/api/trees","memory.rss":"9228804096","memory.heapUsed":"6905030432","memory.heapTotal":"7117701120"},"startTime":1763885853583,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2452,"timestamp":116274745665,"id":12521,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885853588,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":51550,"timestamp":116274717264,"id":12517,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885853560,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":21,"timestamp":116274769554,"id":12522,"parentId":12517,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9229037568","memory.heapUsed":"6906281320","memory.heapTotal":"7117963264"},"startTime":1763885853612,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":863,"timestamp":116274773204,"id":12523,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853616,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":762,"timestamp":116274774144,"id":12524,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853617,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":446,"timestamp":116274776469,"id":12525,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853619,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":288,"timestamp":116274776963,"id":12526,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763885853620,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1854,"timestamp":116274783223,"id":12528,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763885853626,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":29376,"timestamp":116274781707,"id":12527,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763885853624,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116274811350,"id":12529,"parentId":12527,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9229271040","memory.heapUsed":"6907633512","memory.heapTotal":"7117963264"},"startTime":1763885853654,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":96008,"timestamp":116274745193,"id":12520,"tags":{"url":"/api/trees"},"startTime":1763885853588,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":14,"timestamp":116274841737,"id":12530,"parentId":12520,"tags":{"url":"/api/trees","memory.rss":"9229287424","memory.heapUsed":"6907848792","memory.heapTotal":"7118225408"},"startTime":1763885853684,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":20621,"timestamp":116325820934,"id":12532,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885904662,"traceId":"96837134d747a51b"},{"name":"compile-path","duration":211180,"timestamp":116325821002,"id":12533,"tags":{"trigger":"/"},"startTime":1763885904662,"traceId":"96837134d747a51b"}] +[{"name":"client-hmr-latency","duration":71000,"timestamp":116325751897,"id":12536,"parentId":3,"tags":{"updatedModules":[],"page":"/","isPageHidden":false},"startTime":1763885905081,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":76000,"timestamp":116325752040,"id":12537,"parentId":3,"tags":{"updatedModules":[],"page":"/tree","isPageHidden":true},"startTime":1763885905081,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":423099,"timestamp":116325821263,"id":12534,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885904662,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116326244569,"id":12538,"parentId":12534,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9256681472","memory.heapUsed":"6940298264","memory.heapTotal":"7142182912"},"startTime":1763885905085,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":427060,"timestamp":116325820579,"id":12531,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885904661,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116326247841,"id":12539,"parentId":12531,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9256685568","memory.heapUsed":"6940363512","memory.heapTotal":"7142182912"},"startTime":1763885905089,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3093,"timestamp":116326254757,"id":12541,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905096,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":31148,"timestamp":116326256059,"id":12543,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905097,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":67279,"timestamp":116326255231,"id":12542,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905096,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326322672,"id":12544,"parentId":12542,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9257709568","memory.heapUsed":"6942145824","memory.heapTotal":"7143231488"},"startTime":1763885905164,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":70666,"timestamp":116326254224,"id":12540,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905095,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116326325182,"id":12545,"parentId":12540,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9257709568","memory.heapUsed":"6942202352","memory.heapTotal":"7143231488"},"startTime":1763885905166,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2259,"timestamp":116326328218,"id":12547,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905169,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":26762,"timestamp":116326329481,"id":12549,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905170,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":94476,"timestamp":116326327881,"id":12546,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905169,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116326422565,"id":12550,"parentId":12546,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9259552768","memory.heapUsed":"6944490632","memory.heapTotal":"7156862976"},"startTime":1763885905263,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":97679,"timestamp":116326328569,"id":12548,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905169,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116326426587,"id":12551,"parentId":12548,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9259556864","memory.heapUsed":"6944558392","memory.heapTotal":"7156862976"},"startTime":1763885905267,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2682,"timestamp":116326429963,"id":12553,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905271,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":35890,"timestamp":116326431132,"id":12555,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905272,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":71898,"timestamp":116326429568,"id":12552,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905270,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326501647,"id":12556,"parentId":12552,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9261686784","memory.heapUsed":"6950814816","memory.heapTotal":"7157125120"},"startTime":1763885905343,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":72903,"timestamp":116326430664,"id":12554,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905272,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116326503792,"id":12557,"parentId":12554,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9261748224","memory.heapUsed":"6950878816","memory.heapTotal":"7157125120"},"startTime":1763885905345,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1493,"timestamp":116326507080,"id":12559,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905348,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":33662,"timestamp":116326507872,"id":12561,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905349,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":65096,"timestamp":116326506574,"id":12558,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905347,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116326571857,"id":12562,"parentId":12558,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9266139136","memory.heapUsed":"6949254560","memory.heapTotal":"7158960128"},"startTime":1763885905413,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":67877,"timestamp":116326507555,"id":12560,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905348,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116326575607,"id":12563,"parentId":12560,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9266143232","memory.heapUsed":"6949318560","memory.heapTotal":"7158960128"},"startTime":1763885905416,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2924,"timestamp":116326577620,"id":12565,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905419,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":26224,"timestamp":116326578235,"id":12567,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905419,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":63672,"timestamp":116326577907,"id":12566,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905419,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116326641729,"id":12568,"parentId":12566,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9272594432","memory.heapUsed":"6948826872","memory.heapTotal":"7161581568"},"startTime":1763885905483,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":66255,"timestamp":116326577254,"id":12564,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905418,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326643668,"id":12569,"parentId":12564,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9272598528","memory.heapUsed":"6948886792","memory.heapTotal":"7161581568"},"startTime":1763885905485,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1653,"timestamp":116326647460,"id":12571,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905488,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":22912,"timestamp":116326648413,"id":12573,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905489,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":53184,"timestamp":116326646886,"id":12570,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905488,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326700236,"id":12574,"parentId":12570,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9273126912","memory.heapUsed":"6955102000","memory.heapTotal":"7161581568"},"startTime":1763885905541,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":54397,"timestamp":116326647971,"id":12572,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905489,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326702587,"id":12575,"parentId":12572,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9273131008","memory.heapUsed":"6955166368","memory.heapTotal":"7161581568"},"startTime":1763885905543,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1855,"timestamp":116326704582,"id":12577,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905545,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":36633,"timestamp":116326705302,"id":12579,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905546,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":166536,"timestamp":116326704251,"id":12576,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905545,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116326871095,"id":12580,"parentId":12576,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9275371520","memory.heapUsed":"6954288528","memory.heapTotal":"7164203008"},"startTime":1763885905712,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":169657,"timestamp":116326704985,"id":12578,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905546,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":17,"timestamp":116326874918,"id":12581,"parentId":12578,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9275375616","memory.heapUsed":"6954353600","memory.heapTotal":"7164203008"},"startTime":1763885905716,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1691,"timestamp":116326877466,"id":12583,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905718,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":24942,"timestamp":116326878018,"id":12585,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905719,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":61419,"timestamp":116326877138,"id":12582,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905718,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326938728,"id":12586,"parentId":12582,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9277820928","memory.heapUsed":"6954170728","memory.heapTotal":"7166300160"},"startTime":1763885905780,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":63593,"timestamp":116326877769,"id":12584,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905719,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116326941520,"id":12587,"parentId":12584,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9277849600","memory.heapUsed":"6954263112","memory.heapTotal":"7166300160"},"startTime":1763885905782,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2004,"timestamp":116326943608,"id":12589,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763885905784,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":24851,"timestamp":116326944138,"id":12591,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885905785,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":56033,"timestamp":116326943206,"id":12588,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda"},"startTime":1763885905784,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116326999443,"id":12592,"parentId":12588,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=12fda","memory.rss":"9278382080","memory.heapUsed":"6960516264","memory.heapTotal":"7166562304"},"startTime":1763885905840,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":57657,"timestamp":116326943855,"id":12590,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5"},"startTime":1763885905785,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116327001690,"id":12593,"parentId":12590,"tags":{"url":"/?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=13bk5","memory.rss":"9278386176","memory.heapUsed":"6960576936","memory.heapTotal":"7166562304"},"startTime":1763885905843,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1079,"timestamp":116373587171,"id":12595,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885952426,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":25615,"timestamp":116373586769,"id":12594,"tags":{"url":"/api/trees"},"startTime":1763885952426,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116373612580,"id":12596,"parentId":12594,"tags":{"url":"/api/trees","memory.rss":"9278640128","memory.heapUsed":"6962734864","memory.heapTotal":"7166824448"},"startTime":1763885952452,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1016,"timestamp":116375405684,"id":12598,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885954245,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":25695,"timestamp":116375405339,"id":12597,"tags":{"url":"/?_rsc=vusbg"},"startTime":1763885954245,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116375431223,"id":12599,"parentId":12597,"tags":{"url":"/?_rsc=vusbg","memory.rss":"9281687552","memory.heapUsed":"6957289360","memory.heapTotal":"7169183744"},"startTime":1763885954270,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":580,"timestamp":116375476507,"id":12601,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885954316,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":10668,"timestamp":116375476245,"id":12600,"tags":{"url":"/api/trees"},"startTime":1763885954315,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116375487084,"id":12602,"parentId":12600,"tags":{"url":"/api/trees","memory.rss":"9281904640","memory.heapUsed":"6958340552","memory.heapTotal":"7169183744"},"startTime":1763885954326,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":161,"timestamp":116375510259,"id":12603,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885954349,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":161,"timestamp":116375510436,"id":12604,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885954350,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":148,"timestamp":116375511487,"id":12605,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885954351,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":210,"timestamp":116375511676,"id":12606,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885954351,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":563,"timestamp":116375512990,"id":12608,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763885954352,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18937,"timestamp":116375512653,"id":12607,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763885954352,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":15,"timestamp":116375532033,"id":12609,"parentId":12607,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9282162688","memory.heapUsed":"6960401520","memory.heapTotal":"7169183744"},"startTime":1763885954371,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":919,"timestamp":116380572450,"id":12611,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885959411,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":12500,"timestamp":116380572094,"id":12610,"tags":{"url":"/api/trees"},"startTime":1763885959411,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116380584774,"id":12612,"parentId":12610,"tags":{"url":"/api/trees","memory.rss":"9282379776","memory.heapUsed":"6961592680","memory.heapTotal":"7169445888"},"startTime":1763885959424,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2035,"timestamp":116385413109,"id":12614,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763885964252,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":412,"timestamp":116386048600,"id":12615,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885964887,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":339,"timestamp":116386049044,"id":12616,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885964888,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":247,"timestamp":116386054626,"id":12617,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885964893,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":232,"timestamp":116386054898,"id":12618,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763885964894,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":671150,"timestamp":116385412755,"id":12613,"tags":{"url":"/"},"startTime":1763885964252,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116386084408,"id":12619,"parentId":12613,"tags":{"url":"/","memory.rss":"9322881024","memory.heapUsed":"7001705080","memory.heapTotal":"7211999232"},"startTime":1763885964923,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":670,"timestamp":116388590023,"id":12621,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763885967429,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":15738,"timestamp":116388589540,"id":12620,"tags":{"url":"/api/trees"},"startTime":1763885967428,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116388605689,"id":12622,"parentId":12620,"tags":{"url":"/api/trees","memory.rss":"9331474432","memory.heapUsed":"7004116400","memory.heapTotal":"7219601408"},"startTime":1763885967444,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":503,"timestamp":116438059174,"id":12624,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886016896,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":11379,"timestamp":116438058889,"id":12623,"tags":{"url":"/api/trees"},"startTime":1763886016896,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116438070419,"id":12625,"parentId":12623,"tags":{"url":"/api/trees","memory.rss":"9333510144","memory.heapUsed":"7007020552","memory.heapTotal":"7221223424"},"startTime":1763886016907,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":80000,"timestamp":116437963024,"id":12626,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763886016929,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":103000,"timestamp":116437963032,"id":12629,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-client]"],"page":"/","isPageHidden":false},"startTime":1763886016936,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":952,"timestamp":116438098496,"id":12628,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886016936,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":15475,"timestamp":116438097750,"id":12627,"tags":{"url":"/api/trees"},"startTime":1763886016935,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116438113391,"id":12630,"parentId":12627,"tags":{"url":"/api/trees","memory.rss":"9333714944","memory.heapUsed":"7008081984","memory.heapTotal":"7221485568"},"startTime":1763886016950,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":727,"timestamp":116478056920,"id":12632,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886056893,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":19532,"timestamp":116478056424,"id":12631,"tags":{"url":"/api/trees"},"startTime":1763886056892,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":9,"timestamp":116478076225,"id":12633,"parentId":12631,"tags":{"url":"/api/trees","memory.rss":"9333796864","memory.heapUsed":"7009170456","memory.heapTotal":"7221747712"},"startTime":1763886056912,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":746,"timestamp":116523443294,"id":12635,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886102277,"traceId":"96837134d747a51b"}] +[{"name":"handle-request","duration":15840,"timestamp":116523442991,"id":12634,"tags":{"url":"/api/trees"},"startTime":1763886102277,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116523459119,"id":12636,"parentId":12634,"tags":{"url":"/api/trees","memory.rss":"9334009856","memory.heapUsed":"7010322200","memory.heapTotal":"7222009856"},"startTime":1763886102293,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":18909,"timestamp":116525492509,"id":12638,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763886104327,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":902920,"timestamp":116525492067,"id":12637,"tags":{"url":"/"},"startTime":1763886104326,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116526395197,"id":12639,"parentId":12637,"tags":{"url":"/","memory.rss":"9376796672","memory.heapUsed":"7058175304","memory.heapTotal":"7250563072"},"startTime":1763886105229,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":402,"timestamp":116526794286,"id":12640,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105628,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":222,"timestamp":116526794719,"id":12641,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105629,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1013,"timestamp":116526801306,"id":12642,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105635,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1701,"timestamp":116526802564,"id":12643,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105637,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":4482,"timestamp":116526812636,"id":12645,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886105647,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":30217,"timestamp":116526811580,"id":12644,"tags":{"url":"/api/auth/session"},"startTime":1763886105646,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116526842069,"id":12646,"parentId":12644,"tags":{"url":"/api/auth/session","memory.rss":"9376804864","memory.heapUsed":"7060147192","memory.heapTotal":"7255281664"},"startTime":1763886105676,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":619,"timestamp":116526854679,"id":12647,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105689,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":357,"timestamp":116526855361,"id":12648,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105689,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":548,"timestamp":116526862153,"id":12649,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105696,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":451,"timestamp":116526862782,"id":12650,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886105697,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1863,"timestamp":116526866516,"id":12652,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886105701,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":22393,"timestamp":116526865439,"id":12651,"tags":{"url":"/api/auth/session"},"startTime":1763886105699,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116526888304,"id":12655,"parentId":12651,"tags":{"url":"/api/auth/session","memory.rss":"9376804864","memory.heapUsed":"7061747344","memory.heapTotal":"7255281664"},"startTime":1763886105722,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":7166,"timestamp":116526884082,"id":12654,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886105718,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":35241,"timestamp":116526883673,"id":12653,"tags":{"url":"/api/trees"},"startTime":1763886105718,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116526919125,"id":12656,"parentId":12653,"tags":{"url":"/api/trees","memory.rss":"9376804864","memory.heapUsed":"7061017016","memory.heapTotal":"7256330240"},"startTime":1763886105753,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":240,"timestamp":116526971188,"id":12657,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886105805,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":169,"timestamp":116526971453,"id":12658,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886105805,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":283,"timestamp":116526974234,"id":12659,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886105808,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":170,"timestamp":116526974544,"id":12660,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886105809,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":820,"timestamp":116526977919,"id":12662,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763886105812,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":20715,"timestamp":116526977057,"id":12661,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886105811,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116526998006,"id":12663,"parentId":12661,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9376804864","memory.heapUsed":"7063250464","memory.heapTotal":"7256330240"},"startTime":1763886105832,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":432,"timestamp":116527057096,"id":12665,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886105891,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":310,"timestamp":116527066295,"id":12666,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105900,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":189,"timestamp":116527066657,"id":12667,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105901,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":258,"timestamp":116527067867,"id":12668,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105902,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":196,"timestamp":116527068148,"id":12669,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105902,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":13369,"timestamp":116527056843,"id":12664,"tags":{"url":"/api/trees"},"startTime":1763886105891,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116527070427,"id":12670,"parentId":12664,"tags":{"url":"/api/trees","memory.rss":"9376804864","memory.heapUsed":"7062925144","memory.heapTotal":"7257116672"},"startTime":1763886105904,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":554,"timestamp":116527071867,"id":12672,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763886105906,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":955,"timestamp":116527089899,"id":12674,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886105924,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":32919,"timestamp":116527071498,"id":12671,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763886105906,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":14,"timestamp":116527105125,"id":12675,"parentId":12671,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9377587200","memory.heapUsed":"7063625392","memory.heapTotal":"7264718848"},"startTime":1763886105939,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":356,"timestamp":116527109563,"id":12676,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105944,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":204,"timestamp":116527109964,"id":12677,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105944,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":283,"timestamp":116527110740,"id":12678,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105945,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":292,"timestamp":116527111107,"id":12679,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886105945,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1404,"timestamp":116527113321,"id":12681,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763886105947,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":37873,"timestamp":116527112496,"id":12680,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763886105947,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":25,"timestamp":116527150895,"id":12682,"parentId":12680,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"9377812480","memory.heapUsed":"7064975448","memory.heapTotal":"7264718848"},"startTime":1763886105985,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":113302,"timestamp":116527089600,"id":12673,"tags":{"url":"/api/trees"},"startTime":1763886105924,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":16,"timestamp":116527203865,"id":12683,"parentId":12673,"tags":{"url":"/api/trees","memory.rss":"9377824768","memory.heapUsed":"7065180864","memory.heapTotal":"7264718848"},"startTime":1763886106038,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":9437,"timestamp":116550056776,"id":12685,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763886128890,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":192323,"timestamp":116550056422,"id":12684,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg"},"startTime":1763886128890,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116550248917,"id":12686,"parentId":12684,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg","memory.rss":"9393897472","memory.heapUsed":"7084016296","memory.heapTotal":"7279345664"},"startTime":1763886129082,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":659,"timestamp":116550941856,"id":12688,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886129775,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":19214,"timestamp":116550941450,"id":12687,"tags":{"url":"/api/trees"},"startTime":1763886129775,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116550960915,"id":12689,"parentId":12687,"tags":{"url":"/api/trees","memory.rss":"9395585024","memory.heapUsed":"7084388128","memory.heapTotal":"7279132672"},"startTime":1763886129794,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1051,"timestamp":116550963772,"id":12691,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886129797,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":16218,"timestamp":116550963450,"id":12690,"tags":{"url":"/api/trees"},"startTime":1763886129797,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116550980146,"id":12692,"parentId":12690,"tags":{"url":"/api/trees","memory.rss":"9395802112","memory.heapUsed":"7085571864","memory.heapTotal":"7279394816"},"startTime":1763886129813,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1062,"timestamp":116560749169,"id":12694,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763886139582,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":53440,"timestamp":116560741356,"id":12693,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart&_rsc=1woqb"},"startTime":1763886139574,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":9,"timestamp":116560795316,"id":12695,"parentId":12693,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=d3-org-chart&_rsc=1woqb","memory.rss":"9403871232","memory.heapUsed":"7093663144","memory.heapTotal":"7287525376"},"startTime":1763886139628,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":942,"timestamp":116564563711,"id":12697,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763886143396,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":18163,"timestamp":116564563319,"id":12696,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=traditional&_rsc=1woqb"},"startTime":1763886143396,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116564581660,"id":12698,"parentId":12696,"tags":{"url":"/tree?treeId=cmib8zhrq0003hhxlvnsi96nh&view=traditional&_rsc=1woqb","memory.rss":"9404616704","memory.heapUsed":"7094428536","memory.heapTotal":"7288049664"},"startTime":1763886143414,"traceId":"96837134d747a51b"},{"name":"compile-path","duration":20587,"timestamp":116620302551,"id":12701,"tags":{"trigger":"/members"},"startTime":1763886199133,"traceId":"96837134d747a51b"}] +[{"name":"handle-request","duration":181720,"timestamp":116620302144,"id":12699,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=1woqb"},"startTime":1763886199133,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116620484090,"id":12702,"parentId":12699,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=1woqb","memory.rss":"9422524416","memory.heapUsed":"7115838272","memory.heapTotal":"7305879552"},"startTime":1763886199315,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":806,"timestamp":116620808681,"id":12704,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886199639,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":14530,"timestamp":116620807808,"id":12703,"tags":{"url":"/api/trees"},"startTime":1763886199639,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116620822522,"id":12705,"parentId":12703,"tags":{"url":"/api/trees","memory.rss":"9426022400","memory.heapUsed":"7113187352","memory.heapTotal":"7314264064"},"startTime":1763886199653,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":611,"timestamp":116620823991,"id":12707,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886199655,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":11904,"timestamp":116620823663,"id":12706,"tags":{"url":"/api/trees"},"startTime":1763886199654,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116620835736,"id":12708,"parentId":12706,"tags":{"url":"/api/trees","memory.rss":"9426997248","memory.heapUsed":"7114224192","memory.heapTotal":"7314264064"},"startTime":1763886199667,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":69000,"timestamp":116734373712,"id":12709,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763886313273,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":70000,"timestamp":116734373890,"id":12710,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763886313359,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1735,"timestamp":116752003963,"id":12712,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886330809,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":21374,"timestamp":116752003454,"id":12711,"tags":{"url":"/api/trees"},"startTime":1763886330808,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116752025109,"id":12713,"parentId":12711,"tags":{"url":"/api/trees","memory.rss":"9444438016","memory.heapUsed":"7115394168","memory.heapTotal":"7306915840"},"startTime":1763886330830,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":22540,"timestamp":116752034470,"id":12715,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763886330839,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":2017866,"timestamp":116752033841,"id":12714,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886330839,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116754051899,"id":12716,"parentId":12714,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9478574080","memory.heapUsed":"7149727872","memory.heapTotal":"7352373248"},"startTime":1763886332857,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":261,"timestamp":116754358889,"id":12717,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333164,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":5280,"timestamp":116754359176,"id":12718,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333164,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":368,"timestamp":116754373359,"id":12719,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333178,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":5509,"timestamp":116754373763,"id":12720,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333179,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":7396,"timestamp":116754389236,"id":12722,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886333194,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":197192,"timestamp":116754388764,"id":12721,"tags":{"url":"/api/auth/session"},"startTime":1763886333194,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":17,"timestamp":116754586173,"id":12723,"parentId":12721,"tags":{"url":"/api/auth/session","memory.rss":"9463758848","memory.heapUsed":"7031669824","memory.heapTotal":"7335227392"},"startTime":1763886333391,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":367,"timestamp":116754590926,"id":12724,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333396,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":290,"timestamp":116754591545,"id":12725,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333396,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":555,"timestamp":116754592642,"id":12726,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333398,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":253,"timestamp":116754593226,"id":12727,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886333398,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1856,"timestamp":116754602111,"id":12729,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886333407,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":258,"timestamp":116754611971,"id":12730,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886333417,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":148,"timestamp":116754612252,"id":12731,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886333417,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":15228,"timestamp":116754601189,"id":12728,"tags":{"url":"/api/auth/session"},"startTime":1763886333406,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116754616664,"id":12732,"parentId":12728,"tags":{"url":"/api/auth/session","memory.rss":"9463758848","memory.heapUsed":"7033062968","memory.heapTotal":"7335227392"},"startTime":1763886333422,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":295,"timestamp":116754616994,"id":12733,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886333422,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":460,"timestamp":116754617341,"id":12734,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886333422,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":734,"timestamp":116754618963,"id":12736,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763886333424,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":4966,"timestamp":116754643082,"id":12738,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886333448,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":48387,"timestamp":116754618572,"id":12735,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886333423,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":6,"timestamp":116754667196,"id":12739,"parentId":12735,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9463762944","memory.heapUsed":"7035223496","memory.heapTotal":"7335227392"},"startTime":1763886333472,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":556,"timestamp":116754676624,"id":12740,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886333481,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":359,"timestamp":116754677243,"id":12741,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886333482,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":40502,"timestamp":116754642377,"id":12737,"tags":{"url":"/api/trees"},"startTime":1763886333447,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":8,"timestamp":116754683123,"id":12742,"parentId":12737,"tags":{"url":"/api/trees","memory.rss":"9463762944","memory.heapUsed":"7035754080","memory.heapTotal":"7335227392"},"startTime":1763886333488,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":258,"timestamp":116754686427,"id":12743,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886333491,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":371,"timestamp":116754686718,"id":12744,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886333492,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":3588,"timestamp":116754689573,"id":12746,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886333494,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":7313,"timestamp":116754692351,"id":12748,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763886333497,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":40103,"timestamp":116754691747,"id":12747,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886333497,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":9,"timestamp":116754732332,"id":12749,"parentId":12747,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9463775232","memory.heapUsed":"7038561680","memory.heapTotal":"7335227392"},"startTime":1763886333537,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":87750,"timestamp":116754688991,"id":12745,"tags":{"url":"/api/trees"},"startTime":1763886333494,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116754777287,"id":12750,"parentId":12745,"tags":{"url":"/api/trees","memory.rss":"9463775232","memory.heapUsed":"7038865376","memory.heapTotal":"7335227392"},"startTime":1763886333582,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1038,"timestamp":116765749871,"id":12752,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763886344554,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":54339,"timestamp":116765749499,"id":12751,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344554,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116765804015,"id":12753,"parentId":12751,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9481494528","memory.heapUsed":"7048025152","memory.heapTotal":"7352004608"},"startTime":1763886344608,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":208,"timestamp":116765973069,"id":12754,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344778,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":146,"timestamp":116765973302,"id":12755,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344778,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":208,"timestamp":116765973977,"id":12756,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344778,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":205,"timestamp":116765974236,"id":12757,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344779,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":681,"timestamp":116765975782,"id":12759,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886344780,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":23782,"timestamp":116765975272,"id":12758,"tags":{"url":"/api/auth/session"},"startTime":1763886344780,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116765999212,"id":12760,"parentId":12758,"tags":{"url":"/api/auth/session","memory.rss":"9481838592","memory.heapUsed":"7041103944","memory.heapTotal":"7352004608"},"startTime":1763886344804,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":193,"timestamp":116766017157,"id":12761,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344822,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":136,"timestamp":116766017369,"id":12762,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344822,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":140,"timestamp":116766017964,"id":12763,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344822,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":123,"timestamp":116766018116,"id":12764,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886344823,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":577,"timestamp":116766019032,"id":12766,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886344824,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":9038,"timestamp":116766018701,"id":12765,"tags":{"url":"/api/auth/session"},"startTime":1763886344823,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":3,"timestamp":116766027899,"id":12767,"parentId":12765,"tags":{"url":"/api/auth/session","memory.rss":"9481838592","memory.heapUsed":"7042518912","memory.heapTotal":"7352004608"},"startTime":1763886344832,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":171,"timestamp":116766043010,"id":12770,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344847,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":121,"timestamp":116766043198,"id":12771,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344848,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1238,"timestamp":116766042804,"id":12769,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886344847,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":189,"timestamp":116766049630,"id":12772,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344854,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":128,"timestamp":116766049840,"id":12773,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344854,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":1868,"timestamp":116766051757,"id":12775,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763886344856,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":24035,"timestamp":116766042441,"id":12768,"tags":{"url":"/api/trees"},"startTime":1763886344847,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":5,"timestamp":116766066668,"id":12776,"parentId":12768,"tags":{"url":"/api/trees","memory.rss":"9481838592","memory.heapUsed":"7044743552","memory.heapTotal":"7352004608"},"startTime":1763886344871,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":21331,"timestamp":116766051421,"id":12774,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763886344856,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":7,"timestamp":116766072975,"id":12777,"parentId":12774,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"9481838592","memory.heapUsed":"7044965240","memory.heapTotal":"7352004608"},"startTime":1763886344877,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":175,"timestamp":116766084967,"id":12778,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886344889,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":121,"timestamp":116766085160,"id":12779,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886344890,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":130,"timestamp":116766085684,"id":12780,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886344890,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":114,"timestamp":116766085826,"id":12781,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886344890,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":884,"timestamp":116766086775,"id":12783,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763886344891,"traceId":"96837134d747a51b"},{"name":"handle-request","duration":21794,"timestamp":116766086398,"id":12782,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886344891,"traceId":"96837134d747a51b"},{"name":"memory-usage","duration":4,"timestamp":116766108362,"id":12784,"parentId":12782,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"9481838592","memory.heapUsed":"7046920512","memory.heapTotal":"7352004608"},"startTime":1763886344913,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":86000,"timestamp":116818208915,"id":12785,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/tree","isPageHidden":true},"startTime":1763886397125,"traceId":"96837134d747a51b"},{"name":"client-hmr-latency","duration":87000,"timestamp":116818208838,"id":12786,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763886397171,"traceId":"96837134d747a51b"},{"name":"ensure-page","duration":2437,"timestamp":117009239379,"id":12788,"parentId":3,"tags":{"inputPage":"/tree/page"},"startTime":1763886588027,"traceId":"96837134d747a51b"},{"name":"compile-path","duration":15354,"timestamp":117009301358,"id":12791,"tags":{"trigger":"/members"},"startTime":1763886588089,"traceId":"96837134d747a51b"}] +[{"name":"hot-reloader","duration":69,"timestamp":117155532827,"id":3,"tags":{"version":"16.0.3"},"startTime":1763886734311,"traceId":"3cf6cfebb868c56e"},{"name":"setup-dev-bundler","duration":322220,"timestamp":117155369011,"id":2,"parentId":1,"tags":{},"startTime":1763886734147,"traceId":"3cf6cfebb868c56e"},{"name":"start-dev-server","duration":737355,"timestamp":117155095629,"id":1,"tags":{"cpus":"16","platform":"darwin","memory.freeMem":"13965983744","memory.totalMem":"68719476736","memory.heapSizeLimit":"34410070016","memory.rss":"207724544","memory.heapTotal":"69292032","memory.heapUsed":"47498920"},"startTime":1763886733874,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":5494619,"timestamp":117157464123,"id":6,"tags":{"trigger":"/"},"startTime":1763886736242,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":5495466,"timestamp":117157463608,"id":5,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763886736241,"traceId":"3cf6cfebb868c56e"}] +[{"name":"handle-request","duration":6192577,"timestamp":117157457156,"id":4,"tags":{"url":"/"},"startTime":1763886736235,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117163649812,"id":7,"parentId":4,"tags":{"url":"/","memory.rss":"1184243712","memory.heapUsed":"115503752","memory.heapTotal":"145453056"},"startTime":1763886742427,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":1486,"timestamp":117163926033,"id":8,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886742703,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":713,"timestamp":117163927664,"id":9,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886742705,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":574,"timestamp":117163934005,"id":10,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886742711,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":230,"timestamp":117163934722,"id":11,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886742712,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":486808,"timestamp":117163943629,"id":14,"tags":{"trigger":"/api/auth/[...nextauth]"},"startTime":1763886742721,"traceId":"3cf6cfebb868c56e"}] +[{"name":"handle-request","duration":1302738,"timestamp":117163941201,"id":12,"tags":{"url":"/api/auth/session"},"startTime":1763886742719,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117165244000,"id":15,"parentId":12,"tags":{"url":"/api/auth/session","memory.rss":"1249431552","memory.heapUsed":"124722352","memory.heapTotal":"153772032"},"startTime":1763886744021,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":218548,"timestamp":117165267866,"id":18,"tags":{"trigger":"/api/trees"},"startTime":1763886744045,"traceId":"3cf6cfebb868c56e"}] +[{"name":"handle-request","duration":299158,"timestamp":117165267036,"id":16,"tags":{"url":"/api/trees"},"startTime":1763886744044,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117165566243,"id":19,"parentId":16,"tags":{"url":"/api/trees","memory.rss":"1269678080","memory.heapUsed":"133008712","memory.heapTotal":"158347264"},"startTime":1763886744344,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":493,"timestamp":117165567516,"id":21,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886744345,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":14553,"timestamp":117165567075,"id":20,"tags":{"url":"/api/trees"},"startTime":1763886744344,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":7,"timestamp":117165581708,"id":22,"parentId":20,"tags":{"url":"/api/trees","memory.rss":"1269977088","memory.heapUsed":"134168640","memory.heapTotal":"158609408"},"startTime":1763886744359,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":362,"timestamp":117165583897,"id":23,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886744361,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":134,"timestamp":117165584302,"id":24,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886744362,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":121,"timestamp":117165584758,"id":25,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886744362,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":113,"timestamp":117165584906,"id":26,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886744362,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":400,"timestamp":117165611200,"id":30,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886744389,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":311,"timestamp":117165611652,"id":31,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886744389,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":298,"timestamp":117165613026,"id":32,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886744390,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":181,"timestamp":117165613377,"id":33,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886744391,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":161300,"timestamp":117165587143,"id":28,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763886744364,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":222186,"timestamp":117165587240,"id":29,"tags":{"trigger":"/api/trees/[treeId]/members"},"startTime":1763886744365,"traceId":"3cf6cfebb868c56e"}] +[{"name":"handle-request","duration":922135,"timestamp":117165585972,"id":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886744363,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":4,"timestamp":117166508159,"id":36,"parentId":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1282895872","memory.heapUsed":"135211232","memory.heapTotal":"170680320"},"startTime":1763886745285,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":964073,"timestamp":117165614348,"id":34,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763886744392,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":4,"timestamp":117166578459,"id":37,"parentId":34,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"1283276800","memory.heapUsed":"136415752","memory.heapTotal":"170942464"},"startTime":1763886745356,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":2012,"timestamp":117179383292,"id":39,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763886758160,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":151467,"timestamp":117179382404,"id":38,"tags":{"url":"/"},"startTime":1763886758159,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117179533929,"id":40,"parentId":38,"tags":{"url":"/","memory.rss":"1254936576","memory.heapUsed":"130396488","memory.heapTotal":"137809920"},"startTime":1763886758311,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":330,"timestamp":117179925036,"id":41,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886758702,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":169,"timestamp":117179925494,"id":42,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886758702,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":684,"timestamp":117179928188,"id":43,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886758705,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":538,"timestamp":117179928951,"id":44,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763886758706,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":2205,"timestamp":117179933089,"id":46,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763886758710,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":31828,"timestamp":117179931315,"id":45,"tags":{"url":"/api/auth/session"},"startTime":1763886758708,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":13,"timestamp":117179963292,"id":47,"parentId":45,"tags":{"url":"/api/auth/session","memory.rss":"1261625344","memory.heapUsed":"132203672","memory.heapTotal":"142761984"},"startTime":1763886758740,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":1359,"timestamp":117180144085,"id":49,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886758921,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":24351,"timestamp":117180142855,"id":48,"tags":{"url":"/api/trees"},"startTime":1763886758920,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":11,"timestamp":117180167284,"id":50,"parentId":48,"tags":{"url":"/api/trees","memory.rss":"1262301184","memory.heapUsed":"131462192","memory.heapTotal":"143024128"},"startTime":1763886758944,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":803,"timestamp":117180169547,"id":52,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886758946,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":23160,"timestamp":117180168563,"id":51,"tags":{"url":"/api/trees"},"startTime":1763886758945,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":8,"timestamp":117180191798,"id":53,"parentId":51,"tags":{"url":"/api/trees","memory.rss":"1262854144","memory.heapUsed":"132981184","memory.heapTotal":"143781888"},"startTime":1763886758969,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":222,"timestamp":117180197272,"id":54,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886758974,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":181,"timestamp":117180197530,"id":55,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886758974,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":164,"timestamp":117180198214,"id":56,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886758975,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":148,"timestamp":117180198406,"id":57,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886758975,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":696,"timestamp":117180199653,"id":59,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763886758976,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":33318,"timestamp":117180199146,"id":58,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763886758976,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":7,"timestamp":117180232511,"id":60,"parentId":58,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1263689728","memory.heapUsed":"135418968","memory.heapTotal":"144044032"},"startTime":1763886759009,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":343,"timestamp":117180238684,"id":61,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886759016,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":290,"timestamp":117180239078,"id":62,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886759016,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":477,"timestamp":117180241413,"id":63,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886759018,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":228,"timestamp":117180241942,"id":64,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763886759019,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":842,"timestamp":117180243471,"id":66,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763886759020,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":29188,"timestamp":117180242841,"id":65,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763886759020,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":14,"timestamp":117180272189,"id":67,"parentId":65,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"1264345088","memory.heapUsed":"135073808","memory.heapTotal":"144830464"},"startTime":1763886759049,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":844867,"timestamp":117186268101,"id":70,"tags":{"trigger":"/members"},"startTime":1763886765045,"traceId":"3cf6cfebb868c56e"}] +[{"name":"handle-request","duration":915666,"timestamp":117186267440,"id":68,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg"},"startTime":1763886765044,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":10,"timestamp":117187183172,"id":71,"parentId":68,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg","memory.rss":"1326268416","memory.heapUsed":"146352144","memory.heapTotal":"159993856"},"startTime":1763886765960,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":823,"timestamp":117187511447,"id":73,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886766288,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":15677,"timestamp":117187510872,"id":72,"tags":{"url":"/api/trees"},"startTime":1763886766287,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":5,"timestamp":117187526579,"id":74,"parentId":72,"tags":{"url":"/api/trees","memory.rss":"1326039040","memory.heapUsed":"138733584","memory.heapTotal":"159535104"},"startTime":1763886766303,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":435,"timestamp":117187527675,"id":76,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763886766304,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":11489,"timestamp":117187527389,"id":75,"tags":{"url":"/api/trees"},"startTime":1763886766304,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":7,"timestamp":117187538924,"id":77,"parentId":75,"tags":{"url":"/api/trees","memory.rss":"1326067712","memory.heapUsed":"139821512","memory.heapTotal":"159535104"},"startTime":1763886766316,"traceId":"3cf6cfebb868c56e"},{"name":"client-hmr-latency","duration":86000,"timestamp":117298507700,"id":78,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763886877437,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":14887,"timestamp":117452441526,"id":81,"tags":{"trigger":"/members"},"startTime":1763887031209,"traceId":"3cf6cfebb868c56e"}] +[{"name":"client-hmr-latency","duration":75000,"timestamp":117452369162,"id":82,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763887031445,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":239727,"timestamp":117452440769,"id":79,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=1slm4"},"startTime":1763887031208,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":7,"timestamp":117452680540,"id":83,"parentId":79,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=1slm4","memory.rss":"1350258688","memory.heapUsed":"150714248","memory.heapTotal":"177602560"},"startTime":1763887031448,"traceId":"3cf6cfebb868c56e"},{"name":"client-hmr-latency","duration":69000,"timestamp":117466928903,"id":84,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763887045839,"traceId":"3cf6cfebb868c56e"},{"name":"client-hmr-latency","duration":63000,"timestamp":117485168566,"id":85,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763887064065,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":853,"timestamp":117501290361,"id":87,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887080056,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":12831,"timestamp":117501310660,"id":89,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887080077,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":338211,"timestamp":117501289372,"id":86,"tags":{"url":"/api/trees"},"startTime":1763887080055,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":5,"timestamp":117501627627,"id":90,"parentId":86,"tags":{"url":"/api/trees","memory.rss":"1375686656","memory.heapUsed":"185192800","memory.heapTotal":"196358144"},"startTime":1763887080393,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":332305,"timestamp":117501309907,"id":88,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887080076,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117501642250,"id":91,"parentId":88,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"1375895552","memory.heapUsed":"179710512","memory.heapTotal":"194678784"},"startTime":1763887080408,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":211,"timestamp":117501813118,"id":92,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887080579,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":123,"timestamp":117501813363,"id":93,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887080579,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":139,"timestamp":117501813841,"id":94,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887080580,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":111,"timestamp":117501814004,"id":95,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887080580,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":538,"timestamp":117501815583,"id":97,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763887080581,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":17595,"timestamp":117501814996,"id":96,"tags":{"url":"/api/auth/session"},"startTime":1763887080581,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":6,"timestamp":117501832629,"id":98,"parentId":96,"tags":{"url":"/api/auth/session","memory.rss":"1382494208","memory.heapUsed":"183084880","memory.heapTotal":"215621632"},"startTime":1763887080598,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":154,"timestamp":117501886667,"id":101,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887080652,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":187,"timestamp":117501886851,"id":102,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887080653,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":1234,"timestamp":117501886498,"id":100,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887080652,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":186,"timestamp":117501890942,"id":103,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887080657,"traceId":"3cf6cfebb868c56e"},{"name":"ensure-page","duration":129,"timestamp":117501891159,"id":104,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887080657,"traceId":"3cf6cfebb868c56e"},{"name":"handle-request","duration":12722,"timestamp":117501886181,"id":99,"tags":{"url":"/api/trees"},"startTime":1763887080652,"traceId":"3cf6cfebb868c56e"},{"name":"memory-usage","duration":5,"timestamp":117501898940,"id":108,"parentId":99,"tags":{"url":"/api/trees","memory.rss":"1382801408","memory.heapUsed":"184724176","memory.heapTotal":"215621632"},"startTime":1763887080665,"traceId":"3cf6cfebb868c56e"},{"name":"compile-path","duration":101819,"timestamp":117501892931,"id":107,"tags":{"trigger":"/api/trees/[treeId]"},"startTime":1763887080659,"traceId":"3cf6cfebb868c56e"}] +[{"name":"hot-reloader","duration":104,"timestamp":117528941149,"id":3,"tags":{"version":"16.0.3"},"startTime":1763887107706,"traceId":"e9a6c25356b91814"},{"name":"setup-dev-bundler","duration":313272,"timestamp":117528808947,"id":2,"parentId":1,"tags":{},"startTime":1763887107574,"traceId":"e9a6c25356b91814"},{"name":"start-dev-server","duration":681625,"timestamp":117528545206,"id":1,"tags":{"cpus":"16","platform":"darwin","memory.freeMem":"14516035584","memory.totalMem":"68719476736","memory.heapSizeLimit":"34410070016","memory.rss":"212037632","memory.heapTotal":"69292032","memory.heapUsed":"48558064"},"startTime":1763887107310,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":3598859,"timestamp":117529487837,"id":6,"tags":{"trigger":"/members"},"startTime":1763887108253,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":3599557,"timestamp":117529487471,"id":5,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887108252,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":4060662,"timestamp":117529481678,"id":4,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887108247,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":8,"timestamp":117533542412,"id":7,"parentId":4,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"738910208","memory.heapUsed":"85454232","memory.heapTotal":"121372672"},"startTime":1763887112307,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":806,"timestamp":117533551609,"id":8,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887112316,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":178,"timestamp":117533552696,"id":9,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887112317,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":267,"timestamp":117533555990,"id":10,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887112321,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":195,"timestamp":117533556325,"id":11,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887112321,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":438,"timestamp":117534022472,"id":12,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887112787,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":331,"timestamp":117534023032,"id":13,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887112788,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":329,"timestamp":117534024145,"id":14,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887112789,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":536,"timestamp":117534024538,"id":15,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887112789,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":452599,"timestamp":117534029875,"id":18,"tags":{"trigger":"/api/auth/[...nextauth]"},"startTime":1763887112795,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":1309460,"timestamp":117534027972,"id":16,"tags":{"url":"/api/auth/session"},"startTime":1763887112793,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117535337478,"id":19,"parentId":16,"tags":{"url":"/api/auth/session","memory.rss":"808681472","memory.heapUsed":"100180368","memory.heapTotal":"127332352"},"startTime":1763887114102,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":367,"timestamp":117535371243,"id":23,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114136,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":172,"timestamp":117535371656,"id":24,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114136,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":156,"timestamp":117535372288,"id":25,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114137,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":133,"timestamp":117535372471,"id":26,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114137,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":210000,"timestamp":117535373697,"id":28,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763887114138,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":248352,"timestamp":117535369616,"id":22,"tags":{"trigger":"/api/trees"},"startTime":1763887114134,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":329813,"timestamp":117535368429,"id":20,"tags":{"url":"/api/trees"},"startTime":1763887114133,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117535698289,"id":29,"parentId":20,"tags":{"url":"/api/trees","memory.rss":"839806976","memory.heapUsed":"106743816","memory.heapTotal":"137342976"},"startTime":1763887114463,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":924768,"timestamp":117535373119,"id":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114138,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":4,"timestamp":117536297926,"id":30,"parentId":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"840372224","memory.heapUsed":"107794752","memory.heapTotal":"137605120"},"startTime":1763887115063,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":196,"timestamp":117536300917,"id":31,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":187,"timestamp":117536301148,"id":32,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":153,"timestamp":117536301710,"id":33,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":129,"timestamp":117536301888,"id":34,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115067,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":182767,"timestamp":117536303519,"id":37,"tags":{"trigger":"/api/trees/[treeId]/members"},"startTime":1763887115068,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":901500,"timestamp":117536302526,"id":35,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115067,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117537204066,"id":38,"parentId":35,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"845115392","memory.heapUsed":"115135552","memory.heapTotal":"141295616"},"startTime":1763887115969,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":2695198,"timestamp":117565418714,"id":41,"tags":{"trigger":"/"},"startTime":1763887144182,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":3076539,"timestamp":117565417150,"id":39,"tags":{"url":"/"},"startTime":1763887144181,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568493807,"id":42,"parentId":39,"tags":{"url":"/","memory.rss":"1342955520","memory.heapUsed":"148567208","memory.heapTotal":"175751168"},"startTime":1763887147257,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":372,"timestamp":117568785005,"id":43,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147549,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":538,"timestamp":117568785434,"id":44,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147549,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":236,"timestamp":117568787503,"id":45,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147551,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":150,"timestamp":117568787776,"id":46,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147551,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1768,"timestamp":117568790055,"id":48,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763887147554,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":28132,"timestamp":117568789313,"id":47,"tags":{"url":"/api/auth/session"},"startTime":1763887147553,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568817547,"id":49,"parentId":47,"tags":{"url":"/api/auth/session","memory.rss":"1351725056","memory.heapUsed":"148598168","memory.heapTotal":"179888128"},"startTime":1763887147581,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1025,"timestamp":117568833085,"id":51,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147597,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":30179,"timestamp":117568831944,"id":50,"tags":{"url":"/api/trees"},"startTime":1763887147595,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568862189,"id":52,"parentId":50,"tags":{"url":"/api/trees","memory.rss":"1352810496","memory.heapUsed":"150081848","memory.heapTotal":"180383744"},"startTime":1763887147626,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1087,"timestamp":117568944764,"id":54,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147708,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":21502,"timestamp":117568943861,"id":53,"tags":{"url":"/api/trees"},"startTime":1763887147707,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117568965420,"id":55,"parentId":53,"tags":{"url":"/api/trees","memory.rss":"1353359360","memory.heapUsed":"151373688","memory.heapTotal":"180908032"},"startTime":1763887147729,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":673,"timestamp":117568966844,"id":57,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147730,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":18198,"timestamp":117568966334,"id":56,"tags":{"url":"/api/trees"},"startTime":1763887147730,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568984600,"id":58,"parentId":56,"tags":{"url":"/api/trees","memory.rss":"1353670656","memory.heapUsed":"152519648","memory.heapTotal":"181170176"},"startTime":1763887147748,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":274,"timestamp":117569000416,"id":59,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147764,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":348,"timestamp":117569000743,"id":60,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147764,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":529,"timestamp":117569003344,"id":61,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147767,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":398,"timestamp":117569003932,"id":62,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147767,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1082,"timestamp":117569006666,"id":64,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887147770,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":34424,"timestamp":117569005776,"id":63,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147769,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":10,"timestamp":117569040273,"id":65,"parentId":63,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1356038144","memory.heapUsed":"155072968","memory.heapTotal":"182218752"},"startTime":1763887147804,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":231,"timestamp":117569042146,"id":66,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147806,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":213,"timestamp":117569042421,"id":67,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147806,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":370,"timestamp":117569043930,"id":68,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147807,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":258,"timestamp":117569044344,"id":69,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147808,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":177486,"timestamp":117569046168,"id":72,"tags":{"trigger":"/api/trees/[treeId]/activity-logs"},"startTime":1763887147810,"traceId":"e9a6c25356b91814"}] diff --git a/README.md b/README.md index 5306a4cf..f198b589 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 华夏谱 (HuaXiaPu) - 中国家族树管理系统 +# 华夏家谱 (HuaXiaJiaPu) - 中国家族树管理系统 现代化的中国家族树管理系统,支持多用户协作、权限管理、数据导入导出等功能。 diff --git a/app/layout.tsx b/app/layout.tsx index f3fa756a..0d98dddb 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -12,14 +12,14 @@ const _geist = Geist({ subsets: ["latin"] }) const _geistMono = Geist_Mono({ subsets: ["latin"] }) export const metadata: Metadata = { - title: "华夏谱 (HuaXiaPu) - 家族树管理系统", - description: "现代中国家族树管理系统", + title: "华夏家谱 - 中国家族树管理系统", + description: "现代化的中国家族树管理系统,支持多用户协作、权限管理、数据导入导出等功能", generator: "v0.app", manifest: "/manifest.json", appleWebApp: { capable: true, statusBarStyle: "default", - title: "华夏谱", + title: "华夏家谱", }, icons: { icon: [ diff --git a/app/members/page.tsx b/app/members/page.tsx index 4b4aba49..54760b75 100644 --- a/app/members/page.tsx +++ b/app/members/page.tsx @@ -128,26 +128,44 @@ export default function MembersPage() { return Array.from(groups.entries()) .sort((a, b) => a[0] - b[0]) .map(([generation, members]) => { - // 对每个世代的成员进行排序 - const sortedMembers = [...members].sort((a, b) => { + // 区分家族成员和配偶 + const familyMembers = members.filter(m => { + // 家族成员:有父母关系 或 明确标记为始祖 + const isFounder = m.tags?.includes('始祖') + const hasFamilyParents = m.fatherId || m.motherId + + // 如果有父母关系,肯定是家族成员 + if (hasFamilyParents) return true + + // 如果明确标记为始祖,是家族成员 + if (isFounder) return true + + // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况) + if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true + + // 其他情况(如第1世但有配偶且没有父母的)是配偶身份 + return false + }) + + // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低) + const sortedFamilyMembers = [...familyMembers].sort((a, b) => { // 1. 始祖永远排第一 - const aIsFounder = a.tags?.includes('始祖') || a.generation === 1 - const bIsFounder = b.tags?.includes('始祖') || b.generation === 1 + const aIsFounder = a.tags?.includes('始祖') + const bIsFounder = b.tags?.includes('始祖') if (aIsFounder && !bIsFounder) return -1 if (!aIsFounder && bIsFounder) return 1 - // 2. 按出生日期排序 - return (a.birthDate || "").localeCompare(b.birthDate || "") + // 2. 按出生日期排序(早出生的在前 = 年龄大的在前) + const aDate = a.birthDate || "9999-12-31" + const bDate = b.birthDate || "9999-12-31" + return aDate.localeCompare(bDate) }) // 3. 将配偶插入到主成员后面 const result: typeof members = [] const processedSpouses = new Set() - sortedMembers.forEach(member => { - // 跳过已经作为配偶处理过的成员 - if (processedSpouses.has(member.id)) return - + sortedFamilyMembers.forEach(member => { result.push(member) // 如果有配偶,将配偶紧跟在后面 @@ -159,6 +177,9 @@ export default function MembersPage() { processedSpouses.add(spouseId) } }) + } else { + // 没有配偶,添加空白占位符 + result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any) } }) @@ -316,6 +337,11 @@ export default function MembersPage() {
{members.map((member) => { + // 检查是否是占位符 + if ((member as any).isPlaceholder) { + return
+ } + // 判断是否是配偶: // 1. 没有父母ID // 2. 有配偶ID @@ -332,7 +358,11 @@ export default function MembersPage() { return (
- +
-
-
- - 1 - - : - +
+
+ 1 + : + {stats.maleCount > 0 ? (stats.femaleCount / stats.maleCount).toFixed(2) : '0'}
-
- 男性 : 女性 -
- - {/* 双色进度条 */} -
-
- - - 男性 {stats.maleCount} - - - 女性 {stats.femaleCount} - - -
-
-
0 ? (stats.maleCount / stats.totalMembers * 100) : 0}%` }} - > - {stats.totalMembers > 0 && stats.maleCount > 0 && ( - - {Math.round(stats.maleCount / stats.totalMembers * 100)}% - - )} -
-
0 ? (stats.femaleCount / stats.totalMembers * 100) : 0}%` }} - > - {stats.totalMembers > 0 && stats.femaleCount > 0 && ( - - {Math.round(stats.femaleCount / stats.totalMembers * 100)}% - - )} -
-
+
+ 男性 {stats.maleCount} · 女性 {stats.femaleCount}
diff --git a/components/site-header.tsx b/components/site-header.tsx index 75e60757..7da7c83e 100644 --- a/components/site-header.tsx +++ b/components/site-header.tsx @@ -228,7 +228,7 @@ export function SiteHeader() {
- 华夏谱 + 华夏家谱 {/* 家族树选择器 */}