From d797f1abb94703c9152dd0c69d40d2cb770f4323 Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Sun, 23 Nov 2025 14:46:53 +0800 Subject: [PATCH] 0.0.4.0 --- .next/dev/logs/next-development.log | 1783 ++ .next/dev/server/app-paths-manifest.json | 1 + .../dev/server/app/relationship-test/page.js | 14 + .../server/app/relationship-test/page.js.map | 5 + .../page/app-paths-manifest.json | 3 + .../page/build-manifest.json | 22 + .../page/next-font-manifest.json | 11 + .../page/react-loadable-manifest.json | 1 + .../page/server-reference-manifest.json | 4 + .../page_client-reference-manifest.js | 2 + .../tree/page_client-reference-manifest.js | 2 +- ...relationship-test_page_actions_40826806.js | 7 + ...tionship-test_page_actions_40826806.js.map | 6 + .../chunks/ssr/4e98a_next_dist_429ef594._.js | 9299 +++++++ .../ssr/4e98a_next_dist_429ef594._.js.map | 50 + ...s_go-new_chinese-family-tree_0fb7be34._.js | 3144 +++ ...-new_chinese-family-tree_0fb7be34._.js.map | 15 + ...s_go-new_chinese-family-tree_122387b1._.js | 2765 ++ ...-new_chinese-family-tree_122387b1._.js.map | 13 + .../ssr/[root-of-the-server]__1c65776d._.js | 122 +- .../[root-of-the-server]__1c65776d._.js.map | 2 +- .../ssr/[root-of-the-server]__297e3b80._.js | 58 + .../[root-of-the-server]__297e3b80._.js.map | 8 + .../ssr/[root-of-the-server]__a5d92604._.js | 3986 +++ .../[root-of-the-server]__a5d92604._.js.map | 18 + .../ssr/[root-of-the-server]__ee197932._.js | 3418 +++ .../[root-of-the-server]__ee197932._.js.map | 16 + .../chunks/ssr/a0629__pnpm_4871c6a1._.js | 22102 +++++++++++++++ .../chunks/ssr/a0629__pnpm_4871c6a1._.js.map | 90 + .../chunks/ssr/a0629__pnpm_51d5fd3b._.js | 23128 ++++++++++++++++ .../chunks/ssr/a0629__pnpm_51d5fd3b._.js.map | 224 + .../chunks/ssr/a0629__pnpm_f4065fad._.js | 23119 +++++++++++++++ .../chunks/ssr/a0629__pnpm_f4065fad._.js.map | 224 + ...js_dist_relationship_min_mjs_f4266f1b._.js | 7231 +++++ ...ist_relationship_min_mjs_f4266f1b._.js.map | 6 + .next/dev/server/next-font-manifest.js | 2 +- .next/dev/server/next-font-manifest.json | 4 + ...s_go-new_chinese-family-tree_1f36f54f._.js | 3345 +++ ...-new_chinese-family-tree_1f36f54f._.js.map | 15 + ...s_go-new_chinese-family-tree_38445918._.js | 2908 ++ ...-new_chinese-family-tree_38445918._.js.map | 13 + ...s_go-new_chinese-family-tree_65759bc9._.js | 4244 +++ ...-new_chinese-family-tree_65759bc9._.js.map | 18 + ...tree_app_globals_css_bad6b30c._.single.css | 55 + ..._app_globals_css_bad6b30c._.single.css.map | 2 +- ...p_relationship-test_page_tsx_03538adf._.js | 8 + ...amily-tree_app_tree_page_tsx_03538adf._.js | 7 +- ...s_go-new_chinese-family-tree_cb1a7141._.js | 3636 +++ ...-new_chinese-family-tree_cb1a7141._.js.map | 16 + ...s_go-new_chinese-family-tree_ed9ee666._.js | 122 +- ...-new_chinese-family-tree_ed9ee666._.js.map | 2 +- .../[root-of-the-server]__6d150df4._.css | 55 + .../[root-of-the-server]__6d150df4._.css.map | 2 +- .../static/chunks/a0629__pnpm_1e4af1b7._.js | 46 + .../chunks/a0629__pnpm_1e4af1b7._.js.map | 5 + .../static/chunks/a0629__pnpm_279b9260._.js | 15070 ++++++++++ .../chunks/a0629__pnpm_279b9260._.js.map | 43 + .../static/chunks/a0629__pnpm_30736f75._.js | 7218 +++++ .../chunks/a0629__pnpm_30736f75._.js.map | 45 + .../static/chunks/a0629__pnpm_549bb71b._.js | 20368 ++++++++++++++ .../chunks/a0629__pnpm_549bb71b._.js.map | 226 + .../static/chunks/a0629__pnpm_6ea68b6b._.js | 46 + .../chunks/a0629__pnpm_6ea68b6b._.js.map | 5 + .../static/chunks/a0629__pnpm_a9810fcf._.js | 20377 ++++++++++++++ .../chunks/a0629__pnpm_a9810fcf._.js.map | 226 + .../static/chunks/a0629__pnpm_c0097265._.js | 46 + .../chunks/a0629__pnpm_c0097265._.js.map | 5 + .../c7bc8_canvg_lib_index_es_63044146.js | 7 + .../c7bc8_canvg_lib_index_es_84e6d65c.js | 7 + .../c7bc8_canvg_lib_index_es_bcdbfbc4.js | 7 + ...js_dist_relationship_min_mjs_d2477a04._.js | 7231 +++++ ...ist_relationship_min_mjs_d2477a04._.js.map | 6 + ...dompurify_dist_purify_es_mjs_63044146._.js | 7 + ...dompurify_dist_purify_es_mjs_84e6d65c._.js | 7 + ...dompurify_dist_purify_es_mjs_bcdbfbc4._.js | 7 + ...9_html2canvas_dist_html2canvas_63044146.js | 7 + ...9_html2canvas_dist_html2canvas_84e6d65c.js | 7 + ...9_html2canvas_dist_html2canvas_bcdbfbc4.js | 7 + ...ore_dist_dom-to-image-more_min_63044146.js | 7 + ...ore_dist_dom-to-image-more_min_84e6d65c.js | 7 + ...ore_dist_dom-to-image-more_min_bcdbfbc4.js | 7 + .next/dev/trace | 29 + .next/dev/types/routes.d.ts | 6 +- .next/dev/types/validator.ts | 18 + app/api/trees/[treeId]/relationship/route.ts | 66 + app/relationship-test/page.tsx | 245 + app/tree/page.tsx | 248 +- components/tree/d3-org-chart-flow.tsx | 30 +- components/tree/family-node.tsx | 29 +- components/tree/tree-layout.tsx | 21 +- docs/RELATIONSHIP_CALCULATOR.md | 210 + hooks/use-relationship.ts | 175 + lib/relationship-calculator.ts | 470 + node_modules/.pnpm-workspace-state-v1.json | 2 +- node_modules/.pnpm/lock.yaml | 8 + package.json | 1 + pnpm-lock.yaml | 8 + types/relationship.d.ts | 19 + 98 files changed, 187824 insertions(+), 161 deletions(-) create mode 100644 .next/dev/server/app/relationship-test/page.js create mode 100644 .next/dev/server/app/relationship-test/page.js.map create mode 100644 .next/dev/server/app/relationship-test/page/app-paths-manifest.json create mode 100644 .next/dev/server/app/relationship-test/page/build-manifest.json create mode 100644 .next/dev/server/app/relationship-test/page/next-font-manifest.json create mode 100644 .next/dev/server/app/relationship-test/page/react-loadable-manifest.json create mode 100644 .next/dev/server/app/relationship-test/page/server-reference-manifest.json create mode 100644 .next/dev/server/app/relationship-test/page_client-reference-manifest.js create mode 100644 .next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js create mode 100644 .next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js.map create mode 100644 .next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js create mode 100644 .next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js.map create mode 100644 .next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js create mode 100644 .next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js.map create mode 100644 .next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js create mode 100644 .next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js.map create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js.map create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js create mode 100644 .next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js.map create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_4871c6a1._.js create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_4871c6a1._.js.map create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_51d5fd3b._.js create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_51d5fd3b._.js.map create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_f4065fad._.js create mode 100644 .next/dev/server/chunks/ssr/a0629__pnpm_f4065fad._.js.map create mode 100644 .next/dev/server/chunks/ssr/ebfed_relationship_js_dist_relationship_min_mjs_f4266f1b._.js create mode 100644 .next/dev/server/chunks/ssr/ebfed_relationship_js_dist_relationship_min_mjs_f4266f1b._.js.map create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_1f36f54f._.js create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_1f36f54f._.js.map create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_38445918._.js create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_38445918._.js.map create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js.map create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_app_relationship-test_page_tsx_03538adf._.js create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_cb1a7141._.js create mode 100644 .next/dev/static/chunks/Documents_go-new_chinese-family-tree_cb1a7141._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_1e4af1b7._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_1e4af1b7._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_279b9260._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_279b9260._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_30736f75._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_30736f75._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_549bb71b._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_549bb71b._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_6ea68b6b._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_6ea68b6b._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_a9810fcf._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_a9810fcf._.js.map create mode 100644 .next/dev/static/chunks/a0629__pnpm_c0097265._.js create mode 100644 .next/dev/static/chunks/a0629__pnpm_c0097265._.js.map create mode 100644 .next/dev/static/chunks/c7bc8_canvg_lib_index_es_63044146.js create mode 100644 .next/dev/static/chunks/c7bc8_canvg_lib_index_es_84e6d65c.js create mode 100644 .next/dev/static/chunks/c7bc8_canvg_lib_index_es_bcdbfbc4.js create mode 100644 .next/dev/static/chunks/ebfed_relationship_js_dist_relationship_min_mjs_d2477a04._.js create mode 100644 .next/dev/static/chunks/ebfed_relationship_js_dist_relationship_min_mjs_d2477a04._.js.map create mode 100644 .next/dev/static/chunks/f35fa_dompurify_dist_purify_es_mjs_63044146._.js create mode 100644 .next/dev/static/chunks/f35fa_dompurify_dist_purify_es_mjs_84e6d65c._.js create mode 100644 .next/dev/static/chunks/f35fa_dompurify_dist_purify_es_mjs_bcdbfbc4._.js create mode 100644 .next/dev/static/chunks/fdeb9_html2canvas_dist_html2canvas_63044146.js create mode 100644 .next/dev/static/chunks/fdeb9_html2canvas_dist_html2canvas_84e6d65c.js create mode 100644 .next/dev/static/chunks/fdeb9_html2canvas_dist_html2canvas_bcdbfbc4.js create mode 100644 .next/dev/static/chunks/ffc37_dom-to-image-more_dist_dom-to-image-more_min_63044146.js create mode 100644 .next/dev/static/chunks/ffc37_dom-to-image-more_dist_dom-to-image-more_min_84e6d65c.js create mode 100644 .next/dev/static/chunks/ffc37_dom-to-image-more_dist_dom-to-image-more_min_bcdbfbc4.js create mode 100644 app/api/trees/[treeId]/relationship/route.ts create mode 100644 app/relationship-test/page.tsx create mode 100644 docs/RELATIONSHIP_CALCULATOR.md create mode 100644 hooks/use-relationship.ts create mode 100644 lib/relationship-calculator.ts create mode 100644 types/relationship.d.ts diff --git a/.next/dev/logs/next-development.log b/.next/dev/logs/next-development.log index e11fdefb..936a1f1d 100644 --- a/.next/dev/logs/next-development.log +++ b/.next/dev/logs/next-development.log @@ -878,3 +878,1786 @@ Import traces: [02:02:09.007] 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":1763875571635} [02:02:30.275] Server LOG 🌳 GET /api/trees 返回数据: {} [02:03:01.832] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:10:39.025] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:10:40.108] 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":1763876082739} +[02:10:40.339] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:10:40.360] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:11:26.036] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:11:26.359] 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:11:26.359] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/tree","route":"/tree"} +[02:11:26.359] 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":1763876128962} +[02:11:26.507] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:11:26.513] Server LOG 🌳 GET /api/trees/[treeId] 返回数据: {} +[02:11:26.581] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:11:29.257] 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":1763876131888} +[02:11:29.559] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:11:29.595] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:42.339] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:43.232] 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":1763876205866} +[02:12:43.451] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:43.467] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:51.943] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:55.826] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:12:55.967] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:55.984] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:12:56.018] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:12:56.272] 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:12:56.272] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} +[02:12:56.272] 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":1763876218907} +[02:14:08.091] Server LOG ✓ Compiled in 136ms +[02:14:17.276] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:14:21.453] Server LOG ✓ Compiled in 62ms +[02:14:56.264] Server LOG ✓ Compiled in 51ms +[02:14:58.312] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:15:00.619] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:15:00.782] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:15:00.802] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:15:00.835] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:15:00.837] 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:15:00.837] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} +[02:15:00.837] 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":1763876343475} +[02:15:06.637] Server LOG ✓ Compiled in 64ms +[02:15:22.532] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:15:23.187] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:15:23.203] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:15:23.243] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:15:23.475] 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:15:23.475] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} +[02:15:23.475] 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":1763876365931} +[02:16:40.867] Server LOG ✓ Compiled in 72ms +[02:16:54.113] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:17:06.355] Server LOG ✓ Compiled in 60ms +[02:17:46.765] Server LOG ✓ Compiled in 54ms +[02:17:58.806] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:19:21.273] Server LOG ✓ Compiled in 57ms +[02:19:31.319] Server LOG ✓ Compiled in 58ms +[02:19:36.250] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:20:02.591] Server LOG ✓ Compiled in 56ms +[02:20:05.623] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:20:23.408] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:20:57.937] Server LOG ✓ Compiled in 59ms +[02:21:11.082] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:21:50.272] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:23:22.879] Server LOG ✓ Compiled in 63ms +[02:23:35.673] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:25:51.596] Server LOG ✓ Compiled in 51ms +[02:25:57.617] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:26:02.567] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:26:02.715] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:26:02.735] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:26:02.777] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:26:03.040] 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:26:03.040] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} +[02:26:03.040] 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":1763877005491} +[02:26:03.105] Server LOG ✓ Compiled in 76ms +[02:26:16.562] Server LOG ✓ Compiled in 63ms +[02:28:00.623] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:00.664] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:07.231] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:07.267] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:28:07.311] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zht70019hhxlg7l25qh6 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zht70019hhxlg7l25qh6","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877129973} +[02:28:07.543] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:07.567] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:08.918] Server LOG ✓ Compiled in 62ms +[02:28:14.439] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:14.456] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:14.534] 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":1763877137191} +[02:28:18.699] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:18.716] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:18.735] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:18.771] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:28:18.796] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zht70019hhxlg7l25qh6 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zht70019hhxlg7l25qh6","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763877141447} +[02:28:20.949] Server LOG ✓ Compiled in 56ms +[02:28:23.231] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:23.254] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:23.300] 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":1763877145959} +[02:28:35.238] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:45.114] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:50.430] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold +[02:28:51.071] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:51.084] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:28:51.111] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:28:51.230] 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:28:51.230] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/relationship-test","route":"/relationship-test"} +[02:28:51.230] 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":1763877173826} +[02:29:27.405] Server LOG ✓ Compiled in 55ms +[02:29:31.526] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:29:53.141] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:30:56.763] Server LOG ✓ Compiled in 119ms +[02:31:06.333] Server LOG ✓ Compiled in 57ms +[02:31:14.771] Server LOG ✓ Compiled in 76ms +[02:31:21.878] Server LOG ✓ Compiled in 141ms +[02:31:24.830] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:31:56.283] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:31:57.565] 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":1763877360227} +[02:31:57.776] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:31:57.790] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:32:17.012] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:32:17.805] 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":1763877380465} +[02:32:18.031] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:32:18.046] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:33:46.732] Server LOG ✓ Compiled in 55ms +[02:33:55.408] Server LOG ✓ Compiled in 75ms +[02:33:55.501] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:33:56.432] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:14.563] Server LOG ✓ Compiled in 60ms +[02:34:31.152] Server LOG ✓ Compiled in 132ms +[02:34:50.255] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:51.578] Server LOG ✓ Compiled in 254ms +[02:34:54.135] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:54.166] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:34:54.216] 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":1763877536890} +[02:34:54.438] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:54.455] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:56.497] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:56.514] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:34:56.586] 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":1763877539255} +[02:35:01.014] Server LOG ✓ Compiled in 63ms +[02:35:48.901] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:35:53.702] Server LOG ✓ Compiled in 83ms +[02:35:56.447] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:35:56.448] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:36:07.769] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:36:07.769] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:36:09.627] Server LOG ✓ Compiled in 88ms +[02:36:29.392] Server LOG ✓ Compiled in 73ms +[02:36:42.254] Server LOG ✓ Compiled in 78ms +[02:36:56.406] Server LOG ✓ Compiled in 84ms +[02:37:13.416] Server LOG ✓ Compiled in 122ms +[02:37:13.754] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:18.431] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:18.478] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:18.503] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:18.526] 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":1763877681193} +[02:37:18.528] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:37:20.465] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:20.482] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:20.558] 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":1763877683231} +[02:37:29.863] Server LOG ✓ Compiled in 61ms +[02:37:31.801] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:31.818] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:31.843] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:31.855] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[02:37:31.891] 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":1763877694559} +[02:37:33.585] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:33.603] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:37:33.738] 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":1763877696343} +[02:37:39.127] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:37:39.127] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:37:49.109] Server LOG ✓ Compiled in 53ms +[02:38:04.159] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:04.159] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:14.235] Server LOG 🌳 GET /api/trees 返回数据: {} +[02:38:16.941] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:16.941] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:28.381] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:28.381] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:36.655] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:36.655] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:44.082] Server LOG ✓ Compiled in 421ms +[02:38:46.342] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:46.342] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:54.228] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:54.228] Browser WARN Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. +[02:38:58.825] Server LOG ✓ Compiled in 77ms +[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-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}. diff --git a/.next/dev/server/app-paths-manifest.json b/.next/dev/server/app-paths-manifest.json index 44d59e6c..1586f93a 100644 --- a/.next/dev/server/app-paths-manifest.json +++ b/.next/dev/server/app-paths-manifest.json @@ -9,6 +9,7 @@ "/members/[id]/page": "app/members/[id]/page.js", "/members/page": "app/members/page.js", "/page": "app/page.js", + "/relationship-test/page": "app/relationship-test/page.js", "/timeline/page": "app/timeline/page.js", "/tree/page": "app/tree/page.js" } \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page.js b/.next/dev/server/app/relationship-test/page.js new file mode 100644 index 00000000..f887c2ae --- /dev/null +++ b/.next/dev/server/app/relationship-test/page.js @@ -0,0 +1,14 @@ +var R=require("../../chunks/ssr/[turbopack]_runtime.js")("server/app/relationship-test/page.js") +R.c("server/chunks/ssr/4e98a_next_dist_429ef594._.js") +R.c("server/chunks/ssr/[root-of-the-server]__297e3b80._.js") +R.c("server/chunks/ssr/4e98a_next_dist_0643e073._.js") +R.c("server/chunks/ssr/[root-of-the-server]__7f148858._.js") +R.c("server/chunks/ssr/4e98a_next_dist_client_components_builtin_global-error_196f2367.js") +R.c("server/chunks/ssr/[root-of-the-server]__b37c7274._.js") +R.c("server/chunks/ssr/Documents_go-new_chinese-family-tree_app_loading_tsx_b1f283e0._.js") +R.c("server/chunks/ssr/4e98a_next_dist_client_components_1ee43648._.js") +R.c("server/chunks/ssr/4e98a_next_dist_client_components_builtin_forbidden_243a9611.js") +R.c("server/chunks/ssr/4e98a_next_dist_client_components_builtin_unauthorized_719c1458.js") +R.c("server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js") +R.m("[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/esm/build/templates/app-page.js?page=/relationship-test/page { GLOBAL_ERROR_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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)") +module.exports=R.m("[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/esm/build/templates/app-page.js?page=/relationship-test/page { GLOBAL_ERROR_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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)").exports diff --git a/.next/dev/server/app/relationship-test/page.js.map b/.next/dev/server/app/relationship-test/page.js.map new file mode 100644 index 00000000..c15d7ec0 --- /dev/null +++ b/.next/dev/server/app/relationship-test/page.js.map @@ -0,0 +1,5 @@ +{ + "version": 3, + "sources": [], + "sections": [] +} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page/app-paths-manifest.json b/.next/dev/server/app/relationship-test/page/app-paths-manifest.json new file mode 100644 index 00000000..d546b582 --- /dev/null +++ b/.next/dev/server/app/relationship-test/page/app-paths-manifest.json @@ -0,0 +1,3 @@ +{ + "/relationship-test/page": "app/relationship-test/page.js" +} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page/build-manifest.json b/.next/dev/server/app/relationship-test/page/build-manifest.json new file mode 100644 index 00000000..c38372f3 --- /dev/null +++ b/.next/dev/server/app/relationship-test/page/build-manifest.json @@ -0,0 +1,22 @@ +{ + "devFiles": [], + "ampDevFiles": [], + "polyfillFiles": [ + "static/chunks/4e98a_next_dist_build_polyfills_polyfill-nomodule.js" + ], + "lowPriorityFiles": [], + "rootMainFiles": [ + "static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_67e3ae72._.js", + "static/chunks/4e98a_next_dist_compiled_react-dom_da552622._.js", + "static/chunks/4e98a_next_dist_compiled_react-server-dom-turbopack_c5146742._.js", + "static/chunks/4e98a_next_dist_compiled_next-devtools_index_59922e46.js", + "static/chunks/4e98a_next_dist_compiled_21c48460._.js", + "static/chunks/4e98a_next_dist_client_d594727a._.js", + "static/chunks/4e98a_next_dist_24912bf1._.js", + "static/chunks/6704b_@swc_helpers_cjs_8771abe4._.js", + "static/chunks/Documents_go-new_chinese-family-tree_a0ff3932._.js", + "static/chunks/turbopack-Documents_go-new_chinese-family-tree_b39b5e67._.js" + ], + "pages": {}, + "ampFirstPages": [] +} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page/next-font-manifest.json b/.next/dev/server/app/relationship-test/page/next-font-manifest.json new file mode 100644 index 00000000..b0e385ed --- /dev/null +++ b/.next/dev/server/app/relationship-test/page/next-font-manifest.json @@ -0,0 +1,11 @@ +{ + "pages": {}, + "app": { + "[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" + ] + }, + "appUsingSizeAdjust": true, + "pagesUsingSizeAdjust": false +} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page/react-loadable-manifest.json b/.next/dev/server/app/relationship-test/page/react-loadable-manifest.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.next/dev/server/app/relationship-test/page/react-loadable-manifest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page/server-reference-manifest.json b/.next/dev/server/app/relationship-test/page/server-reference-manifest.json new file mode 100644 index 00000000..27a92af5 --- /dev/null +++ b/.next/dev/server/app/relationship-test/page/server-reference-manifest.json @@ -0,0 +1,4 @@ +{ + "node": {}, + "edge": {} +} \ No newline at end of file diff --git a/.next/dev/server/app/relationship-test/page_client-reference-manifest.js b/.next/dev/server/app/relationship-test/page_client-reference-manifest.js new file mode 100644 index 00000000..745b431f --- /dev/null +++ b/.next/dev/server/app/relationship-test/page_client-reference-manifest.js @@ -0,0 +1,2 @@ +globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {}; +globalThis.__RSC_MANIFEST["/relationship-test/page"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{"[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/esm/client/components/layout-router.js ":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/layout-router.js":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js ":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js ":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js ":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js ":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js ":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js ":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js ":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js ":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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 ":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[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":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_38445918._.js","/_next/static/chunks/a0629__pnpm_279b9260._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_relationship-test_page_tsx_03538adf._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_38445918._.js","/_next/static/chunks/a0629__pnpm_279b9260._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_relationship-test_page_tsx_03538adf._.js"],"async":false}},"ssrModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js","server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js","server/chunks/ssr/a0629__pnpm_4871c6a1._.js"],"async":false}}},"edgeSSRModuleMapping":{},"rscModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{},"entryCSSFiles":{"[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/client/components/builtin/global-error":[],"[project]/Documents/go-new/chinese-family-tree/app/layout":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}],"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}]},"entryJSFiles":{"[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/client/components/builtin/global-error":["static/chunks/4e98a_next_dist_85312e63._.js","static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"[project]/Documents/go-new/chinese-family-tree/app/layout":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","static/chunks/Documents_go-new_chinese-family-tree_38445918._.js","static/chunks/a0629__pnpm_279b9260._.js","static/chunks/Documents_go-new_chinese-family-tree_app_relationship-test_page_tsx_03538adf._.js"]}} diff --git a/.next/dev/server/app/tree/page_client-reference-manifest.js b/.next/dev/server/app/tree/page_client-reference-manifest.js index fe40358c..ffb6dadd 100644 --- a/.next/dev/server/app/tree/page_client-reference-manifest.js +++ b/.next/dev/server/app/tree/page_client-reference-manifest.js @@ -1,2 +1,2 @@ globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {}; -globalThis.__RSC_MANIFEST["/tree/page"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{"[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/esm/client/components/layout-router.js ":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/layout-router.js":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js ":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js ":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js ":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js ":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js ":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js ":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js ":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js ":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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 ":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[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":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/a0629__pnpm_2f1a5cab._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_ed9ee666._.js","/_next/static/chunks/3032b_dexie_2a245be4._.js","/_next/static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","/_next/static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","/_next/static/chunks/a0629__pnpm_3724daf1._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/a0629__pnpm_2f1a5cab._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_ed9ee666._.js","/_next/static/chunks/3032b_dexie_2a245be4._.js","/_next/static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","/_next/static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","/_next/static/chunks/a0629__pnpm_3724daf1._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"],"async":false}},"ssrModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js","server/chunks/ssr/ffc37_dom-to-image-more_dist_dom-to-image-more_min_095bbe14.js","server/chunks/ssr/[root-of-the-server]__1c65776d._.js","server/chunks/ssr/4e98a_next_dist_c8d928f7._.js","server/chunks/ssr/3032b_dexie_289025a5._.js","server/chunks/ssr/fdeb9_html2canvas_dist_html2canvas_esm_1dd0a06b.js","server/chunks/ssr/12b8b_core-js_371d9e96._.js","server/chunks/ssr/c7bc8_canvg_lib_index_cjs_92ddeafa._.js","server/chunks/ssr/14b10_pako_dist_pako_esm_mjs_700bcae7._.js","server/chunks/ssr/0f47f_jspdf_dist_jspdf_node_min_80a1e009.js","server/chunks/ssr/a0629__pnpm_0d3d5034._.js"],"async":false}}},"edgeSSRModuleMapping":{},"rscModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{},"entryCSSFiles":{"[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/client/components/builtin/global-error":[],"[project]/Documents/go-new/chinese-family-tree/app/layout":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}],"[project]/Documents/go-new/chinese-family-tree/app/tree/page":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}]},"entryJSFiles":{"[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/client/components/builtin/global-error":["static/chunks/4e98a_next_dist_85312e63._.js","static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"[project]/Documents/go-new/chinese-family-tree/app/layout":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"[project]/Documents/go-new/chinese-family-tree/app/tree/page":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","static/chunks/a0629__pnpm_2f1a5cab._.js","static/chunks/Documents_go-new_chinese-family-tree_ed9ee666._.js","static/chunks/3032b_dexie_2a245be4._.js","static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","static/chunks/a0629__pnpm_3724daf1._.js","static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"]}} +globalThis.__RSC_MANIFEST["/tree/page"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{"[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/esm/client/components/layout-router.js ":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/layout-router.js":{"id":"[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/client/components/layout-router.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js ":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/render-from-template-context.js":{"id":"[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/client/components/render-from-template-context.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js ":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-page.js":{"id":"[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/client/components/client-page.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js ":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/client-segment.js":{"id":"[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/client/components/client-segment.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js ":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/client/components/http-access-fallback/error-boundary.js":{"id":"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js ":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/metadata/generate/icon-mark.js":{"id":"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js ":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/lib/framework/boundary-components.js":{"id":"[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/lib/framework/boundary-components.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js ":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/esm/next-devtools/userspace/app/segment-explorer-node.js":{"id":"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js ":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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/client/components/builtin/global-error.js":{"id":"[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/client/components/builtin/global-error.js [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/4e98a_next_dist_85312e63._.js","/_next/static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"async":false},"[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 ":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[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":{"id":"[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 [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx ":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/a0629__pnpm_c0097265._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js","/_next/static/chunks/3032b_dexie_2a245be4._.js","/_next/static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","/_next/static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","/_next/static/chunks/ebfed_relationship_js_dist_relationship_min_mjs_d2477a04._.js","/_next/static/chunks/a0629__pnpm_a9810fcf._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"],"async":false},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)","name":"*","chunks":["/_next/static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","/_next/static/chunks/a0629__pnpm_8124a564._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","/_next/static/chunks/a0629__pnpm_c0097265._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js","/_next/static/chunks/3032b_dexie_2a245be4._.js","/_next/static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","/_next/static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","/_next/static/chunks/ebfed_relationship_js_dist_relationship_min_mjs_d2477a04._.js","/_next/static/chunks/a0629__pnpm_a9810fcf._.js","/_next/static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"],"async":false}},"ssrModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/4e98a_next_dist_8a92b219._.js","server/chunks/ssr/[root-of-the-server]__1aaf5479._.js"],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js"],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-ssr] (ecmascript)","name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__9d08ee54._.js","server/chunks/ssr/a0629__pnpm_a0c33371._.js","server/chunks/ssr/ffc37_dom-to-image-more_dist_dom-to-image-more_min_095bbe14.js","server/chunks/ssr/[root-of-the-server]__a5d92604._.js","server/chunks/ssr/4e98a_next_dist_c8d928f7._.js","server/chunks/ssr/3032b_dexie_289025a5._.js","server/chunks/ssr/fdeb9_html2canvas_dist_html2canvas_esm_1dd0a06b.js","server/chunks/ssr/12b8b_core-js_371d9e96._.js","server/chunks/ssr/c7bc8_canvg_lib_index_cjs_92ddeafa._.js","server/chunks/ssr/14b10_pako_dist_pako_esm_mjs_700bcae7._.js","server/chunks/ssr/0f47f_jspdf_dist_jspdf_node_min_80a1e009.js","server/chunks/ssr/ebfed_relationship_js_dist_relationship_min_mjs_f4266f1b._.js","server/chunks/ssr/a0629__pnpm_51d5fd3b._.js"],"async":false}}},"edgeSSRModuleMapping":{},"rscModuleMapping":{"[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/client/components/layout-router.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/layout-router.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/render-from-template-context.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/render-from-template-context.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-page.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-page.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/client-segment.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/client-segment.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/http-access-fallback/error-boundary.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/client/components/http-access-fallback/error-boundary.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/metadata/generate/icon-mark.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/metadata/generate/icon-mark.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/lib/framework/boundary-components.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/lib/framework/boundary-components.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/next-devtools/userspace/app/segment-explorer-node.js [app-client] (ecmascript)":{"*":{"id":"[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/esm/next-devtools/userspace/app/segment-explorer-node.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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/client/components/builtin/global-error.js [app-client] (ecmascript)":{"*":{"id":"[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/client/components/builtin/global-error.js [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[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 [app-client] (ecmascript)":{"*":{"id":"[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 [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/pwa/pwa-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/providers/session-provider.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}},"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-client] (ecmascript)":{"*":{"id":"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-rsc] (client reference proxy)","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{},"entryCSSFiles":{"[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/client/components/builtin/global-error":[],"[project]/Documents/go-new/chinese-family-tree/app/layout":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}],"[project]/Documents/go-new/chinese-family-tree/app/tree/page":[{"path":"static/chunks/[root-of-the-server]__6d150df4._.css","inlined":false}]},"entryJSFiles":{"[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/client/components/builtin/global-error":["static/chunks/4e98a_next_dist_85312e63._.js","static/chunks/4e98a_next_dist_client_components_builtin_global-error_98813eb2.js"],"[project]/Documents/go-new/chinese-family-tree/app/layout":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js"],"[project]/Documents/go-new/chinese-family-tree/app/tree/page":["static/chunks/Documents_go-new_chinese-family-tree_2268dbd5._.js","static/chunks/a0629__pnpm_8124a564._.js","static/chunks/Documents_go-new_chinese-family-tree_app_layout_tsx_98813eb2._.js","static/chunks/a0629__pnpm_c0097265._.js","static/chunks/Documents_go-new_chinese-family-tree_65759bc9._.js","static/chunks/3032b_dexie_2a245be4._.js","static/chunks/14b10_pako_dist_pako_esm_mjs_63ae9500._.js","static/chunks/0f47f_jspdf_dist_jspdf_es_min_f400e067.js","static/chunks/ebfed_relationship_js_dist_relationship_min_mjs_d2477a04._.js","static/chunks/a0629__pnpm_a9810fcf._.js","static/chunks/Documents_go-new_chinese-family-tree_app_tree_page_tsx_03538adf._.js"]}} diff --git a/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js b/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js new file mode 100644 index 00000000..974eb5d5 --- /dev/null +++ b/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js @@ -0,0 +1,7 @@ +module.exports = [ +"[project]/Documents/go-new/chinese-family-tree/.next-internal/server/app/relationship-test/page/actions.js [app-rsc] (server actions loader, ecmascript)", ((__turbopack_context__, module, exports) => { + +}), +]; + +//# sourceMappingURL=168ba__next-internal_server_app_relationship-test_page_actions_40826806.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js.map b/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js.map new file mode 100644 index 00000000..f89d7b7e --- /dev/null +++ b/.next/dev/server/chunks/ssr/168ba__next-internal_server_app_relationship-test_page_actions_40826806.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "sources": [], + "sections": [ + {"offset": {"line": 3, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}] +} \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js b/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js new file mode 100644 index 00000000..ada046b7 --- /dev/null +++ b/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js @@ -0,0 +1,9299 @@ +module.exports = [ +"[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/esm/server/route-modules/app-page/module.compiled.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { + +if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable +; +else { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + else { + if ("TURBOPACK compile-time truthy", 1) { + if ("TURBOPACK compile-time truthy", 1) { + module.exports = __turbopack_context__.r("[externals]/next/dist/compiled/next-server/app-page-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-page-turbo.runtime.dev.js, cjs)"); + } else //TURBOPACK unreachable + ; + } else //TURBOPACK unreachable + ; + } +} //# sourceMappingURL=module.compiled.js.map +}), +"[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/esm/server/route-kind.js [app-rsc] (ecmascript, Next.js server utility)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/esm/server/route-kind.js [app-rsc] (ecmascript)"));}), +"[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/esm/server/instrumentation/utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getRevalidateReason", + ()=>getRevalidateReason +]); +function getRevalidateReason(params) { + if (params.isOnDemandRevalidate) { + return 'on-demand'; + } + if (params.isStaticGeneration) { + return 'stale'; + } + return undefined; +} //# sourceMappingURL=utils.js.map +}), +"[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/esm/server/app-render/interop-default.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Interop between "export default" and "module.exports". + */ __turbopack_context__.s([ + "interopDefault", + ()=>interopDefault +]); +function interopDefault(mod) { + return mod.default || mod; +} //# sourceMappingURL=interop-default.js.map +}), +"[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/esm/server/app-render/strip-flight-headers.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "stripFlightHeaders", + ()=>stripFlightHeaders +]); +var __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/client/components/app-router-headers.js [app-rsc] (ecmascript)"); +; +function stripFlightHeaders(headers) { + for (const header of __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FLIGHT_HEADERS"]){ + delete headers[header]; + } +} //# sourceMappingURL=strip-flight-headers.js.map +}), +"[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/esm/server/web/spec-extension/adapters/headers.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "HeadersAdapter", + ()=>HeadersAdapter, + "ReadonlyHeadersError", + ()=>ReadonlyHeadersError +]); +var __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/web/spec-extension/adapters/reflect.js [app-rsc] (ecmascript)"); +; +class ReadonlyHeadersError extends Error { + constructor(){ + super('Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers'); + } + static callable() { + throw new ReadonlyHeadersError(); + } +} +class HeadersAdapter extends Headers { + constructor(headers){ + // We've already overridden the methods that would be called, so we're just + // calling the super constructor to ensure that the instanceof check works. + super(); + this.headers = new Proxy(headers, { + get (target, prop, receiver) { + // Because this is just an object, we expect that all "get" operations + // are for properties. If it's a "get" for a symbol, we'll just return + // the symbol. + if (typeof prop === 'symbol') { + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].get(target, prop, receiver); + } + const lowercased = prop.toLowerCase(); + // Let's find the original casing of the key. This assumes that there is + // no mixed case keys (e.g. "Content-Type" and "content-type") in the + // headers object. + const original = Object.keys(headers).find((o)=>o.toLowerCase() === lowercased); + // If the original casing doesn't exist, return undefined. + if (typeof original === 'undefined') return; + // If the original casing exists, return the value. + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].get(target, original, receiver); + }, + set (target, prop, value, receiver) { + if (typeof prop === 'symbol') { + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].set(target, prop, value, receiver); + } + const lowercased = prop.toLowerCase(); + // Let's find the original casing of the key. This assumes that there is + // no mixed case keys (e.g. "Content-Type" and "content-type") in the + // headers object. + const original = Object.keys(headers).find((o)=>o.toLowerCase() === lowercased); + // If the original casing doesn't exist, use the prop as the key. + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].set(target, original ?? prop, value, receiver); + }, + has (target, prop) { + if (typeof prop === 'symbol') return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].has(target, prop); + const lowercased = prop.toLowerCase(); + // Let's find the original casing of the key. This assumes that there is + // no mixed case keys (e.g. "Content-Type" and "content-type") in the + // headers object. + const original = Object.keys(headers).find((o)=>o.toLowerCase() === lowercased); + // If the original casing doesn't exist, return false. + if (typeof original === 'undefined') return false; + // If the original casing exists, return true. + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].has(target, original); + }, + deleteProperty (target, prop) { + if (typeof prop === 'symbol') return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].deleteProperty(target, prop); + const lowercased = prop.toLowerCase(); + // Let's find the original casing of the key. This assumes that there is + // no mixed case keys (e.g. "Content-Type" and "content-type") in the + // headers object. + const original = Object.keys(headers).find((o)=>o.toLowerCase() === lowercased); + // If the original casing doesn't exist, return true. + if (typeof original === 'undefined') return true; + // If the original casing exists, delete the property. + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].deleteProperty(target, original); + } + }); + } + /** + * Seals a Headers instance to prevent modification by throwing an error when + * any mutating method is called. + */ static seal(headers) { + return new Proxy(headers, { + get (target, prop, receiver) { + switch(prop){ + case 'append': + case 'delete': + case 'set': + return ReadonlyHeadersError.callable; + default: + return __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$reflect$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ReflectAdapter"].get(target, prop, receiver); + } + } + }); + } + /** + * Merges a header value into a string. This stores multiple values as an + * array, so we need to merge them into a string. + * + * @param value a header value + * @returns a merged header value (a string) + */ merge(value) { + if (Array.isArray(value)) return value.join(', '); + return value; + } + /** + * Creates a Headers instance from a plain object or a Headers instance. + * + * @param headers a plain object or a Headers instance + * @returns a headers instance + */ static from(headers) { + if (headers instanceof Headers) return headers; + return new HeadersAdapter(headers); + } + append(name, value) { + const existing = this.headers[name]; + if (typeof existing === 'string') { + this.headers[name] = [ + existing, + value + ]; + } else if (Array.isArray(existing)) { + existing.push(value); + } else { + this.headers[name] = value; + } + } + delete(name) { + delete this.headers[name]; + } + get(name) { + const value = this.headers[name]; + if (typeof value !== 'undefined') return this.merge(value); + return null; + } + has(name) { + return typeof this.headers[name] !== 'undefined'; + } + set(name, value) { + this.headers[name] = value; + } + forEach(callbackfn, thisArg) { + for (const [name, value] of this.entries()){ + callbackfn.call(thisArg, value, name, this); + } + } + *entries() { + for (const key of Object.keys(this.headers)){ + const name = key.toLowerCase(); + // We assert here that this is a string because we got it from the + // Object.keys() call above. + const value = this.get(name); + yield [ + name, + value + ]; + } + } + *keys() { + for (const key of Object.keys(this.headers)){ + const name = key.toLowerCase(); + yield name; + } + } + *values() { + for (const key of Object.keys(this.headers)){ + // We assert here that this is a string because we got it from the + // Object.keys() call above. + const value = this.get(key); + yield value; + } + } + [Symbol.iterator]() { + return this.entries(); + } +} //# sourceMappingURL=headers.js.map +}), +"[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/cookie/index.js [app-rsc] (ecmascript)", ((__turbopack_context__, module, exports) => { + +(()=>{ + "use strict"; + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/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/cookie") + "/"; + var e = {}; + (()=>{ + var r = e; + /*! + * cookie + * Copyright(c) 2012-2014 Roman Shtylman + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ r.parse = parse; + r.serialize = serialize; + var i = decodeURIComponent; + var t = encodeURIComponent; + var a = /; */; + var n = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; + function parse(e, r) { + if (typeof e !== "string") { + throw new TypeError("argument str must be a string"); + } + var t = {}; + var n = r || {}; + var o = e.split(a); + var s = n.decode || i; + for(var p = 0; p < o.length; p++){ + var f = o[p]; + var u = f.indexOf("="); + if (u < 0) { + continue; + } + var v = f.substr(0, u).trim(); + var c = f.substr(++u, f.length).trim(); + if ('"' == c[0]) { + c = c.slice(1, -1); + } + if (undefined == t[v]) { + t[v] = tryDecode(c, s); + } + } + return t; + } + function serialize(e, r, i) { + var a = i || {}; + var o = a.encode || t; + if (typeof o !== "function") { + throw new TypeError("option encode is invalid"); + } + if (!n.test(e)) { + throw new TypeError("argument name is invalid"); + } + var s = o(r); + if (s && !n.test(s)) { + throw new TypeError("argument val is invalid"); + } + var p = e + "=" + s; + if (null != a.maxAge) { + var f = a.maxAge - 0; + if (isNaN(f) || !isFinite(f)) { + throw new TypeError("option maxAge is invalid"); + } + p += "; Max-Age=" + Math.floor(f); + } + if (a.domain) { + if (!n.test(a.domain)) { + throw new TypeError("option domain is invalid"); + } + p += "; Domain=" + a.domain; + } + if (a.path) { + if (!n.test(a.path)) { + throw new TypeError("option path is invalid"); + } + p += "; Path=" + a.path; + } + if (a.expires) { + if (typeof a.expires.toUTCString !== "function") { + throw new TypeError("option expires is invalid"); + } + p += "; Expires=" + a.expires.toUTCString(); + } + if (a.httpOnly) { + p += "; HttpOnly"; + } + if (a.secure) { + p += "; Secure"; + } + if (a.sameSite) { + var u = typeof a.sameSite === "string" ? a.sameSite.toLowerCase() : a.sameSite; + switch(u){ + case true: + p += "; SameSite=Strict"; + break; + case "lax": + p += "; SameSite=Lax"; + break; + case "strict": + p += "; SameSite=Strict"; + break; + case "none": + p += "; SameSite=None"; + break; + default: + throw new TypeError("option sameSite is invalid"); + } + } + return p; + } + function tryDecode(e, r) { + try { + return r(e); + } catch (r) { + return e; + } + } + })(); + module.exports = e; +})(); +}), +"[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/esm/server/api-utils/index.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "ApiError", + ()=>ApiError, + "COOKIE_NAME_PRERENDER_BYPASS", + ()=>COOKIE_NAME_PRERENDER_BYPASS, + "COOKIE_NAME_PRERENDER_DATA", + ()=>COOKIE_NAME_PRERENDER_DATA, + "RESPONSE_LIMIT_DEFAULT", + ()=>RESPONSE_LIMIT_DEFAULT, + "SYMBOL_CLEARED_COOKIES", + ()=>SYMBOL_CLEARED_COOKIES, + "SYMBOL_PREVIEW_DATA", + ()=>SYMBOL_PREVIEW_DATA, + "checkIsOnDemandRevalidate", + ()=>checkIsOnDemandRevalidate, + "clearPreviewData", + ()=>clearPreviewData, + "redirect", + ()=>redirect, + "sendError", + ()=>sendError, + "sendStatusCode", + ()=>sendStatusCode, + "setLazyProp", + ()=>setLazyProp, + "wrapApiHandler", + ()=>wrapApiHandler +]); +var __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/web/spec-extension/adapters/headers.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/constants.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/trace/tracer.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$trace$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/trace/constants.js [app-rsc] (ecmascript)"); +; +; +; +; +function wrapApiHandler(page, handler) { + return (...args)=>{ + (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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getTracer"])().setRootSpanAttribute('next.route', page); + // Call API route method + return (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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getTracer"])().trace(__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$esm$2f$server$2f$lib$2f$trace$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NodeSpan"].runHandler, { + spanName: `executing api route (pages) ${page}` + }, ()=>handler(...args)); + }; +} +function sendStatusCode(res, statusCode) { + res.statusCode = statusCode; + return res; +} +function redirect(res, statusOrUrl, url) { + if (typeof statusOrUrl === 'string') { + url = statusOrUrl; + statusOrUrl = 307; + } + if (typeof statusOrUrl !== 'number' || typeof url !== 'string') { + throw Object.defineProperty(new Error(`Invalid redirect arguments. Please use a single argument URL, e.g. res.redirect('/destination') or use a status code and URL, e.g. res.redirect(307, '/destination').`), "__NEXT_ERROR_CODE", { + value: "E389", + enumerable: false, + configurable: true + }); + } + res.writeHead(statusOrUrl, { + Location: url + }); + res.write(url); + res.end(); + return res; +} +function checkIsOnDemandRevalidate(req, previewProps) { + const headers = __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$esm$2f$server$2f$web$2f$spec$2d$extension$2f$adapters$2f$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["HeadersAdapter"].from(req.headers); + const previewModeId = headers.get(__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["PRERENDER_REVALIDATE_HEADER"]); + const isOnDemandRevalidate = previewModeId === previewProps.previewModeId; + const revalidateOnlyGenerated = headers.has(__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER"]); + return { + isOnDemandRevalidate, + revalidateOnlyGenerated + }; +} +const COOKIE_NAME_PRERENDER_BYPASS = `__prerender_bypass`; +const COOKIE_NAME_PRERENDER_DATA = `__next_preview_data`; +const RESPONSE_LIMIT_DEFAULT = 4 * 1024 * 1024; +const SYMBOL_PREVIEW_DATA = Symbol(COOKIE_NAME_PRERENDER_DATA); +const SYMBOL_CLEARED_COOKIES = Symbol(COOKIE_NAME_PRERENDER_BYPASS); +function clearPreviewData(res, options = {}) { + if (SYMBOL_CLEARED_COOKIES in res) { + return res; + } + const { serialize } = __turbopack_context__.r("[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/cookie/index.js [app-rsc] (ecmascript)"); + const previous = res.getHeader('Set-Cookie'); + res.setHeader(`Set-Cookie`, [ + ...typeof previous === 'string' ? [ + previous + ] : Array.isArray(previous) ? previous : [], + serialize(COOKIE_NAME_PRERENDER_BYPASS, '', { + // To delete a cookie, set `expires` to a date in the past: + // https://tools.ietf.org/html/rfc6265#section-4.1.1 + // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted. + expires: new Date(0), + httpOnly: true, + sameSite: ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : 'lax', + secure: ("TURBOPACK compile-time value", "development") !== 'development', + path: '/', + ...options.path !== undefined ? { + path: options.path + } : undefined + }), + serialize(COOKIE_NAME_PRERENDER_DATA, '', { + // To delete a cookie, set `expires` to a date in the past: + // https://tools.ietf.org/html/rfc6265#section-4.1.1 + // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted. + expires: new Date(0), + httpOnly: true, + sameSite: ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : 'lax', + secure: ("TURBOPACK compile-time value", "development") !== 'development', + path: '/', + ...options.path !== undefined ? { + path: options.path + } : undefined + }) + ]); + Object.defineProperty(res, SYMBOL_CLEARED_COOKIES, { + value: true, + enumerable: false + }); + return res; +} +class ApiError extends Error { + constructor(statusCode, message){ + super(message); + this.statusCode = statusCode; + } +} +function sendError(res, statusCode, message) { + res.statusCode = statusCode; + res.statusMessage = message; + res.end(message); +} +function setLazyProp({ req }, prop, getter) { + const opts = { + configurable: true, + enumerable: true + }; + const optsReset = { + ...opts, + writable: true + }; + Object.defineProperty(req, prop, { + ...opts, + get: ()=>{ + const value = getter(); + // we set the property on the object to avoid recalculating it + Object.defineProperty(req, prop, { + ...optsReset, + value + }); + return value; + }, + set: (value)=>{ + Object.defineProperty(req, prop, { + ...optsReset, + value + }); + } + }); +} //# sourceMappingURL=index.js.map +}), +"[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/esm/server/api-utils/get-cookie-parser.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Parse cookies from the `headers` of request + * @param req request object + */ __turbopack_context__.s([ + "getCookieParser", + ()=>getCookieParser +]); +function getCookieParser(headers) { + return function parseCookie() { + const { cookie } = headers; + if (!cookie) { + return {}; + } + const { parse: parseCookieFn } = __turbopack_context__.r("[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/cookie/index.js [app-rsc] (ecmascript)"); + return parseCookieFn(Array.isArray(cookie) ? cookie.join('; ') : cookie); + }; +} //# sourceMappingURL=get-cookie-parser.js.map +}), +"[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/esm/server/base-http/index.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "BaseNextRequest", + ()=>BaseNextRequest, + "BaseNextResponse", + ()=>BaseNextResponse +]); +var __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$esm$2f$client$2f$components$2f$redirect$2d$status$2d$code$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/client/components/redirect-status-code.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$api$2d$utils$2f$get$2d$cookie$2d$parser$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/api-utils/get-cookie-parser.js [app-rsc] (ecmascript)"); +; +; +class BaseNextRequest { + constructor(method, url, body){ + this.method = method; + this.url = url; + this.body = body; + } + // Utils implemented using the abstract methods above + get cookies() { + if (this._cookies) return this._cookies; + return this._cookies = (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$esm$2f$server$2f$api$2d$utils$2f$get$2d$cookie$2d$parser$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getCookieParser"])(this.headers)(); + } +} +class BaseNextResponse { + constructor(destination){ + this.destination = destination; + } + // Utils implemented using the abstract methods above + redirect(destination, statusCode) { + this.setHeader('Location', destination); + this.statusCode = statusCode; + // Since IE11 doesn't support the 308 header add backwards + // compatibility using refresh header + if (statusCode === __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$esm$2f$client$2f$components$2f$redirect$2d$status$2d$code$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RedirectStatusCode"].PermanentRedirect) { + this.setHeader('Refresh', `0;url=${destination}`); + } + return this; + } +} //# sourceMappingURL=index.js.map +}), +"[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/esm/server/base-http/node.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "NodeNextRequest", + ()=>NodeNextRequest, + "NodeNextResponse", + ()=>NodeNextResponse +]); +var __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$esm$2f$server$2f$api$2d$utils$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/api-utils/index.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/request-meta.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$base$2d$http$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/base-http/index.js [app-rsc] (ecmascript)"); +; +; +; +let prop; +class NodeNextRequest extends __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$esm$2f$server$2f$base$2d$http$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["BaseNextRequest"] { + static #_ = prop = _NEXT_REQUEST_META = __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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_REQUEST_META"]; + constructor(_req){ + var _this__req; + super(_req.method.toUpperCase(), _req.url, _req), this._req = _req, this.headers = this._req.headers, this.fetchMetrics = (_this__req = this._req) == null ? void 0 : _this__req.fetchMetrics, this[_NEXT_REQUEST_META] = this._req[__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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_REQUEST_META"]] || {}, this.streaming = false; + } + get originalRequest() { + // Need to mimic these changes to the original req object for places where we use it: + // render.tsx, api/ssg requests + this._req[__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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_REQUEST_META"]] = this[__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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_REQUEST_META"]]; + this._req.url = this.url; + this._req.cookies = this.cookies; + return this._req; + } + set originalRequest(value) { + this._req = value; + } + /** + * Returns the request body as a Web Readable Stream. The body here can only + * be read once as the body will start flowing as soon as the data handler + * is attached. + * + * @internal + */ stream() { + if (this.streaming) { + throw Object.defineProperty(new Error('Invariant: NodeNextRequest.stream() can only be called once'), "__NEXT_ERROR_CODE", { + value: "E467", + enumerable: false, + configurable: true + }); + } + this.streaming = true; + return new ReadableStream({ + start: (controller)=>{ + this._req.on('data', (chunk)=>{ + controller.enqueue(new Uint8Array(chunk)); + }); + this._req.on('end', ()=>{ + controller.close(); + }); + this._req.on('error', (err)=>{ + controller.error(err); + }); + } + }); + } +} +class NodeNextResponse extends __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$esm$2f$server$2f$base$2d$http$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["BaseNextResponse"] { + get originalResponse() { + if (__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$esm$2f$server$2f$api$2d$utils$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["SYMBOL_CLEARED_COOKIES"] in this) { + this._res[__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$esm$2f$server$2f$api$2d$utils$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["SYMBOL_CLEARED_COOKIES"]] = this[__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$esm$2f$server$2f$api$2d$utils$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["SYMBOL_CLEARED_COOKIES"]]; + } + return this._res; + } + constructor(_res){ + super(_res), this._res = _res, this.textBody = undefined; + } + get sent() { + return this._res.finished || this._res.headersSent; + } + get statusCode() { + return this._res.statusCode; + } + set statusCode(value) { + this._res.statusCode = value; + } + get statusMessage() { + return this._res.statusMessage; + } + set statusMessage(value) { + this._res.statusMessage = value; + } + setHeader(name, value) { + this._res.setHeader(name, value); + return this; + } + removeHeader(name) { + this._res.removeHeader(name); + return this; + } + getHeaderValues(name) { + const values = this._res.getHeader(name); + if (values === undefined) return undefined; + return (Array.isArray(values) ? values : [ + values + ]).map((value)=>value.toString()); + } + hasHeader(name) { + return this._res.hasHeader(name); + } + getHeader(name) { + const values = this.getHeaderValues(name); + return Array.isArray(values) ? values.join(',') : undefined; + } + getHeaders() { + return this._res.getHeaders(); + } + appendHeader(name, value) { + const currentValues = this.getHeaderValues(name) ?? []; + if (!currentValues.includes(value)) { + this._res.setHeader(name, [ + ...currentValues, + value + ]); + } + return this; + } + body(value) { + this.textBody = value; + return this; + } + send() { + this._res.end(this.textBody); + } + onClose(callback) { + this.originalResponse.on('close', callback); + } +} +var _NEXT_REQUEST_META; //# sourceMappingURL=node.js.map +}), +"[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/esm/server/lib/experimental/ppr.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * If set to `incremental`, only those leaf pages that export + * `experimental_ppr = true` will have partial prerendering enabled. If any + * page exports this value as `false` or does not export it at all will not + * have partial prerendering enabled. If set to a boolean, the options for + * `experimental_ppr` will be ignored. + */ /** + * Returns true if partial prerendering is enabled for the application. It does + * not tell you if a given route has PPR enabled, as that requires analysis of + * the route's configuration. + * + * @see {@link checkIsRoutePPREnabled} - for checking if a specific route has PPR enabled. + */ __turbopack_context__.s([ + "checkIsAppPPREnabled", + ()=>checkIsAppPPREnabled, + "checkIsRoutePPREnabled", + ()=>checkIsRoutePPREnabled +]); +function checkIsAppPPREnabled(config) { + // If the config is undefined, partial prerendering is disabled. + if (typeof config === 'undefined') return false; + // If the config is a boolean, use it directly. + if (typeof config === 'boolean') return config; + // If the config is a string, it must be 'incremental' to enable partial + // prerendering. + if (config === 'incremental') return true; + return false; +} +function checkIsRoutePPREnabled(config) { + // If the config is undefined, partial prerendering is disabled. + if (typeof config === 'undefined') return false; + // If the config is a boolean, use it directly. + if (typeof config === 'boolean') return config; + return false; +} //# sourceMappingURL=ppr.js.map +}), +"[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/zod/index.cjs [app-rsc] (ecmascript)", ((__turbopack_context__, module, exports) => { + +(()=>{ + "use strict"; + var e = { + 629: function(e, t, s) { + var r = this && this.__createBinding || (Object.create ? function(e, t, s, r) { + if (r === undefined) r = s; + var a = Object.getOwnPropertyDescriptor(t, s); + if (!a || ("get" in a ? !t.__esModule : a.writable || a.configurable)) { + a = { + enumerable: true, + get: function() { + return t[s]; + } + }; + } + Object.defineProperty(e, r, a); + } : function(e, t, s, r) { + if (r === undefined) r = s; + e[r] = t[s]; + }); + var a = this && this.__setModuleDefault || (Object.create ? function(e, t) { + Object.defineProperty(e, "default", { + enumerable: true, + value: t + }); + } : function(e, t) { + e["default"] = t; + }); + var n = this && this.__importStar || function(e) { + if (e && e.__esModule) return e; + var t = {}; + if (e != null) { + for(var s in e)if (s !== "default" && Object.prototype.hasOwnProperty.call(e, s)) r(t, e, s); + } + a(t, e); + return t; + }; + var i = this && this.__exportStar || function(e, t) { + for(var s in e)if (s !== "default" && !Object.prototype.hasOwnProperty.call(t, s)) r(t, e, s); + }; + Object.defineProperty(t, "__esModule", { + value: true + }); + t.z = void 0; + const o = n(s(923)); + t.z = o; + i(s(923), t); + t["default"] = o; + }, + 348: (e, t, s)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + t.ZodError = t.quotelessJson = t.ZodIssueCode = void 0; + const r = s(709); + t.ZodIssueCode = r.util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" + ]); + const quotelessJson = (e)=>{ + const t = JSON.stringify(e, null, 2); + return t.replace(/"([^"]+)":/g, "$1:"); + }; + t.quotelessJson = quotelessJson; + class ZodError extends Error { + get errors() { + return this.issues; + } + constructor(e){ + super(); + this.issues = []; + this.addIssue = (e)=>{ + this.issues = [ + ...this.issues, + e + ]; + }; + this.addIssues = (e = [])=>{ + this.issues = [ + ...this.issues, + ...e + ]; + }; + const t = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, t); + } else { + this.__proto__ = t; + } + this.name = "ZodError"; + this.issues = e; + } + format(e) { + const t = e || function(e) { + return e.message; + }; + const s = { + _errors: [] + }; + const processError = (e)=>{ + for (const r of e.issues){ + if (r.code === "invalid_union") { + r.unionErrors.map(processError); + } else if (r.code === "invalid_return_type") { + processError(r.returnTypeError); + } else if (r.code === "invalid_arguments") { + processError(r.argumentsError); + } else if (r.path.length === 0) { + s._errors.push(t(r)); + } else { + let e = s; + let a = 0; + while(a < r.path.length){ + const s = r.path[a]; + const n = a === r.path.length - 1; + if (!n) { + e[s] = e[s] || { + _errors: [] + }; + } else { + e[s] = e[s] || { + _errors: [] + }; + e[s]._errors.push(t(r)); + } + e = e[s]; + a++; + } + } + } + }; + processError(this); + return s; + } + static assert(e) { + if (!(e instanceof ZodError)) { + throw new Error(`Not a ZodError: ${e}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, r.util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(e = (e)=>e.message) { + const t = {}; + const s = []; + for (const r of this.issues){ + if (r.path.length > 0) { + const s = r.path[0]; + t[s] = t[s] || []; + t[s].push(e(r)); + } else { + s.push(e(r)); + } + } + return { + formErrors: s, + fieldErrors: t + }; + } + get formErrors() { + return this.flatten(); + } + } + t.ZodError = ZodError; + ZodError.create = (e)=>{ + const t = new ZodError(e); + return t; + }; + }, + 61: function(e, t, s) { + var r = this && this.__importDefault || function(e) { + return e && e.__esModule ? e : { + default: e + }; + }; + Object.defineProperty(t, "__esModule", { + value: true + }); + t.defaultErrorMap = void 0; + t.setErrorMap = setErrorMap; + t.getErrorMap = getErrorMap; + const a = r(s(871)); + t.defaultErrorMap = a.default; + let n = a.default; + function setErrorMap(e) { + n = e; + } + function getErrorMap() { + return n; + } + }, + 923: function(e, t, s) { + var r = this && this.__createBinding || (Object.create ? function(e, t, s, r) { + if (r === undefined) r = s; + var a = Object.getOwnPropertyDescriptor(t, s); + if (!a || ("get" in a ? !t.__esModule : a.writable || a.configurable)) { + a = { + enumerable: true, + get: function() { + return t[s]; + } + }; + } + Object.defineProperty(e, r, a); + } : function(e, t, s, r) { + if (r === undefined) r = s; + e[r] = t[s]; + }); + var a = this && this.__exportStar || function(e, t) { + for(var s in e)if (s !== "default" && !Object.prototype.hasOwnProperty.call(t, s)) r(t, e, s); + }; + Object.defineProperty(t, "__esModule", { + value: true + }); + a(s(61), t); + a(s(818), t); + a(s(515), t); + a(s(709), t); + a(s(155), t); + a(s(348), t); + }, + 538: (e, t)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + t.errorUtil = void 0; + var s; + (function(e) { + e.errToObj = (e)=>typeof e === "string" ? { + message: e + } : e || {}; + e.toString = (e)=>typeof e === "string" ? e : e?.message; + })(s || (t.errorUtil = s = {})); + }, + 818: function(e, t, s) { + var r = this && this.__importDefault || function(e) { + return e && e.__esModule ? e : { + default: e + }; + }; + Object.defineProperty(t, "__esModule", { + value: true + }); + t.isAsync = t.isValid = t.isDirty = t.isAborted = t.OK = t.DIRTY = t.INVALID = t.ParseStatus = t.EMPTY_PATH = t.makeIssue = void 0; + t.addIssueToContext = addIssueToContext; + const a = s(61); + const n = r(s(871)); + const makeIssue = (e)=>{ + const { data: t, path: s, errorMaps: r, issueData: a } = e; + const n = [ + ...s, + ...a.path || [] + ]; + const i = { + ...a, + path: n + }; + if (a.message !== undefined) { + return { + ...a, + path: n, + message: a.message + }; + } + let o = ""; + const d = r.filter((e)=>!!e).slice().reverse(); + for (const e of d){ + o = e(i, { + data: t, + defaultError: o + }).message; + } + return { + ...a, + path: n, + message: o + }; + }; + t.makeIssue = makeIssue; + t.EMPTY_PATH = []; + function addIssueToContext(e, s) { + const r = (0, a.getErrorMap)(); + const i = (0, t.makeIssue)({ + issueData: s, + data: e.data, + path: e.path, + errorMaps: [ + e.common.contextualErrorMap, + e.schemaErrorMap, + r, + r === n.default ? undefined : n.default + ].filter((e)=>!!e) + }); + e.common.issues.push(i); + } + class ParseStatus { + constructor(){ + this.value = "valid"; + } + dirty() { + if (this.value === "valid") this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") this.value = "aborted"; + } + static mergeArray(e, s) { + const r = []; + for (const a of s){ + if (a.status === "aborted") return t.INVALID; + if (a.status === "dirty") e.dirty(); + r.push(a.value); + } + return { + status: e.value, + value: r + }; + } + static async mergeObjectAsync(e, t) { + const s = []; + for (const e of t){ + const t = await e.key; + const r = await e.value; + s.push({ + key: t, + value: r + }); + } + return ParseStatus.mergeObjectSync(e, s); + } + static mergeObjectSync(e, s) { + const r = {}; + for (const a of s){ + const { key: s, value: n } = a; + if (s.status === "aborted") return t.INVALID; + if (n.status === "aborted") return t.INVALID; + if (s.status === "dirty") e.dirty(); + if (n.status === "dirty") e.dirty(); + if (s.value !== "__proto__" && (typeof n.value !== "undefined" || a.alwaysSet)) { + r[s.value] = n.value; + } + } + return { + status: e.value, + value: r + }; + } + } + t.ParseStatus = ParseStatus; + t.INVALID = Object.freeze({ + status: "aborted" + }); + const DIRTY = (e)=>({ + status: "dirty", + value: e + }); + t.DIRTY = DIRTY; + const OK = (e)=>({ + status: "valid", + value: e + }); + t.OK = OK; + const isAborted = (e)=>e.status === "aborted"; + t.isAborted = isAborted; + const isDirty = (e)=>e.status === "dirty"; + t.isDirty = isDirty; + const isValid = (e)=>e.status === "valid"; + t.isValid = isValid; + const isAsync = (e)=>typeof Promise !== "undefined" && e instanceof Promise; + t.isAsync = isAsync; + }, + 515: (e, t)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + }, + 709: (e, t)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + t.getParsedType = t.ZodParsedType = t.objectUtil = t.util = void 0; + var s; + (function(e) { + e.assertEqual = (e)=>{}; + function assertIs(e) {} + e.assertIs = assertIs; + function assertNever(e) { + throw new Error; + } + e.assertNever = assertNever; + e.arrayToEnum = (e)=>{ + const t = {}; + for (const s of e){ + t[s] = s; + } + return t; + }; + e.getValidEnumValues = (t)=>{ + const s = e.objectKeys(t).filter((e)=>typeof t[t[e]] !== "number"); + const r = {}; + for (const e of s){ + r[e] = t[e]; + } + return e.objectValues(r); + }; + e.objectValues = (t)=>e.objectKeys(t).map(function(e) { + return t[e]; + }); + e.objectKeys = typeof Object.keys === "function" ? (e)=>Object.keys(e) : (e)=>{ + const t = []; + for(const s in e){ + if (Object.prototype.hasOwnProperty.call(e, s)) { + t.push(s); + } + } + return t; + }; + e.find = (e, t)=>{ + for (const s of e){ + if (t(s)) return s; + } + return undefined; + }; + e.isInteger = typeof Number.isInteger === "function" ? (e)=>Number.isInteger(e) : (e)=>typeof e === "number" && Number.isFinite(e) && Math.floor(e) === e; + function joinValues(e, t = " | ") { + return e.map((e)=>typeof e === "string" ? `'${e}'` : e).join(t); + } + e.joinValues = joinValues; + e.jsonStringifyReplacer = (e, t)=>{ + if (typeof t === "bigint") { + return t.toString(); + } + return t; + }; + })(s || (t.util = s = {})); + var r; + (function(e) { + e.mergeShapes = (e, t)=>({ + ...e, + ...t + }); + })(r || (t.objectUtil = r = {})); + t.ZodParsedType = s.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" + ]); + const getParsedType = (e)=>{ + const s = typeof e; + switch(s){ + case "undefined": + return t.ZodParsedType.undefined; + case "string": + return t.ZodParsedType.string; + case "number": + return Number.isNaN(e) ? t.ZodParsedType.nan : t.ZodParsedType.number; + case "boolean": + return t.ZodParsedType.boolean; + case "function": + return t.ZodParsedType.function; + case "bigint": + return t.ZodParsedType.bigint; + case "symbol": + return t.ZodParsedType.symbol; + case "object": + if (Array.isArray(e)) { + return t.ZodParsedType.array; + } + if (e === null) { + return t.ZodParsedType.null; + } + if (e.then && typeof e.then === "function" && e.catch && typeof e.catch === "function") { + return t.ZodParsedType.promise; + } + if (typeof Map !== "undefined" && e instanceof Map) { + return t.ZodParsedType.map; + } + if (typeof Set !== "undefined" && e instanceof Set) { + return t.ZodParsedType.set; + } + if (typeof Date !== "undefined" && e instanceof Date) { + return t.ZodParsedType.date; + } + return t.ZodParsedType.object; + default: + return t.ZodParsedType.unknown; + } + }; + t.getParsedType = getParsedType; + }, + 871: (e, t, s)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + const r = s(348); + const a = s(709); + const errorMap = (e, t)=>{ + let s; + switch(e.code){ + case r.ZodIssueCode.invalid_type: + if (e.received === a.ZodParsedType.undefined) { + s = "Required"; + } else { + s = `Expected ${e.expected}, received ${e.received}`; + } + break; + case r.ZodIssueCode.invalid_literal: + s = `Invalid literal value, expected ${JSON.stringify(e.expected, a.util.jsonStringifyReplacer)}`; + break; + case r.ZodIssueCode.unrecognized_keys: + s = `Unrecognized key(s) in object: ${a.util.joinValues(e.keys, ", ")}`; + break; + case r.ZodIssueCode.invalid_union: + s = `Invalid input`; + break; + case r.ZodIssueCode.invalid_union_discriminator: + s = `Invalid discriminator value. Expected ${a.util.joinValues(e.options)}`; + break; + case r.ZodIssueCode.invalid_enum_value: + s = `Invalid enum value. Expected ${a.util.joinValues(e.options)}, received '${e.received}'`; + break; + case r.ZodIssueCode.invalid_arguments: + s = `Invalid function arguments`; + break; + case r.ZodIssueCode.invalid_return_type: + s = `Invalid function return type`; + break; + case r.ZodIssueCode.invalid_date: + s = `Invalid date`; + break; + case r.ZodIssueCode.invalid_string: + if (typeof e.validation === "object") { + if ("includes" in e.validation) { + s = `Invalid input: must include "${e.validation.includes}"`; + if (typeof e.validation.position === "number") { + s = `${s} at one or more positions greater than or equal to ${e.validation.position}`; + } + } else if ("startsWith" in e.validation) { + s = `Invalid input: must start with "${e.validation.startsWith}"`; + } else if ("endsWith" in e.validation) { + s = `Invalid input: must end with "${e.validation.endsWith}"`; + } else { + a.util.assertNever(e.validation); + } + } else if (e.validation !== "regex") { + s = `Invalid ${e.validation}`; + } else { + s = "Invalid"; + } + break; + case r.ZodIssueCode.too_small: + if (e.type === "array") s = `Array must contain ${e.exact ? "exactly" : e.inclusive ? `at least` : `more than`} ${e.minimum} element(s)`; + else if (e.type === "string") s = `String must contain ${e.exact ? "exactly" : e.inclusive ? `at least` : `over`} ${e.minimum} character(s)`; + else if (e.type === "number") s = `Number must be ${e.exact ? `exactly equal to ` : e.inclusive ? `greater than or equal to ` : `greater than `}${e.minimum}`; + else if (e.type === "bigint") s = `Number must be ${e.exact ? `exactly equal to ` : e.inclusive ? `greater than or equal to ` : `greater than `}${e.minimum}`; + else if (e.type === "date") s = `Date must be ${e.exact ? `exactly equal to ` : e.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(e.minimum))}`; + else s = "Invalid input"; + break; + case r.ZodIssueCode.too_big: + if (e.type === "array") s = `Array must contain ${e.exact ? `exactly` : e.inclusive ? `at most` : `less than`} ${e.maximum} element(s)`; + else if (e.type === "string") s = `String must contain ${e.exact ? `exactly` : e.inclusive ? `at most` : `under`} ${e.maximum} character(s)`; + else if (e.type === "number") s = `Number must be ${e.exact ? `exactly` : e.inclusive ? `less than or equal to` : `less than`} ${e.maximum}`; + else if (e.type === "bigint") s = `BigInt must be ${e.exact ? `exactly` : e.inclusive ? `less than or equal to` : `less than`} ${e.maximum}`; + else if (e.type === "date") s = `Date must be ${e.exact ? `exactly` : e.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(e.maximum))}`; + else s = "Invalid input"; + break; + case r.ZodIssueCode.custom: + s = `Invalid input`; + break; + case r.ZodIssueCode.invalid_intersection_types: + s = `Intersection results could not be merged`; + break; + case r.ZodIssueCode.not_multiple_of: + s = `Number must be a multiple of ${e.multipleOf}`; + break; + case r.ZodIssueCode.not_finite: + s = "Number must be finite"; + break; + default: + s = t.defaultError; + a.util.assertNever(e); + } + return { + message: s + }; + }; + t["default"] = errorMap; + }, + 155: (e, t, s)=>{ + Object.defineProperty(t, "__esModule", { + value: true + }); + t.discriminatedUnion = t.date = t.boolean = t.bigint = t.array = t.any = t.coerce = t.ZodFirstPartyTypeKind = t.late = t.ZodSchema = t.Schema = t.ZodReadonly = t.ZodPipeline = t.ZodBranded = t.BRAND = t.ZodNaN = t.ZodCatch = t.ZodDefault = t.ZodNullable = t.ZodOptional = t.ZodTransformer = t.ZodEffects = t.ZodPromise = t.ZodNativeEnum = t.ZodEnum = t.ZodLiteral = t.ZodLazy = t.ZodFunction = t.ZodSet = t.ZodMap = t.ZodRecord = t.ZodTuple = t.ZodIntersection = t.ZodDiscriminatedUnion = t.ZodUnion = t.ZodObject = t.ZodArray = t.ZodVoid = t.ZodNever = t.ZodUnknown = t.ZodAny = t.ZodNull = t.ZodUndefined = t.ZodSymbol = t.ZodDate = t.ZodBoolean = t.ZodBigInt = t.ZodNumber = t.ZodString = t.ZodType = void 0; + t.NEVER = t["void"] = t.unknown = t.union = t.undefined = t.tuple = t.transformer = t.symbol = t.string = t.strictObject = t.set = t.record = t.promise = t.preprocess = t.pipeline = t.ostring = t.optional = t.onumber = t.oboolean = t.object = t.number = t.nullable = t["null"] = t.never = t.nativeEnum = t.nan = t.map = t.literal = t.lazy = t.intersection = t["instanceof"] = t["function"] = t["enum"] = t.effect = void 0; + t.datetimeRegex = datetimeRegex; + t.custom = custom; + const r = s(348); + const a = s(61); + const n = s(538); + const i = s(818); + const o = s(709); + class ParseInputLazyPath { + constructor(e, t, s, r){ + this._cachedPath = []; + this.parent = e; + this.data = t; + this._path = s; + this._key = r; + } + get path() { + if (!this._cachedPath.length) { + if (Array.isArray(this._key)) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } + } + const handleResult = (e, t)=>{ + if ((0, i.isValid)(t)) { + return { + success: true, + data: t.value + }; + } else { + if (!e.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error () { + if (this._error) return this._error; + const t = new r.ZodError(e.common.issues); + this._error = t; + return this._error; + } + }; + } + }; + function processCreateParams(e) { + if (!e) return {}; + const { errorMap: t, invalid_type_error: s, required_error: r, description: a } = e; + if (t && (s || r)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (t) return { + errorMap: t, + description: a + }; + const customMap = (t, a)=>{ + const { message: n } = e; + if (t.code === "invalid_enum_value") { + return { + message: n ?? a.defaultError + }; + } + if (typeof a.data === "undefined") { + return { + message: n ?? r ?? a.defaultError + }; + } + if (t.code !== "invalid_type") return { + message: a.defaultError + }; + return { + message: n ?? s ?? a.defaultError + }; + }; + return { + errorMap: customMap, + description: a + }; + } + class ZodType { + get description() { + return this._def.description; + } + _getType(e) { + return (0, o.getParsedType)(e.data); + } + _getOrReturnCtx(e, t) { + return t || { + common: e.parent.common, + data: e.data, + parsedType: (0, o.getParsedType)(e.data), + schemaErrorMap: this._def.errorMap, + path: e.path, + parent: e.parent + }; + } + _processInputParams(e) { + return { + status: new i.ParseStatus, + ctx: { + common: e.parent.common, + data: e.data, + parsedType: (0, o.getParsedType)(e.data), + schemaErrorMap: this._def.errorMap, + path: e.path, + parent: e.parent + } + }; + } + _parseSync(e) { + const t = this._parse(e); + if ((0, i.isAsync)(t)) { + throw new Error("Synchronous parse encountered promise."); + } + return t; + } + _parseAsync(e) { + const t = this._parse(e); + return Promise.resolve(t); + } + parse(e, t) { + const s = this.safeParse(e, t); + if (s.success) return s.data; + throw s.error; + } + safeParse(e, t) { + const s = { + common: { + issues: [], + async: t?.async ?? false, + contextualErrorMap: t?.errorMap + }, + path: t?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data: e, + parsedType: (0, o.getParsedType)(e) + }; + const r = this._parseSync({ + data: e, + path: s.path, + parent: s + }); + return handleResult(s, r); + } + "~validate"(e) { + const t = { + common: { + issues: [], + async: !!this["~standard"].async + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data: e, + parsedType: (0, o.getParsedType)(e) + }; + if (!this["~standard"].async) { + try { + const s = this._parseSync({ + data: e, + path: [], + parent: t + }); + return (0, i.isValid)(s) ? { + value: s.value + } : { + issues: t.common.issues + }; + } catch (e) { + if (e?.message?.toLowerCase()?.includes("encountered")) { + this["~standard"].async = true; + } + t.common = { + issues: [], + async: true + }; + } + } + return this._parseAsync({ + data: e, + path: [], + parent: t + }).then((e)=>(0, i.isValid)(e) ? { + value: e.value + } : { + issues: t.common.issues + }); + } + async parseAsync(e, t) { + const s = await this.safeParseAsync(e, t); + if (s.success) return s.data; + throw s.error; + } + async safeParseAsync(e, t) { + const s = { + common: { + issues: [], + contextualErrorMap: t?.errorMap, + async: true + }, + path: t?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data: e, + parsedType: (0, o.getParsedType)(e) + }; + const r = this._parse({ + data: e, + path: s.path, + parent: s + }); + const a = await ((0, i.isAsync)(r) ? r : Promise.resolve(r)); + return handleResult(s, a); + } + refine(e, t) { + const getIssueProperties = (e)=>{ + if (typeof t === "string" || typeof t === "undefined") { + return { + message: t + }; + } else if (typeof t === "function") { + return t(e); + } else { + return t; + } + }; + return this._refinement((t, s)=>{ + const a = e(t); + const setError = ()=>s.addIssue({ + code: r.ZodIssueCode.custom, + ...getIssueProperties(t) + }); + if (typeof Promise !== "undefined" && a instanceof Promise) { + return a.then((e)=>{ + if (!e) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!a) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(e, t) { + return this._refinement((s, r)=>{ + if (!e(s)) { + r.addIssue(typeof t === "function" ? t(s, r) : t); + return false; + } else { + return true; + } + }); + } + _refinement(e) { + return new ZodEffects({ + schema: this, + typeName: k.ZodEffects, + effect: { + type: "refinement", + refinement: e + } + }); + } + superRefine(e) { + return this._refinement(e); + } + constructor(e){ + this.spa = this.safeParseAsync; + this._def = e; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (e)=>this["~validate"](e) + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(e) { + return ZodUnion.create([ + this, + e + ], this._def); + } + and(e) { + return ZodIntersection.create(this, e, this._def); + } + transform(e) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: k.ZodEffects, + effect: { + type: "transform", + transform: e + } + }); + } + default(e) { + const t = typeof e === "function" ? e : ()=>e; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: t, + typeName: k.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: k.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(e) { + const t = typeof e === "function" ? e : ()=>e; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: t, + typeName: k.ZodCatch + }); + } + describe(e) { + const t = this.constructor; + return new t({ + ...this._def, + description: e + }); + } + pipe(e) { + return ZodPipeline.create(this, e); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(undefined).success; + } + isNullable() { + return this.safeParse(null).success; + } + } + t.ZodType = ZodType; + t.Schema = ZodType; + t.ZodSchema = ZodType; + const d = /^c[^\s-]{8,}$/i; + const u = /^[0-9a-z]+$/; + const c = /^[0-9A-HJKMNP-TV-Z]{26}$/i; + const l = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; + const p = /^[a-z0-9_-]{21}$/i; + const f = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; + const h = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; + const m = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; + const y = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; + let Z; + const _ = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; + const g = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/; + const v = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; + const I = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; + const T = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; + const b = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; + const x = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; + const C = new RegExp(`^${x}$`); + function timeRegexSource(e) { + let t = `[0-5]\\d`; + if (e.precision) { + t = `${t}\\.\\d{${e.precision}}`; + } else if (e.precision == null) { + t = `${t}(\\.\\d+)?`; + } + const s = e.precision ? "+" : "?"; + return `([01]\\d|2[0-3]):[0-5]\\d(:${t})${s}`; + } + function timeRegex(e) { + return new RegExp(`^${timeRegexSource(e)}$`); + } + function datetimeRegex(e) { + let t = `${x}T${timeRegexSource(e)}`; + const s = []; + s.push(e.local ? `Z?` : `Z`); + if (e.offset) s.push(`([+-]\\d{2}:?\\d{2})`); + t = `${t}(${s.join("|")})`; + return new RegExp(`^${t}$`); + } + function isValidIP(e, t) { + if ((t === "v4" || !t) && _.test(e)) { + return true; + } + if ((t === "v6" || !t) && v.test(e)) { + return true; + } + return false; + } + function isValidJWT(e, t) { + if (!f.test(e)) return false; + try { + const [s] = e.split("."); + if (!s) return false; + const r = s.replace(/-/g, "+").replace(/_/g, "/").padEnd(s.length + (4 - s.length % 4) % 4, "="); + const a = JSON.parse(atob(r)); + if (typeof a !== "object" || a === null) return false; + if ("typ" in a && a?.typ !== "JWT") return false; + if (!a.alg) return false; + if (t && a.alg !== t) return false; + return true; + } catch { + return false; + } + } + function isValidCidr(e, t) { + if ((t === "v4" || !t) && g.test(e)) { + return true; + } + if ((t === "v6" || !t) && I.test(e)) { + return true; + } + return false; + } + class ZodString extends ZodType { + _parse(e) { + if (this._def.coerce) { + e.data = String(e.data); + } + const t = this._getType(e); + if (t !== o.ZodParsedType.string) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.string, + received: t.parsedType + }); + return i.INVALID; + } + const s = new i.ParseStatus; + let a = undefined; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e.data.length < t.value) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_small, + minimum: t.value, + type: "string", + inclusive: true, + exact: false, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "max") { + if (e.data.length > t.value) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_big, + maximum: t.value, + type: "string", + inclusive: true, + exact: false, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "length") { + const n = e.data.length > t.value; + const o = e.data.length < t.value; + if (n || o) { + a = this._getOrReturnCtx(e, a); + if (n) { + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_big, + maximum: t.value, + type: "string", + inclusive: true, + exact: true, + message: t.message + }); + } else if (o) { + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_small, + minimum: t.value, + type: "string", + inclusive: true, + exact: true, + message: t.message + }); + } + s.dirty(); + } + } else if (t.kind === "email") { + if (!m.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "email", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "emoji") { + if (!Z) { + Z = new RegExp(y, "u"); + } + if (!Z.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "emoji", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "uuid") { + if (!l.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "uuid", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "nanoid") { + if (!p.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "nanoid", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "cuid") { + if (!d.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "cuid", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "cuid2") { + if (!u.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "cuid2", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "ulid") { + if (!c.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "ulid", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "url") { + try { + new URL(e.data); + } catch { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "url", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "regex") { + t.regex.lastIndex = 0; + const n = t.regex.test(e.data); + if (!n) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "regex", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "trim") { + e.data = e.data.trim(); + } else if (t.kind === "includes") { + if (!e.data.includes(t.value, t.position)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: { + includes: t.value, + position: t.position + }, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "toLowerCase") { + e.data = e.data.toLowerCase(); + } else if (t.kind === "toUpperCase") { + e.data = e.data.toUpperCase(); + } else if (t.kind === "startsWith") { + if (!e.data.startsWith(t.value)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: { + startsWith: t.value + }, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "endsWith") { + if (!e.data.endsWith(t.value)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: { + endsWith: t.value + }, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "datetime") { + const n = datetimeRegex(t); + if (!n.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: "datetime", + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "date") { + const n = C; + if (!n.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: "date", + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "time") { + const n = timeRegex(t); + if (!n.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.invalid_string, + validation: "time", + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "duration") { + if (!h.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "duration", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "ip") { + if (!isValidIP(e.data, t.version)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "ip", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "jwt") { + if (!isValidJWT(e.data, t.alg)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "jwt", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "cidr") { + if (!isValidCidr(e.data, t.version)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "cidr", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "base64") { + if (!T.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "base64", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else if (t.kind === "base64url") { + if (!b.test(e.data)) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + validation: "base64url", + code: r.ZodIssueCode.invalid_string, + message: t.message + }); + s.dirty(); + } + } else { + o.util.assertNever(t); + } + } + return { + status: s.value, + value: e.data + }; + } + _regex(e, t, s) { + return this.refinement((t)=>e.test(t), { + validation: t, + code: r.ZodIssueCode.invalid_string, + ...n.errorUtil.errToObj(s) + }); + } + _addCheck(e) { + return new ZodString({ + ...this._def, + checks: [ + ...this._def.checks, + e + ] + }); + } + email(e) { + return this._addCheck({ + kind: "email", + ...n.errorUtil.errToObj(e) + }); + } + url(e) { + return this._addCheck({ + kind: "url", + ...n.errorUtil.errToObj(e) + }); + } + emoji(e) { + return this._addCheck({ + kind: "emoji", + ...n.errorUtil.errToObj(e) + }); + } + uuid(e) { + return this._addCheck({ + kind: "uuid", + ...n.errorUtil.errToObj(e) + }); + } + nanoid(e) { + return this._addCheck({ + kind: "nanoid", + ...n.errorUtil.errToObj(e) + }); + } + cuid(e) { + return this._addCheck({ + kind: "cuid", + ...n.errorUtil.errToObj(e) + }); + } + cuid2(e) { + return this._addCheck({ + kind: "cuid2", + ...n.errorUtil.errToObj(e) + }); + } + ulid(e) { + return this._addCheck({ + kind: "ulid", + ...n.errorUtil.errToObj(e) + }); + } + base64(e) { + return this._addCheck({ + kind: "base64", + ...n.errorUtil.errToObj(e) + }); + } + base64url(e) { + return this._addCheck({ + kind: "base64url", + ...n.errorUtil.errToObj(e) + }); + } + jwt(e) { + return this._addCheck({ + kind: "jwt", + ...n.errorUtil.errToObj(e) + }); + } + ip(e) { + return this._addCheck({ + kind: "ip", + ...n.errorUtil.errToObj(e) + }); + } + cidr(e) { + return this._addCheck({ + kind: "cidr", + ...n.errorUtil.errToObj(e) + }); + } + datetime(e) { + if (typeof e === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: e + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof e?.precision === "undefined" ? null : e?.precision, + offset: e?.offset ?? false, + local: e?.local ?? false, + ...n.errorUtil.errToObj(e?.message) + }); + } + date(e) { + return this._addCheck({ + kind: "date", + message: e + }); + } + time(e) { + if (typeof e === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: e + }); + } + return this._addCheck({ + kind: "time", + precision: typeof e?.precision === "undefined" ? null : e?.precision, + ...n.errorUtil.errToObj(e?.message) + }); + } + duration(e) { + return this._addCheck({ + kind: "duration", + ...n.errorUtil.errToObj(e) + }); + } + regex(e, t) { + return this._addCheck({ + kind: "regex", + regex: e, + ...n.errorUtil.errToObj(t) + }); + } + includes(e, t) { + return this._addCheck({ + kind: "includes", + value: e, + position: t?.position, + ...n.errorUtil.errToObj(t?.message) + }); + } + startsWith(e, t) { + return this._addCheck({ + kind: "startsWith", + value: e, + ...n.errorUtil.errToObj(t) + }); + } + endsWith(e, t) { + return this._addCheck({ + kind: "endsWith", + value: e, + ...n.errorUtil.errToObj(t) + }); + } + min(e, t) { + return this._addCheck({ + kind: "min", + value: e, + ...n.errorUtil.errToObj(t) + }); + } + max(e, t) { + return this._addCheck({ + kind: "max", + value: e, + ...n.errorUtil.errToObj(t) + }); + } + length(e, t) { + return this._addCheck({ + kind: "length", + value: e, + ...n.errorUtil.errToObj(t) + }); + } + nonempty(e) { + return this.min(1, n.errorUtil.errToObj(e)); + } + trim() { + return new ZodString({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: "trim" + } + ] + }); + } + toLowerCase() { + return new ZodString({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: "toLowerCase" + } + ] + }); + } + toUpperCase() { + return new ZodString({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: "toUpperCase" + } + ] + }); + } + get isDatetime() { + return !!this._def.checks.find((e)=>e.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((e)=>e.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((e)=>e.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((e)=>e.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((e)=>e.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((e)=>e.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((e)=>e.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((e)=>e.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((e)=>e.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((e)=>e.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((e)=>e.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((e)=>e.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((e)=>e.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((e)=>e.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((e)=>e.kind === "base64"); + } + get isBase64url() { + return !!this._def.checks.find((e)=>e.kind === "base64url"); + } + get minLength() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e === null || t.value > e) e = t.value; + } + } + return e; + } + get maxLength() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "max") { + if (e === null || t.value < e) e = t.value; + } + } + return e; + } + } + t.ZodString = ZodString; + ZodString.create = (e)=>new ZodString({ + checks: [], + typeName: k.ZodString, + coerce: e?.coerce ?? false, + ...processCreateParams(e) + }); + function floatSafeRemainder(e, t) { + const s = (e.toString().split(".")[1] || "").length; + const r = (t.toString().split(".")[1] || "").length; + const a = s > r ? s : r; + const n = Number.parseInt(e.toFixed(a).replace(".", "")); + const i = Number.parseInt(t.toFixed(a).replace(".", "")); + return n % i / 10 ** a; + } + class ZodNumber extends ZodType { + constructor(){ + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(e) { + if (this._def.coerce) { + e.data = Number(e.data); + } + const t = this._getType(e); + if (t !== o.ZodParsedType.number) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.number, + received: t.parsedType + }); + return i.INVALID; + } + let s = undefined; + const a = new i.ParseStatus; + for (const t of this._def.checks){ + if (t.kind === "int") { + if (!o.util.isInteger(e.data)) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "min") { + const n = t.inclusive ? e.data < t.value : e.data <= t.value; + if (n) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_small, + minimum: t.value, + type: "number", + inclusive: t.inclusive, + exact: false, + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "max") { + const n = t.inclusive ? e.data > t.value : e.data >= t.value; + if (n) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_big, + maximum: t.value, + type: "number", + inclusive: t.inclusive, + exact: false, + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "multipleOf") { + if (floatSafeRemainder(e.data, t.value) !== 0) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.not_multiple_of, + multipleOf: t.value, + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "finite") { + if (!Number.isFinite(e.data)) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.not_finite, + message: t.message + }); + a.dirty(); + } + } else { + o.util.assertNever(t); + } + } + return { + status: a.value, + value: e.data + }; + } + gte(e, t) { + return this.setLimit("min", e, true, n.errorUtil.toString(t)); + } + gt(e, t) { + return this.setLimit("min", e, false, n.errorUtil.toString(t)); + } + lte(e, t) { + return this.setLimit("max", e, true, n.errorUtil.toString(t)); + } + lt(e, t) { + return this.setLimit("max", e, false, n.errorUtil.toString(t)); + } + setLimit(e, t, s, r) { + return new ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: e, + value: t, + inclusive: s, + message: n.errorUtil.toString(r) + } + ] + }); + } + _addCheck(e) { + return new ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + e + ] + }); + } + int(e) { + return this._addCheck({ + kind: "int", + message: n.errorUtil.toString(e) + }); + } + positive(e) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: n.errorUtil.toString(e) + }); + } + negative(e) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: n.errorUtil.toString(e) + }); + } + nonpositive(e) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: n.errorUtil.toString(e) + }); + } + nonnegative(e) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: n.errorUtil.toString(e) + }); + } + multipleOf(e, t) { + return this._addCheck({ + kind: "multipleOf", + value: e, + message: n.errorUtil.toString(t) + }); + } + finite(e) { + return this._addCheck({ + kind: "finite", + message: n.errorUtil.toString(e) + }); + } + safe(e) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: n.errorUtil.toString(e) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: n.errorUtil.toString(e) + }); + } + get minValue() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e === null || t.value > e) e = t.value; + } + } + return e; + } + get maxValue() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "max") { + if (e === null || t.value < e) e = t.value; + } + } + return e; + } + get isInt() { + return !!this._def.checks.find((e)=>e.kind === "int" || e.kind === "multipleOf" && o.util.isInteger(e.value)); + } + get isFinite() { + let e = null; + let t = null; + for (const s of this._def.checks){ + if (s.kind === "finite" || s.kind === "int" || s.kind === "multipleOf") { + return true; + } else if (s.kind === "min") { + if (t === null || s.value > t) t = s.value; + } else if (s.kind === "max") { + if (e === null || s.value < e) e = s.value; + } + } + return Number.isFinite(t) && Number.isFinite(e); + } + } + t.ZodNumber = ZodNumber; + ZodNumber.create = (e)=>new ZodNumber({ + checks: [], + typeName: k.ZodNumber, + coerce: e?.coerce || false, + ...processCreateParams(e) + }); + class ZodBigInt extends ZodType { + constructor(){ + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(e) { + if (this._def.coerce) { + try { + e.data = BigInt(e.data); + } catch { + return this._getInvalidInput(e); + } + } + const t = this._getType(e); + if (t !== o.ZodParsedType.bigint) { + return this._getInvalidInput(e); + } + let s = undefined; + const a = new i.ParseStatus; + for (const t of this._def.checks){ + if (t.kind === "min") { + const n = t.inclusive ? e.data < t.value : e.data <= t.value; + if (n) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_small, + type: "bigint", + minimum: t.value, + inclusive: t.inclusive, + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "max") { + const n = t.inclusive ? e.data > t.value : e.data >= t.value; + if (n) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_big, + type: "bigint", + maximum: t.value, + inclusive: t.inclusive, + message: t.message + }); + a.dirty(); + } + } else if (t.kind === "multipleOf") { + if (e.data % t.value !== BigInt(0)) { + s = this._getOrReturnCtx(e, s); + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.not_multiple_of, + multipleOf: t.value, + message: t.message + }); + a.dirty(); + } + } else { + o.util.assertNever(t); + } + } + return { + status: a.value, + value: e.data + }; + } + _getInvalidInput(e) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.bigint, + received: t.parsedType + }); + return i.INVALID; + } + gte(e, t) { + return this.setLimit("min", e, true, n.errorUtil.toString(t)); + } + gt(e, t) { + return this.setLimit("min", e, false, n.errorUtil.toString(t)); + } + lte(e, t) { + return this.setLimit("max", e, true, n.errorUtil.toString(t)); + } + lt(e, t) { + return this.setLimit("max", e, false, n.errorUtil.toString(t)); + } + setLimit(e, t, s, r) { + return new ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: e, + value: t, + inclusive: s, + message: n.errorUtil.toString(r) + } + ] + }); + } + _addCheck(e) { + return new ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + e + ] + }); + } + positive(e) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: n.errorUtil.toString(e) + }); + } + negative(e) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: n.errorUtil.toString(e) + }); + } + nonpositive(e) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: n.errorUtil.toString(e) + }); + } + nonnegative(e) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: n.errorUtil.toString(e) + }); + } + multipleOf(e, t) { + return this._addCheck({ + kind: "multipleOf", + value: e, + message: n.errorUtil.toString(t) + }); + } + get minValue() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e === null || t.value > e) e = t.value; + } + } + return e; + } + get maxValue() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "max") { + if (e === null || t.value < e) e = t.value; + } + } + return e; + } + } + t.ZodBigInt = ZodBigInt; + ZodBigInt.create = (e)=>new ZodBigInt({ + checks: [], + typeName: k.ZodBigInt, + coerce: e?.coerce ?? false, + ...processCreateParams(e) + }); + class ZodBoolean extends ZodType { + _parse(e) { + if (this._def.coerce) { + e.data = Boolean(e.data); + } + const t = this._getType(e); + if (t !== o.ZodParsedType.boolean) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.boolean, + received: t.parsedType + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + } + t.ZodBoolean = ZodBoolean; + ZodBoolean.create = (e)=>new ZodBoolean({ + typeName: k.ZodBoolean, + coerce: e?.coerce || false, + ...processCreateParams(e) + }); + class ZodDate extends ZodType { + _parse(e) { + if (this._def.coerce) { + e.data = new Date(e.data); + } + const t = this._getType(e); + if (t !== o.ZodParsedType.date) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.date, + received: t.parsedType + }); + return i.INVALID; + } + if (Number.isNaN(e.data.getTime())) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_date + }); + return i.INVALID; + } + const s = new i.ParseStatus; + let a = undefined; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e.data.getTime() < t.value) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_small, + message: t.message, + inclusive: true, + exact: false, + minimum: t.value, + type: "date" + }); + s.dirty(); + } + } else if (t.kind === "max") { + if (e.data.getTime() > t.value) { + a = this._getOrReturnCtx(e, a); + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.too_big, + message: t.message, + inclusive: true, + exact: false, + maximum: t.value, + type: "date" + }); + s.dirty(); + } + } else { + o.util.assertNever(t); + } + } + return { + status: s.value, + value: new Date(e.data.getTime()) + }; + } + _addCheck(e) { + return new ZodDate({ + ...this._def, + checks: [ + ...this._def.checks, + e + ] + }); + } + min(e, t) { + return this._addCheck({ + kind: "min", + value: e.getTime(), + message: n.errorUtil.toString(t) + }); + } + max(e, t) { + return this._addCheck({ + kind: "max", + value: e.getTime(), + message: n.errorUtil.toString(t) + }); + } + get minDate() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "min") { + if (e === null || t.value > e) e = t.value; + } + } + return e != null ? new Date(e) : null; + } + get maxDate() { + let e = null; + for (const t of this._def.checks){ + if (t.kind === "max") { + if (e === null || t.value < e) e = t.value; + } + } + return e != null ? new Date(e) : null; + } + } + t.ZodDate = ZodDate; + ZodDate.create = (e)=>new ZodDate({ + checks: [], + coerce: e?.coerce || false, + typeName: k.ZodDate, + ...processCreateParams(e) + }); + class ZodSymbol extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.symbol) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.symbol, + received: t.parsedType + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + } + t.ZodSymbol = ZodSymbol; + ZodSymbol.create = (e)=>new ZodSymbol({ + typeName: k.ZodSymbol, + ...processCreateParams(e) + }); + class ZodUndefined extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.undefined) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.undefined, + received: t.parsedType + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + } + t.ZodUndefined = ZodUndefined; + ZodUndefined.create = (e)=>new ZodUndefined({ + typeName: k.ZodUndefined, + ...processCreateParams(e) + }); + class ZodNull extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.null) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.null, + received: t.parsedType + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + } + t.ZodNull = ZodNull; + ZodNull.create = (e)=>new ZodNull({ + typeName: k.ZodNull, + ...processCreateParams(e) + }); + class ZodAny extends ZodType { + constructor(){ + super(...arguments); + this._any = true; + } + _parse(e) { + return (0, i.OK)(e.data); + } + } + t.ZodAny = ZodAny; + ZodAny.create = (e)=>new ZodAny({ + typeName: k.ZodAny, + ...processCreateParams(e) + }); + class ZodUnknown extends ZodType { + constructor(){ + super(...arguments); + this._unknown = true; + } + _parse(e) { + return (0, i.OK)(e.data); + } + } + t.ZodUnknown = ZodUnknown; + ZodUnknown.create = (e)=>new ZodUnknown({ + typeName: k.ZodUnknown, + ...processCreateParams(e) + }); + class ZodNever extends ZodType { + _parse(e) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.never, + received: t.parsedType + }); + return i.INVALID; + } + } + t.ZodNever = ZodNever; + ZodNever.create = (e)=>new ZodNever({ + typeName: k.ZodNever, + ...processCreateParams(e) + }); + class ZodVoid extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.undefined) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.void, + received: t.parsedType + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + } + t.ZodVoid = ZodVoid; + ZodVoid.create = (e)=>new ZodVoid({ + typeName: k.ZodVoid, + ...processCreateParams(e) + }); + class ZodArray extends ZodType { + _parse(e) { + const { ctx: t, status: s } = this._processInputParams(e); + const a = this._def; + if (t.parsedType !== o.ZodParsedType.array) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.array, + received: t.parsedType + }); + return i.INVALID; + } + if (a.exactLength !== null) { + const e = t.data.length > a.exactLength.value; + const n = t.data.length < a.exactLength.value; + if (e || n) { + (0, i.addIssueToContext)(t, { + code: e ? r.ZodIssueCode.too_big : r.ZodIssueCode.too_small, + minimum: n ? a.exactLength.value : undefined, + maximum: e ? a.exactLength.value : undefined, + type: "array", + inclusive: true, + exact: true, + message: a.exactLength.message + }); + s.dirty(); + } + } + if (a.minLength !== null) { + if (t.data.length < a.minLength.value) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.too_small, + minimum: a.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: a.minLength.message + }); + s.dirty(); + } + } + if (a.maxLength !== null) { + if (t.data.length > a.maxLength.value) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.too_big, + maximum: a.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: a.maxLength.message + }); + s.dirty(); + } + } + if (t.common.async) { + return Promise.all([ + ...t.data + ].map((e, s)=>a.type._parseAsync(new ParseInputLazyPath(t, e, t.path, s)))).then((e)=>i.ParseStatus.mergeArray(s, e)); + } + const n = [ + ...t.data + ].map((e, s)=>a.type._parseSync(new ParseInputLazyPath(t, e, t.path, s))); + return i.ParseStatus.mergeArray(s, n); + } + get element() { + return this._def.type; + } + min(e, t) { + return new ZodArray({ + ...this._def, + minLength: { + value: e, + message: n.errorUtil.toString(t) + } + }); + } + max(e, t) { + return new ZodArray({ + ...this._def, + maxLength: { + value: e, + message: n.errorUtil.toString(t) + } + }); + } + length(e, t) { + return new ZodArray({ + ...this._def, + exactLength: { + value: e, + message: n.errorUtil.toString(t) + } + }); + } + nonempty(e) { + return this.min(1, e); + } + } + t.ZodArray = ZodArray; + ZodArray.create = (e, t)=>new ZodArray({ + type: e, + minLength: null, + maxLength: null, + exactLength: null, + typeName: k.ZodArray, + ...processCreateParams(t) + }); + function deepPartialify(e) { + if (e instanceof ZodObject) { + const t = {}; + for(const s in e.shape){ + const r = e.shape[s]; + t[s] = ZodOptional.create(deepPartialify(r)); + } + return new ZodObject({ + ...e._def, + shape: ()=>t + }); + } else if (e instanceof ZodArray) { + return new ZodArray({ + ...e._def, + type: deepPartialify(e.element) + }); + } else if (e instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(e.unwrap())); + } else if (e instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(e.unwrap())); + } else if (e instanceof ZodTuple) { + return ZodTuple.create(e.items.map((e)=>deepPartialify(e))); + } else { + return e; + } + } + class ZodObject extends ZodType { + constructor(){ + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) return this._cached; + const e = this._def.shape(); + const t = o.util.objectKeys(e); + this._cached = { + shape: e, + keys: t + }; + return this._cached; + } + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.object) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.object, + received: t.parsedType + }); + return i.INVALID; + } + const { status: s, ctx: a } = this._processInputParams(e); + const { shape: n, keys: d } = this._getCached(); + const u = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for(const e in a.data){ + if (!d.includes(e)) { + u.push(e); + } + } + } + const c = []; + for (const e of d){ + const t = n[e]; + const s = a.data[e]; + c.push({ + key: { + status: "valid", + value: e + }, + value: t._parse(new ParseInputLazyPath(a, s, a.path, e)), + alwaysSet: e in a.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const e = this._def.unknownKeys; + if (e === "passthrough") { + for (const e of u){ + c.push({ + key: { + status: "valid", + value: e + }, + value: { + status: "valid", + value: a.data[e] + } + }); + } + } else if (e === "strict") { + if (u.length > 0) { + (0, i.addIssueToContext)(a, { + code: r.ZodIssueCode.unrecognized_keys, + keys: u + }); + s.dirty(); + } + } else if (e === "strip") {} else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const e = this._def.catchall; + for (const t of u){ + const s = a.data[t]; + c.push({ + key: { + status: "valid", + value: t + }, + value: e._parse(new ParseInputLazyPath(a, s, a.path, t)), + alwaysSet: t in a.data + }); + } + } + if (a.common.async) { + return Promise.resolve().then(async ()=>{ + const e = []; + for (const t of c){ + const s = await t.key; + const r = await t.value; + e.push({ + key: s, + value: r, + alwaysSet: t.alwaysSet + }); + } + return e; + }).then((e)=>i.ParseStatus.mergeObjectSync(s, e)); + } else { + return i.ParseStatus.mergeObjectSync(s, c); + } + } + get shape() { + return this._def.shape(); + } + strict(e) { + n.errorUtil.errToObj; + return new ZodObject({ + ...this._def, + unknownKeys: "strict", + ...e !== undefined ? { + errorMap: (t, s)=>{ + const r = this._def.errorMap?.(t, s).message ?? s.defaultError; + if (t.code === "unrecognized_keys") return { + message: n.errorUtil.errToObj(e).message ?? r + }; + return { + message: r + }; + } + } : {} + }); + } + strip() { + return new ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + extend(e) { + return new ZodObject({ + ...this._def, + shape: ()=>({ + ...this._def.shape(), + ...e + }) + }); + } + merge(e) { + const t = new ZodObject({ + unknownKeys: e._def.unknownKeys, + catchall: e._def.catchall, + shape: ()=>({ + ...this._def.shape(), + ...e._def.shape() + }), + typeName: k.ZodObject + }); + return t; + } + setKey(e, t) { + return this.augment({ + [e]: t + }); + } + catchall(e) { + return new ZodObject({ + ...this._def, + catchall: e + }); + } + pick(e) { + const t = {}; + for (const s of o.util.objectKeys(e)){ + if (e[s] && this.shape[s]) { + t[s] = this.shape[s]; + } + } + return new ZodObject({ + ...this._def, + shape: ()=>t + }); + } + omit(e) { + const t = {}; + for (const s of o.util.objectKeys(this.shape)){ + if (!e[s]) { + t[s] = this.shape[s]; + } + } + return new ZodObject({ + ...this._def, + shape: ()=>t + }); + } + deepPartial() { + return deepPartialify(this); + } + partial(e) { + const t = {}; + for (const s of o.util.objectKeys(this.shape)){ + const r = this.shape[s]; + if (e && !e[s]) { + t[s] = r; + } else { + t[s] = r.optional(); + } + } + return new ZodObject({ + ...this._def, + shape: ()=>t + }); + } + required(e) { + const t = {}; + for (const s of o.util.objectKeys(this.shape)){ + if (e && !e[s]) { + t[s] = this.shape[s]; + } else { + const e = this.shape[s]; + let r = e; + while(r instanceof ZodOptional){ + r = r._def.innerType; + } + t[s] = r; + } + } + return new ZodObject({ + ...this._def, + shape: ()=>t + }); + } + keyof() { + return createZodEnum(o.util.objectKeys(this.shape)); + } + } + t.ZodObject = ZodObject; + ZodObject.create = (e, t)=>new ZodObject({ + shape: ()=>e, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: k.ZodObject, + ...processCreateParams(t) + }); + ZodObject.strictCreate = (e, t)=>new ZodObject({ + shape: ()=>e, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: k.ZodObject, + ...processCreateParams(t) + }); + ZodObject.lazycreate = (e, t)=>new ZodObject({ + shape: e, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: k.ZodObject, + ...processCreateParams(t) + }); + class ZodUnion extends ZodType { + _parse(e) { + const { ctx: t } = this._processInputParams(e); + const s = this._def.options; + function handleResults(e) { + for (const t of e){ + if (t.result.status === "valid") { + return t.result; + } + } + for (const s of e){ + if (s.result.status === "dirty") { + t.common.issues.push(...s.ctx.common.issues); + return s.result; + } + } + const s = e.map((e)=>new r.ZodError(e.ctx.common.issues)); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_union, + unionErrors: s + }); + return i.INVALID; + } + if (t.common.async) { + return Promise.all(s.map(async (e)=>{ + const s = { + ...t, + common: { + ...t.common, + issues: [] + }, + parent: null + }; + return { + result: await e._parseAsync({ + data: t.data, + path: t.path, + parent: s + }), + ctx: s + }; + })).then(handleResults); + } else { + let e = undefined; + const a = []; + for (const r of s){ + const s = { + ...t, + common: { + ...t.common, + issues: [] + }, + parent: null + }; + const n = r._parseSync({ + data: t.data, + path: t.path, + parent: s + }); + if (n.status === "valid") { + return n; + } else if (n.status === "dirty" && !e) { + e = { + result: n, + ctx: s + }; + } + if (s.common.issues.length) { + a.push(s.common.issues); + } + } + if (e) { + t.common.issues.push(...e.ctx.common.issues); + return e.result; + } + const n = a.map((e)=>new r.ZodError(e)); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_union, + unionErrors: n + }); + return i.INVALID; + } + } + get options() { + return this._def.options; + } + } + t.ZodUnion = ZodUnion; + ZodUnion.create = (e, t)=>new ZodUnion({ + options: e, + typeName: k.ZodUnion, + ...processCreateParams(t) + }); + const getDiscriminator = (e)=>{ + if (e instanceof ZodLazy) { + return getDiscriminator(e.schema); + } else if (e instanceof ZodEffects) { + return getDiscriminator(e.innerType()); + } else if (e instanceof ZodLiteral) { + return [ + e.value + ]; + } else if (e instanceof ZodEnum) { + return e.options; + } else if (e instanceof ZodNativeEnum) { + return o.util.objectValues(e.enum); + } else if (e instanceof ZodDefault) { + return getDiscriminator(e._def.innerType); + } else if (e instanceof ZodUndefined) { + return [ + undefined + ]; + } else if (e instanceof ZodNull) { + return [ + null + ]; + } else if (e instanceof ZodOptional) { + return [ + undefined, + ...getDiscriminator(e.unwrap()) + ]; + } else if (e instanceof ZodNullable) { + return [ + null, + ...getDiscriminator(e.unwrap()) + ]; + } else if (e instanceof ZodBranded) { + return getDiscriminator(e.unwrap()); + } else if (e instanceof ZodReadonly) { + return getDiscriminator(e.unwrap()); + } else if (e instanceof ZodCatch) { + return getDiscriminator(e._def.innerType); + } else { + return []; + } + }; + class ZodDiscriminatedUnion extends ZodType { + _parse(e) { + const { ctx: t } = this._processInputParams(e); + if (t.parsedType !== o.ZodParsedType.object) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.object, + received: t.parsedType + }); + return i.INVALID; + } + const s = this.discriminator; + const a = t.data[s]; + const n = this.optionsMap.get(a); + if (!n) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [ + s + ] + }); + return i.INVALID; + } + if (t.common.async) { + return n._parseAsync({ + data: t.data, + path: t.path, + parent: t + }); + } else { + return n._parseSync({ + data: t.data, + path: t.path, + parent: t + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + static create(e, t, s) { + const r = new Map; + for (const s of t){ + const t = getDiscriminator(s.shape[e]); + if (!t.length) { + throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`); + } + for (const a of t){ + if (r.has(a)) { + throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`); + } + r.set(a, s); + } + } + return new ZodDiscriminatedUnion({ + typeName: k.ZodDiscriminatedUnion, + discriminator: e, + options: t, + optionsMap: r, + ...processCreateParams(s) + }); + } + } + t.ZodDiscriminatedUnion = ZodDiscriminatedUnion; + function mergeValues(e, t) { + const s = (0, o.getParsedType)(e); + const r = (0, o.getParsedType)(t); + if (e === t) { + return { + valid: true, + data: e + }; + } else if (s === o.ZodParsedType.object && r === o.ZodParsedType.object) { + const s = o.util.objectKeys(t); + const r = o.util.objectKeys(e).filter((e)=>s.indexOf(e) !== -1); + const a = { + ...e, + ...t + }; + for (const s of r){ + const r = mergeValues(e[s], t[s]); + if (!r.valid) { + return { + valid: false + }; + } + a[s] = r.data; + } + return { + valid: true, + data: a + }; + } else if (s === o.ZodParsedType.array && r === o.ZodParsedType.array) { + if (e.length !== t.length) { + return { + valid: false + }; + } + const s = []; + for(let r = 0; r < e.length; r++){ + const a = e[r]; + const n = t[r]; + const i = mergeValues(a, n); + if (!i.valid) { + return { + valid: false + }; + } + s.push(i.data); + } + return { + valid: true, + data: s + }; + } else if (s === o.ZodParsedType.date && r === o.ZodParsedType.date && +e === +t) { + return { + valid: true, + data: e + }; + } else { + return { + valid: false + }; + } + } + class ZodIntersection extends ZodType { + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + const handleParsed = (e, a)=>{ + if ((0, i.isAborted)(e) || (0, i.isAborted)(a)) { + return i.INVALID; + } + const n = mergeValues(e.value, a.value); + if (!n.valid) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_intersection_types + }); + return i.INVALID; + } + if ((0, i.isDirty)(e) || (0, i.isDirty)(a)) { + t.dirty(); + } + return { + status: t.value, + value: n.data + }; + }; + if (s.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: s.data, + path: s.path, + parent: s + }), + this._def.right._parseAsync({ + data: s.data, + path: s.path, + parent: s + }) + ]).then(([e, t])=>handleParsed(e, t)); + } else { + return handleParsed(this._def.left._parseSync({ + data: s.data, + path: s.path, + parent: s + }), this._def.right._parseSync({ + data: s.data, + path: s.path, + parent: s + })); + } + } + } + t.ZodIntersection = ZodIntersection; + ZodIntersection.create = (e, t, s)=>new ZodIntersection({ + left: e, + right: t, + typeName: k.ZodIntersection, + ...processCreateParams(s) + }); + class ZodTuple extends ZodType { + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + if (s.parsedType !== o.ZodParsedType.array) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.array, + received: s.parsedType + }); + return i.INVALID; + } + if (s.data.length < this._def.items.length) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return i.INVALID; + } + const a = this._def.rest; + if (!a && s.data.length > this._def.items.length) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + t.dirty(); + } + const n = [ + ...s.data + ].map((e, t)=>{ + const r = this._def.items[t] || this._def.rest; + if (!r) return null; + return r._parse(new ParseInputLazyPath(s, e, s.path, t)); + }).filter((e)=>!!e); + if (s.common.async) { + return Promise.all(n).then((e)=>i.ParseStatus.mergeArray(t, e)); + } else { + return i.ParseStatus.mergeArray(t, n); + } + } + get items() { + return this._def.items; + } + rest(e) { + return new ZodTuple({ + ...this._def, + rest: e + }); + } + } + t.ZodTuple = ZodTuple; + ZodTuple.create = (e, t)=>{ + if (!Array.isArray(e)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: e, + typeName: k.ZodTuple, + rest: null, + ...processCreateParams(t) + }); + }; + class ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + if (s.parsedType !== o.ZodParsedType.object) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.object, + received: s.parsedType + }); + return i.INVALID; + } + const a = []; + const n = this._def.keyType; + const d = this._def.valueType; + for(const e in s.data){ + a.push({ + key: n._parse(new ParseInputLazyPath(s, e, s.path, e)), + value: d._parse(new ParseInputLazyPath(s, s.data[e], s.path, e)), + alwaysSet: e in s.data + }); + } + if (s.common.async) { + return i.ParseStatus.mergeObjectAsync(t, a); + } else { + return i.ParseStatus.mergeObjectSync(t, a); + } + } + get element() { + return this._def.valueType; + } + static create(e, t, s) { + if (t instanceof ZodType) { + return new ZodRecord({ + keyType: e, + valueType: t, + typeName: k.ZodRecord, + ...processCreateParams(s) + }); + } + return new ZodRecord({ + keyType: ZodString.create(), + valueType: e, + typeName: k.ZodRecord, + ...processCreateParams(t) + }); + } + } + t.ZodRecord = ZodRecord; + class ZodMap extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + if (s.parsedType !== o.ZodParsedType.map) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.map, + received: s.parsedType + }); + return i.INVALID; + } + const a = this._def.keyType; + const n = this._def.valueType; + const d = [ + ...s.data.entries() + ].map(([e, t], r)=>({ + key: a._parse(new ParseInputLazyPath(s, e, s.path, [ + r, + "key" + ])), + value: n._parse(new ParseInputLazyPath(s, t, s.path, [ + r, + "value" + ])) + })); + if (s.common.async) { + const e = new Map; + return Promise.resolve().then(async ()=>{ + for (const s of d){ + const r = await s.key; + const a = await s.value; + if (r.status === "aborted" || a.status === "aborted") { + return i.INVALID; + } + if (r.status === "dirty" || a.status === "dirty") { + t.dirty(); + } + e.set(r.value, a.value); + } + return { + status: t.value, + value: e + }; + }); + } else { + const e = new Map; + for (const s of d){ + const r = s.key; + const a = s.value; + if (r.status === "aborted" || a.status === "aborted") { + return i.INVALID; + } + if (r.status === "dirty" || a.status === "dirty") { + t.dirty(); + } + e.set(r.value, a.value); + } + return { + status: t.value, + value: e + }; + } + } + } + t.ZodMap = ZodMap; + ZodMap.create = (e, t, s)=>new ZodMap({ + valueType: t, + keyType: e, + typeName: k.ZodMap, + ...processCreateParams(s) + }); + class ZodSet extends ZodType { + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + if (s.parsedType !== o.ZodParsedType.set) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.set, + received: s.parsedType + }); + return i.INVALID; + } + const a = this._def; + if (a.minSize !== null) { + if (s.data.size < a.minSize.value) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_small, + minimum: a.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: a.minSize.message + }); + t.dirty(); + } + } + if (a.maxSize !== null) { + if (s.data.size > a.maxSize.value) { + (0, i.addIssueToContext)(s, { + code: r.ZodIssueCode.too_big, + maximum: a.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: a.maxSize.message + }); + t.dirty(); + } + } + const n = this._def.valueType; + function finalizeSet(e) { + const s = new Set; + for (const r of e){ + if (r.status === "aborted") return i.INVALID; + if (r.status === "dirty") t.dirty(); + s.add(r.value); + } + return { + status: t.value, + value: s + }; + } + const d = [ + ...s.data.values() + ].map((e, t)=>n._parse(new ParseInputLazyPath(s, e, s.path, t))); + if (s.common.async) { + return Promise.all(d).then((e)=>finalizeSet(e)); + } else { + return finalizeSet(d); + } + } + min(e, t) { + return new ZodSet({ + ...this._def, + minSize: { + value: e, + message: n.errorUtil.toString(t) + } + }); + } + max(e, t) { + return new ZodSet({ + ...this._def, + maxSize: { + value: e, + message: n.errorUtil.toString(t) + } + }); + } + size(e, t) { + return this.min(e, t).max(e, t); + } + nonempty(e) { + return this.min(1, e); + } + } + t.ZodSet = ZodSet; + ZodSet.create = (e, t)=>new ZodSet({ + valueType: e, + minSize: null, + maxSize: null, + typeName: k.ZodSet, + ...processCreateParams(t) + }); + class ZodFunction extends ZodType { + constructor(){ + super(...arguments); + this.validate = this.implement; + } + _parse(e) { + const { ctx: t } = this._processInputParams(e); + if (t.parsedType !== o.ZodParsedType.function) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.function, + received: t.parsedType + }); + return i.INVALID; + } + function makeArgsIssue(e, s) { + return (0, i.makeIssue)({ + data: e, + path: t.path, + errorMaps: [ + t.common.contextualErrorMap, + t.schemaErrorMap, + (0, a.getErrorMap)(), + a.defaultErrorMap + ].filter((e)=>!!e), + issueData: { + code: r.ZodIssueCode.invalid_arguments, + argumentsError: s + } + }); + } + function makeReturnsIssue(e, s) { + return (0, i.makeIssue)({ + data: e, + path: t.path, + errorMaps: [ + t.common.contextualErrorMap, + t.schemaErrorMap, + (0, a.getErrorMap)(), + a.defaultErrorMap + ].filter((e)=>!!e), + issueData: { + code: r.ZodIssueCode.invalid_return_type, + returnTypeError: s + } + }); + } + const s = { + errorMap: t.common.contextualErrorMap + }; + const n = t.data; + if (this._def.returns instanceof ZodPromise) { + const e = this; + return (0, i.OK)(async function(...t) { + const a = new r.ZodError([]); + const i = await e._def.args.parseAsync(t, s).catch((e)=>{ + a.addIssue(makeArgsIssue(t, e)); + throw a; + }); + const o = await Reflect.apply(n, this, i); + const d = await e._def.returns._def.type.parseAsync(o, s).catch((e)=>{ + a.addIssue(makeReturnsIssue(o, e)); + throw a; + }); + return d; + }); + } else { + const e = this; + return (0, i.OK)(function(...t) { + const a = e._def.args.safeParse(t, s); + if (!a.success) { + throw new r.ZodError([ + makeArgsIssue(t, a.error) + ]); + } + const i = Reflect.apply(n, this, a.data); + const o = e._def.returns.safeParse(i, s); + if (!o.success) { + throw new r.ZodError([ + makeReturnsIssue(i, o.error) + ]); + } + return o.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...e) { + return new ZodFunction({ + ...this._def, + args: ZodTuple.create(e).rest(ZodUnknown.create()) + }); + } + returns(e) { + return new ZodFunction({ + ...this._def, + returns: e + }); + } + implement(e) { + const t = this.parse(e); + return t; + } + strictImplement(e) { + const t = this.parse(e); + return t; + } + static create(e, t, s) { + return new ZodFunction({ + args: e ? e : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: t || ZodUnknown.create(), + typeName: k.ZodFunction, + ...processCreateParams(s) + }); + } + } + t.ZodFunction = ZodFunction; + class ZodLazy extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(e) { + const { ctx: t } = this._processInputParams(e); + const s = this._def.getter(); + return s._parse({ + data: t.data, + path: t.path, + parent: t + }); + } + } + t.ZodLazy = ZodLazy; + ZodLazy.create = (e, t)=>new ZodLazy({ + getter: e, + typeName: k.ZodLazy, + ...processCreateParams(t) + }); + class ZodLiteral extends ZodType { + _parse(e) { + if (e.data !== this._def.value) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + received: t.data, + code: r.ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return i.INVALID; + } + return { + status: "valid", + value: e.data + }; + } + get value() { + return this._def.value; + } + } + t.ZodLiteral = ZodLiteral; + ZodLiteral.create = (e, t)=>new ZodLiteral({ + value: e, + typeName: k.ZodLiteral, + ...processCreateParams(t) + }); + function createZodEnum(e, t) { + return new ZodEnum({ + values: e, + typeName: k.ZodEnum, + ...processCreateParams(t) + }); + } + class ZodEnum extends ZodType { + _parse(e) { + if (typeof e.data !== "string") { + const t = this._getOrReturnCtx(e); + const s = this._def.values; + (0, i.addIssueToContext)(t, { + expected: o.util.joinValues(s), + received: t.parsedType, + code: r.ZodIssueCode.invalid_type + }); + return i.INVALID; + } + if (!this._cache) { + this._cache = new Set(this._def.values); + } + if (!this._cache.has(e.data)) { + const t = this._getOrReturnCtx(e); + const s = this._def.values; + (0, i.addIssueToContext)(t, { + received: t.data, + code: r.ZodIssueCode.invalid_enum_value, + options: s + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + get options() { + return this._def.values; + } + get enum() { + const e = {}; + for (const t of this._def.values){ + e[t] = t; + } + return e; + } + get Values() { + const e = {}; + for (const t of this._def.values){ + e[t] = t; + } + return e; + } + get Enum() { + const e = {}; + for (const t of this._def.values){ + e[t] = t; + } + return e; + } + extract(e, t = this._def) { + return ZodEnum.create(e, { + ...this._def, + ...t + }); + } + exclude(e, t = this._def) { + return ZodEnum.create(this.options.filter((t)=>!e.includes(t)), { + ...this._def, + ...t + }); + } + } + t.ZodEnum = ZodEnum; + ZodEnum.create = createZodEnum; + class ZodNativeEnum extends ZodType { + _parse(e) { + const t = o.util.getValidEnumValues(this._def.values); + const s = this._getOrReturnCtx(e); + if (s.parsedType !== o.ZodParsedType.string && s.parsedType !== o.ZodParsedType.number) { + const e = o.util.objectValues(t); + (0, i.addIssueToContext)(s, { + expected: o.util.joinValues(e), + received: s.parsedType, + code: r.ZodIssueCode.invalid_type + }); + return i.INVALID; + } + if (!this._cache) { + this._cache = new Set(o.util.getValidEnumValues(this._def.values)); + } + if (!this._cache.has(e.data)) { + const e = o.util.objectValues(t); + (0, i.addIssueToContext)(s, { + received: s.data, + code: r.ZodIssueCode.invalid_enum_value, + options: e + }); + return i.INVALID; + } + return (0, i.OK)(e.data); + } + get enum() { + return this._def.values; + } + } + t.ZodNativeEnum = ZodNativeEnum; + ZodNativeEnum.create = (e, t)=>new ZodNativeEnum({ + values: e, + typeName: k.ZodNativeEnum, + ...processCreateParams(t) + }); + class ZodPromise extends ZodType { + unwrap() { + return this._def.type; + } + _parse(e) { + const { ctx: t } = this._processInputParams(e); + if (t.parsedType !== o.ZodParsedType.promise && t.common.async === false) { + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.promise, + received: t.parsedType + }); + return i.INVALID; + } + const s = t.parsedType === o.ZodParsedType.promise ? t.data : Promise.resolve(t.data); + return (0, i.OK)(s.then((e)=>this._def.type.parseAsync(e, { + path: t.path, + errorMap: t.common.contextualErrorMap + }))); + } + } + t.ZodPromise = ZodPromise; + ZodPromise.create = (e, t)=>new ZodPromise({ + type: e, + typeName: k.ZodPromise, + ...processCreateParams(t) + }); + class ZodEffects extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === k.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + const r = this._def.effect || null; + const a = { + addIssue: (e)=>{ + (0, i.addIssueToContext)(s, e); + if (e.fatal) { + t.abort(); + } else { + t.dirty(); + } + }, + get path () { + return s.path; + } + }; + a.addIssue = a.addIssue.bind(a); + if (r.type === "preprocess") { + const e = r.transform(s.data, a); + if (s.common.async) { + return Promise.resolve(e).then(async (e)=>{ + if (t.value === "aborted") return i.INVALID; + const r = await this._def.schema._parseAsync({ + data: e, + path: s.path, + parent: s + }); + if (r.status === "aborted") return i.INVALID; + if (r.status === "dirty") return (0, i.DIRTY)(r.value); + if (t.value === "dirty") return (0, i.DIRTY)(r.value); + return r; + }); + } else { + if (t.value === "aborted") return i.INVALID; + const r = this._def.schema._parseSync({ + data: e, + path: s.path, + parent: s + }); + if (r.status === "aborted") return i.INVALID; + if (r.status === "dirty") return (0, i.DIRTY)(r.value); + if (t.value === "dirty") return (0, i.DIRTY)(r.value); + return r; + } + } + if (r.type === "refinement") { + const executeRefinement = (e)=>{ + const t = r.refinement(e, a); + if (s.common.async) { + return Promise.resolve(t); + } + if (t instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return e; + }; + if (s.common.async === false) { + const e = this._def.schema._parseSync({ + data: s.data, + path: s.path, + parent: s + }); + if (e.status === "aborted") return i.INVALID; + if (e.status === "dirty") t.dirty(); + executeRefinement(e.value); + return { + status: t.value, + value: e.value + }; + } else { + return this._def.schema._parseAsync({ + data: s.data, + path: s.path, + parent: s + }).then((e)=>{ + if (e.status === "aborted") return i.INVALID; + if (e.status === "dirty") t.dirty(); + return executeRefinement(e.value).then(()=>({ + status: t.value, + value: e.value + })); + }); + } + } + if (r.type === "transform") { + if (s.common.async === false) { + const e = this._def.schema._parseSync({ + data: s.data, + path: s.path, + parent: s + }); + if (!(0, i.isValid)(e)) return i.INVALID; + const n = r.transform(e.value, a); + if (n instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { + status: t.value, + value: n + }; + } else { + return this._def.schema._parseAsync({ + data: s.data, + path: s.path, + parent: s + }).then((e)=>{ + if (!(0, i.isValid)(e)) return i.INVALID; + return Promise.resolve(r.transform(e.value, a)).then((e)=>({ + status: t.value, + value: e + })); + }); + } + } + o.util.assertNever(r); + } + } + t.ZodEffects = ZodEffects; + t.ZodTransformer = ZodEffects; + ZodEffects.create = (e, t, s)=>new ZodEffects({ + schema: e, + typeName: k.ZodEffects, + effect: t, + ...processCreateParams(s) + }); + ZodEffects.createWithPreprocess = (e, t, s)=>new ZodEffects({ + schema: t, + effect: { + type: "preprocess", + transform: e + }, + typeName: k.ZodEffects, + ...processCreateParams(s) + }); + class ZodOptional extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t === o.ZodParsedType.undefined) { + return (0, i.OK)(undefined); + } + return this._def.innerType._parse(e); + } + unwrap() { + return this._def.innerType; + } + } + t.ZodOptional = ZodOptional; + ZodOptional.create = (e, t)=>new ZodOptional({ + innerType: e, + typeName: k.ZodOptional, + ...processCreateParams(t) + }); + class ZodNullable extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t === o.ZodParsedType.null) { + return (0, i.OK)(null); + } + return this._def.innerType._parse(e); + } + unwrap() { + return this._def.innerType; + } + } + t.ZodNullable = ZodNullable; + ZodNullable.create = (e, t)=>new ZodNullable({ + innerType: e, + typeName: k.ZodNullable, + ...processCreateParams(t) + }); + class ZodDefault extends ZodType { + _parse(e) { + const { ctx: t } = this._processInputParams(e); + let s = t.data; + if (t.parsedType === o.ZodParsedType.undefined) { + s = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data: s, + path: t.path, + parent: t + }); + } + removeDefault() { + return this._def.innerType; + } + } + t.ZodDefault = ZodDefault; + ZodDefault.create = (e, t)=>new ZodDefault({ + innerType: e, + typeName: k.ZodDefault, + defaultValue: typeof t.default === "function" ? t.default : ()=>t.default, + ...processCreateParams(t) + }); + class ZodCatch extends ZodType { + _parse(e) { + const { ctx: t } = this._processInputParams(e); + const s = { + ...t, + common: { + ...t.common, + issues: [] + } + }; + const a = this._def.innerType._parse({ + data: s.data, + path: s.path, + parent: { + ...s + } + }); + if ((0, i.isAsync)(a)) { + return a.then((e)=>({ + status: "valid", + value: e.status === "valid" ? e.value : this._def.catchValue({ + get error () { + return new r.ZodError(s.common.issues); + }, + input: s.data + }) + })); + } else { + return { + status: "valid", + value: a.status === "valid" ? a.value : this._def.catchValue({ + get error () { + return new r.ZodError(s.common.issues); + }, + input: s.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } + } + t.ZodCatch = ZodCatch; + ZodCatch.create = (e, t)=>new ZodCatch({ + innerType: e, + typeName: k.ZodCatch, + catchValue: typeof t.catch === "function" ? t.catch : ()=>t.catch, + ...processCreateParams(t) + }); + class ZodNaN extends ZodType { + _parse(e) { + const t = this._getType(e); + if (t !== o.ZodParsedType.nan) { + const t = this._getOrReturnCtx(e); + (0, i.addIssueToContext)(t, { + code: r.ZodIssueCode.invalid_type, + expected: o.ZodParsedType.nan, + received: t.parsedType + }); + return i.INVALID; + } + return { + status: "valid", + value: e.data + }; + } + } + t.ZodNaN = ZodNaN; + ZodNaN.create = (e)=>new ZodNaN({ + typeName: k.ZodNaN, + ...processCreateParams(e) + }); + t.BRAND = Symbol("zod_brand"); + class ZodBranded extends ZodType { + _parse(e) { + const { ctx: t } = this._processInputParams(e); + const s = t.data; + return this._def.type._parse({ + data: s, + path: t.path, + parent: t + }); + } + unwrap() { + return this._def.type; + } + } + t.ZodBranded = ZodBranded; + class ZodPipeline extends ZodType { + _parse(e) { + const { status: t, ctx: s } = this._processInputParams(e); + if (s.common.async) { + const handleAsync = async ()=>{ + const e = await this._def.in._parseAsync({ + data: s.data, + path: s.path, + parent: s + }); + if (e.status === "aborted") return i.INVALID; + if (e.status === "dirty") { + t.dirty(); + return (0, i.DIRTY)(e.value); + } else { + return this._def.out._parseAsync({ + data: e.value, + path: s.path, + parent: s + }); + } + }; + return handleAsync(); + } else { + const e = this._def.in._parseSync({ + data: s.data, + path: s.path, + parent: s + }); + if (e.status === "aborted") return i.INVALID; + if (e.status === "dirty") { + t.dirty(); + return { + status: "dirty", + value: e.value + }; + } else { + return this._def.out._parseSync({ + data: e.value, + path: s.path, + parent: s + }); + } + } + } + static create(e, t) { + return new ZodPipeline({ + in: e, + out: t, + typeName: k.ZodPipeline + }); + } + } + t.ZodPipeline = ZodPipeline; + class ZodReadonly extends ZodType { + _parse(e) { + const t = this._def.innerType._parse(e); + const freeze = (e)=>{ + if ((0, i.isValid)(e)) { + e.value = Object.freeze(e.value); + } + return e; + }; + return (0, i.isAsync)(t) ? t.then((e)=>freeze(e)) : freeze(t); + } + unwrap() { + return this._def.innerType; + } + } + t.ZodReadonly = ZodReadonly; + ZodReadonly.create = (e, t)=>new ZodReadonly({ + innerType: e, + typeName: k.ZodReadonly, + ...processCreateParams(t) + }); + function cleanParams(e, t) { + const s = typeof e === "function" ? e(t) : typeof e === "string" ? { + message: e + } : e; + const r = typeof s === "string" ? { + message: s + } : s; + return r; + } + function custom(e, t = {}, s) { + if (e) return ZodAny.create().superRefine((r, a)=>{ + const n = e(r); + if (n instanceof Promise) { + return n.then((e)=>{ + if (!e) { + const e = cleanParams(t, r); + const n = e.fatal ?? s ?? true; + a.addIssue({ + code: "custom", + ...e, + fatal: n + }); + } + }); + } + if (!n) { + const e = cleanParams(t, r); + const n = e.fatal ?? s ?? true; + a.addIssue({ + code: "custom", + ...e, + fatal: n + }); + } + return; + }); + return ZodAny.create(); + } + t.late = { + object: ZodObject.lazycreate + }; + var k; + (function(e) { + e["ZodString"] = "ZodString"; + e["ZodNumber"] = "ZodNumber"; + e["ZodNaN"] = "ZodNaN"; + e["ZodBigInt"] = "ZodBigInt"; + e["ZodBoolean"] = "ZodBoolean"; + e["ZodDate"] = "ZodDate"; + e["ZodSymbol"] = "ZodSymbol"; + e["ZodUndefined"] = "ZodUndefined"; + e["ZodNull"] = "ZodNull"; + e["ZodAny"] = "ZodAny"; + e["ZodUnknown"] = "ZodUnknown"; + e["ZodNever"] = "ZodNever"; + e["ZodVoid"] = "ZodVoid"; + e["ZodArray"] = "ZodArray"; + e["ZodObject"] = "ZodObject"; + e["ZodUnion"] = "ZodUnion"; + e["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + e["ZodIntersection"] = "ZodIntersection"; + e["ZodTuple"] = "ZodTuple"; + e["ZodRecord"] = "ZodRecord"; + e["ZodMap"] = "ZodMap"; + e["ZodSet"] = "ZodSet"; + e["ZodFunction"] = "ZodFunction"; + e["ZodLazy"] = "ZodLazy"; + e["ZodLiteral"] = "ZodLiteral"; + e["ZodEnum"] = "ZodEnum"; + e["ZodEffects"] = "ZodEffects"; + e["ZodNativeEnum"] = "ZodNativeEnum"; + e["ZodOptional"] = "ZodOptional"; + e["ZodNullable"] = "ZodNullable"; + e["ZodDefault"] = "ZodDefault"; + e["ZodCatch"] = "ZodCatch"; + e["ZodPromise"] = "ZodPromise"; + e["ZodBranded"] = "ZodBranded"; + e["ZodPipeline"] = "ZodPipeline"; + e["ZodReadonly"] = "ZodReadonly"; + })(k || (t.ZodFirstPartyTypeKind = k = {})); + class Class { + constructor(...e){} + } + const instanceOfType = (e, t = { + message: `Input not instance of ${e.name}` + })=>custom((t)=>t instanceof e, t); + t["instanceof"] = instanceOfType; + const P = ZodString.create; + t.string = P; + const w = ZodNumber.create; + t.number = w; + const N = ZodNaN.create; + t.nan = N; + const O = ZodBigInt.create; + t.bigint = O; + const A = ZodBoolean.create; + t.boolean = A; + const S = ZodDate.create; + t.date = S; + const j = ZodSymbol.create; + t.symbol = j; + const E = ZodUndefined.create; + t.undefined = E; + const D = ZodNull.create; + t["null"] = D; + const L = ZodAny.create; + t.any = L; + const U = ZodUnknown.create; + t.unknown = U; + const R = ZodNever.create; + t.never = R; + const V = ZodVoid.create; + t["void"] = V; + const M = ZodArray.create; + t.array = M; + const $ = ZodObject.create; + t.object = $; + const z = ZodObject.strictCreate; + t.strictObject = z; + const F = ZodUnion.create; + t.union = F; + const B = ZodDiscriminatedUnion.create; + t.discriminatedUnion = B; + const K = ZodIntersection.create; + t.intersection = K; + const q = ZodTuple.create; + t.tuple = q; + const W = ZodRecord.create; + t.record = W; + const Y = ZodMap.create; + t.map = Y; + const J = ZodSet.create; + t.set = J; + const H = ZodFunction.create; + t["function"] = H; + const G = ZodLazy.create; + t.lazy = G; + const X = ZodLiteral.create; + t.literal = X; + const Q = ZodEnum.create; + t["enum"] = Q; + const ee = ZodNativeEnum.create; + t.nativeEnum = ee; + const te = ZodPromise.create; + t.promise = te; + const se = ZodEffects.create; + t.effect = se; + t.transformer = se; + const re = ZodOptional.create; + t.optional = re; + const ae = ZodNullable.create; + t.nullable = ae; + const ne = ZodEffects.createWithPreprocess; + t.preprocess = ne; + const ie = ZodPipeline.create; + t.pipeline = ie; + const ostring = ()=>P().optional(); + t.ostring = ostring; + const onumber = ()=>w().optional(); + t.onumber = onumber; + const oboolean = ()=>A().optional(); + t.oboolean = oboolean; + t.coerce = { + string: (e)=>ZodString.create({ + ...e, + coerce: true + }), + number: (e)=>ZodNumber.create({ + ...e, + coerce: true + }), + boolean: (e)=>ZodBoolean.create({ + ...e, + coerce: true + }), + bigint: (e)=>ZodBigInt.create({ + ...e, + coerce: true + }), + date: (e)=>ZodDate.create({ + ...e, + coerce: true + }) + }; + t.NEVER = i.INVALID; + } + }; + var t = {}; + function __nccwpck_require__(s) { + var r = t[s]; + if (r !== undefined) { + return r.exports; + } + var a = t[s] = { + exports: {} + }; + var n = true; + try { + e[s].call(a.exports, a, a.exports, __nccwpck_require__); + n = false; + } finally{ + if (n) delete t[s]; + } + return a.exports; + } + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/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/zod") + "/"; + var s = __nccwpck_require__(629); + module.exports = s; +})(); +}), +"[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/zod-validation-error/index.js [app-rsc] (ecmascript)", ((__turbopack_context__, module, exports) => { + +(()=>{ + "use strict"; + var r = { + 452: (r, e, o)=>{ + var t = Object.create; + var s = Object.defineProperty; + var n = Object.getOwnPropertyDescriptor; + var i = Object.getOwnPropertyNames; + var a = Object.getPrototypeOf; + var u = Object.prototype.hasOwnProperty; + var __export = (r, e)=>{ + for(var o in e)s(r, o, { + get: e[o], + enumerable: true + }); + }; + var __copyProps = (r, e, o, t)=>{ + if (e && typeof e === "object" || typeof e === "function") { + for (let a of i(e))if (!u.call(r, a) && a !== o) s(r, a, { + get: ()=>e[a], + enumerable: !(t = n(e, a)) || t.enumerable + }); + } + return r; + }; + var __toESM = (r, e, o)=>(o = r != null ? t(a(r)) : {}, __copyProps(e || !r || !r.__esModule ? s(o, "default", { + value: r, + enumerable: true + }) : o, r)); + var __toCommonJS = (r)=>__copyProps(s({}, "__esModule", { + value: true + }), r); + var d = {}; + __export(d, { + ValidationError: ()=>c, + createMessageBuilder: ()=>createMessageBuilder, + errorMap: ()=>errorMap, + fromError: ()=>fromError, + fromZodError: ()=>fromZodError, + fromZodIssue: ()=>fromZodIssue, + isValidationError: ()=>isValidationError, + isValidationErrorLike: ()=>isValidationErrorLike, + isZodErrorLike: ()=>isZodErrorLike, + toValidationError: ()=>toValidationError + }); + r.exports = __toCommonJS(d); + function isZodErrorLike(r) { + return r instanceof Error && r.name === "ZodError" && "issues" in r && Array.isArray(r.issues); + } + var c = class extends Error { + name; + details; + constructor(r, e){ + super(r, e); + this.name = "ZodValidationError"; + this.details = getIssuesFromErrorOptions(e); + } + toString() { + return this.message; + } + }; + function getIssuesFromErrorOptions(r) { + if (r) { + const e = r.cause; + if (isZodErrorLike(e)) { + return e.issues; + } + } + return []; + } + function isValidationError(r) { + return r instanceof c; + } + function isValidationErrorLike(r) { + return r instanceof Error && r.name === "ZodValidationError"; + } + var f = __toESM(o(788)); + var p = __toESM(o(788)); + function isNonEmptyArray(r) { + return r.length !== 0; + } + var l = /[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*/u; + function joinPath(r) { + if (r.length === 1) { + return r[0].toString(); + } + return r.reduce((r, e)=>{ + if (typeof e === "number") { + return r + "[" + e.toString() + "]"; + } + if (e.includes('"')) { + return r + '["' + escapeQuotes(e) + '"]'; + } + if (!l.test(e)) { + return r + '["' + e + '"]'; + } + const o = r.length === 0 ? "" : "."; + return r + o + e; + }, ""); + } + function escapeQuotes(r) { + return r.replace(/"/g, '\\"'); + } + var m = "; "; + var g = 99; + var E = "Validation error"; + var _ = ": "; + var v = ", or "; + function createMessageBuilder(r = {}) { + const { issueSeparator: e = m, unionSeparator: o = v, prefixSeparator: t = _, prefix: s = E, includePath: n = true, maxIssuesInMessage: i = g } = r; + return (r)=>{ + const a = r.slice(0, i).map((r)=>getMessageFromZodIssue({ + issue: r, + issueSeparator: e, + unionSeparator: o, + includePath: n + })).join(e); + return prefixMessage(a, s, t); + }; + } + function getMessageFromZodIssue(r) { + const { issue: e, issueSeparator: o, unionSeparator: t, includePath: s } = r; + if (e.code === p.ZodIssueCode.invalid_union) { + return e.unionErrors.reduce((r, e)=>{ + const n = e.issues.map((r)=>getMessageFromZodIssue({ + issue: r, + issueSeparator: o, + unionSeparator: t, + includePath: s + })).join(o); + if (!r.includes(n)) { + r.push(n); + } + return r; + }, []).join(t); + } + if (e.code === p.ZodIssueCode.invalid_arguments) { + return [ + e.message, + ...e.argumentsError.issues.map((r)=>getMessageFromZodIssue({ + issue: r, + issueSeparator: o, + unionSeparator: t, + includePath: s + })) + ].join(o); + } + if (e.code === p.ZodIssueCode.invalid_return_type) { + return [ + e.message, + ...e.returnTypeError.issues.map((r)=>getMessageFromZodIssue({ + issue: r, + issueSeparator: o, + unionSeparator: t, + includePath: s + })) + ].join(o); + } + if (s && isNonEmptyArray(e.path)) { + if (e.path.length === 1) { + const r = e.path[0]; + if (typeof r === "number") { + return `${e.message} at index ${r}`; + } + } + return `${e.message} at "${joinPath(e.path)}"`; + } + return e.message; + } + function prefixMessage(r, e, o) { + if (e !== null) { + if (r.length > 0) { + return [ + e, + r + ].join(o); + } + return e; + } + if (r.length > 0) { + return r; + } + return E; + } + function fromZodIssue(r, e = {}) { + const o = createMessageBuilderFromOptions(e); + const t = o([ + r + ]); + return new c(t, { + cause: new f.ZodError([ + r + ]) + }); + } + function createMessageBuilderFromOptions(r) { + if ("messageBuilder" in r) { + return r.messageBuilder; + } + return createMessageBuilder(r); + } + var errorMap = (r, e)=>{ + const o = fromZodIssue({ + ...r, + message: r.message ?? e.defaultError + }); + return { + message: o.message + }; + }; + function fromZodError(r, e = {}) { + if (!isZodErrorLike(r)) { + throw new TypeError(`Invalid zodError param; expected instance of ZodError. Did you mean to use the "${fromError.name}" method instead?`); + } + return fromZodErrorWithoutRuntimeCheck(r, e); + } + function fromZodErrorWithoutRuntimeCheck(r, e = {}) { + const o = r.errors; + let t; + if (isNonEmptyArray(o)) { + const r = createMessageBuilderFromOptions2(e); + t = r(o); + } else { + t = r.message; + } + return new c(t, { + cause: r + }); + } + function createMessageBuilderFromOptions2(r) { + if ("messageBuilder" in r) { + return r.messageBuilder; + } + return createMessageBuilder(r); + } + var toValidationError = (r = {})=>(e)=>{ + if (isZodErrorLike(e)) { + return fromZodErrorWithoutRuntimeCheck(e, r); + } + if (e instanceof Error) { + return new c(e.message, { + cause: e + }); + } + return new c("Unknown error"); + }; + function fromError(r, e = {}) { + return toValidationError(e)(r); + } + 0 && 0; + }, + 788: (r)=>{ + r.exports = __turbopack_context__.r("[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/zod/index.cjs [app-rsc] (ecmascript)"); + } + }; + var e = {}; + function __nccwpck_require__(o) { + var t = e[o]; + if (t !== undefined) { + return t.exports; + } + var s = e[o] = { + exports: {} + }; + var n = true; + try { + r[o](s, s.exports, __nccwpck_require__); + n = false; + } finally{ + if (n) delete e[o]; + } + return s.exports; + } + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/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/zod-validation-error") + "/"; + var o = __nccwpck_require__(452); + module.exports = o; +})(); +}), +"[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/esm/shared/lib/zod.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "formatZodError", + ()=>formatZodError, + "normalizeZodErrors", + ()=>normalizeZodErrors, + "reportZodError", + ()=>reportZodError +]); +var __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/zod/index.cjs [app-rsc] (ecmascript)"); +var __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$zod$2d$validation$2d$error$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/zod-validation-error/index.js [app-rsc] (ecmascript)"); +var __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$esm$2f$build$2f$output$2f$log$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/build/output/log.js [app-rsc] (ecmascript)"); +; +; +; +function processZodErrorMessage(issue) { + let message = issue.message; + let path; + if (issue.path.length > 0) { + if (issue.path.length === 1) { + const identifier = issue.path[0]; + if (typeof identifier === 'number') { + // The first identifier inside path is a number + path = `index ${identifier}`; + } else { + path = `"${identifier}"`; + } + } else { + // joined path to be shown in the error message + path = `"${issue.path.reduce((acc, cur)=>{ + if (typeof cur === 'number') { + // array index + return `${acc}[${cur}]`; + } + if (cur.includes('"')) { + // escape quotes + return `${acc}["${cur.replaceAll('"', '\\"')}"]`; + } + // dot notation + const separator = acc.length === 0 ? '' : '.'; + return acc + separator + cur; + }, '')}"`; + } + } else { + path = ''; + } + if (issue.code === 'invalid_type' && issue.received === __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ZodParsedType"].undefined) { + // Missing key in object. + return `${path} is missing, expected ${issue.expected}`; + } + if (issue.code === 'invalid_enum_value') { + // Remove "Invalid enum value" prefix from zod default error message + return `Expected ${__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["util"].joinValues(issue.options)}, received '${issue.received}' at ${path}`; + } + return message + (path ? ` at ${path}` : ''); +} +function normalizeZodErrors(error) { + return error.issues.flatMap((issue)=>{ + const issues = [ + { + issue, + message: processZodErrorMessage(issue) + } + ]; + if ('unionErrors' in issue) { + for (const unionError of issue.unionErrors){ + issues.push(...normalizeZodErrors(unionError)); + } + } + return issues; + }); +} +function formatZodError(prefix, error) { + return Object.defineProperty(new Error((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$zod$2d$validation$2d$error$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["fromZodError"])(error, { + prefix: prefix + }).toString()), "__NEXT_ERROR_CODE", { + value: "E394", + enumerable: false, + configurable: true + }); +} +function reportZodError(prefix, error) { + __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$esm$2f$build$2f$output$2f$log$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["error"](formatZodError(prefix, error).message); +} //# sourceMappingURL=zod.js.map +}), +"[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/esm/build/segment-config/app/app-segment-config.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "AppSegmentConfigSchemaKeys", + ()=>AppSegmentConfigSchemaKeys, + "parseAppSegmentConfig", + ()=>parseAppSegmentConfig +]); +var __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/zod/index.cjs [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$zod$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/zod.js [app-rsc] (ecmascript)"); +; +; +const CookieSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].object({ + name: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + value: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + httpOnly: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].boolean().optional(), + path: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string().optional() +}).strict(); +const RuntimeSampleSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].object({ + cookies: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(CookieSchema).optional(), + headers: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].tuple([ + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string() + ])).optional(), + params: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].record(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].union([ + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string()) + ])).optional(), + searchParams: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].record(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].union([ + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string()), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].undefined() + ])).optional() +}).strict(); +const StaticPrefetchSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].object({ + mode: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].literal('static'), + from: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string()).optional(), + expectUnableToVerify: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].boolean().optional() +}).strict(); +const RuntimePrefetchSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].object({ + mode: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].literal('runtime'), + samples: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(RuntimeSampleSchema).min(1), + from: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string()).optional(), + expectUnableToVerify: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].boolean().optional() +}).strict(); +const PrefetchSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].discriminatedUnion('mode', [ + StaticPrefetchSchema, + RuntimePrefetchSchema +]); +/** + * The schema for configuration for a page. + */ const AppSegmentConfigSchema = __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].object({ + /** + * The number of seconds to revalidate the page or false to disable revalidation. + */ revalidate: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].union([ + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].number().int().nonnegative(), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].literal(false) + ]).optional(), + /** + * Whether the page supports dynamic parameters. + */ dynamicParams: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].boolean().optional(), + /** + * The dynamic behavior of the page. + */ dynamic: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].enum([ + 'auto', + 'error', + 'force-static', + 'force-dynamic' + ]).optional(), + /** + * The caching behavior of the page. + */ fetchCache: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].enum([ + 'auto', + 'default-cache', + 'only-cache', + 'force-cache', + 'force-no-store', + 'default-no-store', + 'only-no-store' + ]).optional(), + /** + * How this segment should be prefetched. + */ unstable_prefetch: PrefetchSchema.optional(), + /** + * The preferred region for the page. + */ preferredRegion: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].union([ + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string(), + __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].array(__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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].string()) + ]).optional(), + /** + * The runtime to use for the page. + */ runtime: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].enum([ + 'edge', + 'nodejs' + ]).optional(), + /** + * The maximum duration for the page in seconds. + */ maxDuration: __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$zod$2f$index$2e$cjs__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["z"].number().int().nonnegative().optional() +}); +function parseAppSegmentConfig(data, route) { + const parsed = AppSegmentConfigSchema.safeParse(data, { + errorMap: (issue, ctx)=>{ + if (issue.path.length === 1) { + switch(issue.path[0]){ + case 'revalidate': + { + return { + message: `Invalid revalidate value ${JSON.stringify(ctx.data)} on "${route}", must be a non-negative number or false` + }; + } + case 'unstable_prefetch': + { + return { + // @TODO replace this link with a link to the docs when they are written + message: `Invalid unstable_prefetch value ${JSON.stringify(ctx.data)} on "${route}", must be an object with a mode of "static" or "runtime". Read more at https://nextjs.org/docs/messages/invalid-prefetch-configuration` + }; + } + default: + } + } + return { + message: ctx.defaultError + }; + } + }); + if (!parsed.success) { + throw (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$esm$2f$shared$2f$lib$2f$zod$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["formatZodError"])(`Invalid segment configuration options detected for "${route}". Read more at https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config`, parsed.error); + } + return parsed.data; +} +const AppSegmentConfigSchemaKeys = AppSegmentConfigSchema.keyof().options; //# sourceMappingURL=app-segment-config.js.map +}), +"[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/esm/server/route-modules/checks.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "isAppPageRouteModule", + ()=>isAppPageRouteModule, + "isAppRouteRouteModule", + ()=>isAppRouteRouteModule, + "isPagesAPIRouteModule", + ()=>isPagesAPIRouteModule, + "isPagesRouteModule", + ()=>isPagesRouteModule +]); +var __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/route-kind.js [app-rsc] (ecmascript)"); +; +function isAppRouteRouteModule(routeModule) { + return routeModule.definition.kind === __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RouteKind"].APP_ROUTE; +} +function isAppPageRouteModule(routeModule) { + return routeModule.definition.kind === __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RouteKind"].APP_PAGE; +} +function isPagesRouteModule(routeModule) { + return routeModule.definition.kind === __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RouteKind"].PAGES; +} +function isPagesAPIRouteModule(routeModule) { + return routeModule.definition.kind === __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RouteKind"].PAGES_API; +} //# sourceMappingURL=checks.js.map +}), +"[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/esm/shared/lib/page-path/ensure-leading-slash.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * For a given page path, this function ensures that there is a leading slash. + * If there is not a leading slash, one is added, otherwise it is noop. + */ __turbopack_context__.s([ + "ensureLeadingSlash", + ()=>ensureLeadingSlash +]); +function ensureLeadingSlash(path) { + return path.startsWith('/') ? path : `/${path}`; +} //# sourceMappingURL=ensure-leading-slash.js.map +}), +"[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/esm/shared/lib/router/utils/app-paths.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "normalizeAppPath", + ()=>normalizeAppPath, + "normalizeRscURL", + ()=>normalizeRscURL +]); +var __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$esm$2f$shared$2f$lib$2f$page$2d$path$2f$ensure$2d$leading$2d$slash$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/page-path/ensure-leading-slash.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/segment.js [app-rsc] (ecmascript)"); +; +; +function normalizeAppPath(route) { + return (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$esm$2f$shared$2f$lib$2f$page$2d$path$2f$ensure$2d$leading$2d$slash$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ensureLeadingSlash"])(route.split('/').reduce((pathname, segment, index, segments)=>{ + // Empty segments are ignored. + if (!segment) { + return pathname; + } + // Groups are ignored. + if ((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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isGroupSegment"])(segment)) { + return pathname; + } + // Parallel segments are ignored. + if (segment[0] === '@') { + return pathname; + } + // The last segment (if it's a leaf) should be ignored. + if ((segment === 'page' || segment === 'route') && index === segments.length - 1) { + return pathname; + } + return `${pathname}/${segment}`; + }, '')); +} +function normalizeRscURL(url) { + return url.replace(/\.rsc($|\?)/, '$1'); +} //# sourceMappingURL=app-paths.js.map +}), +"[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/esm/shared/lib/router/utils/interception-routes.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "INTERCEPTION_ROUTE_MARKERS", + ()=>INTERCEPTION_ROUTE_MARKERS, + "extractInterceptionRouteInformation", + ()=>extractInterceptionRouteInformation, + "isInterceptionRouteAppPath", + ()=>isInterceptionRouteAppPath +]); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/app-paths.js [app-rsc] (ecmascript)"); +; +const INTERCEPTION_ROUTE_MARKERS = [ + '(..)(..)', + '(.)', + '(..)', + '(...)' +]; +function isInterceptionRouteAppPath(path) { + // TODO-APP: add more serious validation + return path.split('/').find((segment)=>INTERCEPTION_ROUTE_MARKERS.find((m)=>segment.startsWith(m))) !== undefined; +} +function extractInterceptionRouteInformation(path) { + let interceptingRoute; + let marker; + let interceptedRoute; + for (const segment of path.split('/')){ + marker = INTERCEPTION_ROUTE_MARKERS.find((m)=>segment.startsWith(m)); + if (marker) { + ; + [interceptingRoute, interceptedRoute] = path.split(marker, 2); + break; + } + } + if (!interceptingRoute || !marker || !interceptedRoute) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Must be in the format //(..|...|..)(..)/`), "__NEXT_ERROR_CODE", { + value: "E269", + enumerable: false, + configurable: true + }); + } + interceptingRoute = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAppPath"])(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed + ; + switch(marker){ + case '(.)': + // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route + if (interceptingRoute === '/') { + interceptedRoute = `/${interceptedRoute}`; + } else { + interceptedRoute = interceptingRoute + '/' + interceptedRoute; + } + break; + case '(..)': + // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route + if (interceptingRoute === '/') { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`), "__NEXT_ERROR_CODE", { + value: "E207", + enumerable: false, + configurable: true + }); + } + interceptedRoute = interceptingRoute.split('/').slice(0, -1).concat(interceptedRoute).join('/'); + break; + case '(...)': + // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route + interceptedRoute = '/' + interceptedRoute; + break; + case '(..)(..)': + // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route + const splitInterceptingRoute = interceptingRoute.split('/'); + if (splitInterceptingRoute.length <= 2) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`), "__NEXT_ERROR_CODE", { + value: "E486", + enumerable: false, + configurable: true + }); + } + interceptedRoute = splitInterceptingRoute.slice(0, -2).concat(interceptedRoute).join('/'); + break; + default: + throw Object.defineProperty(new Error('Invariant: unexpected marker'), "__NEXT_ERROR_CODE", { + value: "E112", + enumerable: false, + configurable: true + }); + } + return { + interceptingRoute, + interceptedRoute + }; +} //# sourceMappingURL=interception-routes.js.map +}), +"[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/esm/shared/lib/router/utils/get-segment-param.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getParamProperties", + ()=>getParamProperties, + "getSegmentParam", + ()=>getSegmentParam, + "isCatchAll", + ()=>isCatchAll +]); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/interception-routes.js [app-rsc] (ecmascript)"); +; +function getSegmentParam(segment) { + const interceptionMarker = __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["INTERCEPTION_ROUTE_MARKERS"].find((marker)=>segment.startsWith(marker)); + // if an interception marker is part of the path segment, we need to jump ahead + // to the relevant portion for param parsing + if (interceptionMarker) { + segment = segment.slice(interceptionMarker.length); + } + if (segment.startsWith('[[...') && segment.endsWith(']]')) { + return { + // TODO-APP: Optional catchall does not currently work with parallel routes, + // so for now aren't handling a potential interception marker. + type: 'optional-catchall', + param: segment.slice(5, -2) + }; + } + if (segment.startsWith('[...') && segment.endsWith(']')) { + return { + type: interceptionMarker ? `catchall-intercepted-${interceptionMarker}` : 'catchall', + param: segment.slice(4, -1) + }; + } + if (segment.startsWith('[') && segment.endsWith(']')) { + return { + type: interceptionMarker ? `dynamic-intercepted-${interceptionMarker}` : 'dynamic', + param: segment.slice(1, -1) + }; + } + return null; +} +function isCatchAll(type) { + return type === 'catchall' || type === 'catchall-intercepted-(..)(..)' || type === 'catchall-intercepted-(.)' || type === 'catchall-intercepted-(..)' || type === 'catchall-intercepted-(...)' || type === 'optional-catchall'; +} +function getParamProperties(paramType) { + let repeat = false; + let optional = false; + switch(paramType){ + case 'catchall': + case 'catchall-intercepted-(..)(..)': + case 'catchall-intercepted-(.)': + case 'catchall-intercepted-(..)': + case 'catchall-intercepted-(...)': + repeat = true; + break; + case 'optional-catchall': + repeat = true; + optional = true; + break; + case 'dynamic': + case 'dynamic-intercepted-(..)(..)': + case 'dynamic-intercepted-(.)': + case 'dynamic-intercepted-(..)': + case 'dynamic-intercepted-(...)': + break; + default: + paramType; + } + return { + repeat, + optional + }; +} //# sourceMappingURL=get-segment-param.js.map +}), +"[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/esm/build/static-paths/utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Encodes a parameter value using the provided encoder. + * + * @param value - The value to encode. + * @param encoder - The encoder to use. + * @returns The encoded value. + */ __turbopack_context__.s([ + "createFallbackRouteParam", + ()=>createFallbackRouteParam, + "encodeParam", + ()=>encodeParam, + "normalizePathname", + ()=>normalizePathname +]); +function encodeParam(value, encoder) { + let replaceValue; + if (Array.isArray(value)) { + replaceValue = value.map(encoder).join('/'); + } else { + replaceValue = encoder(value); + } + return replaceValue; +} +function normalizePathname(pathname) { + return pathname.replace(/\\/g, '/').replace(/(?!^)\/$/, ''); +} +function createFallbackRouteParam(paramName, paramType, isParallelRouteParam) { + return { + paramName, + paramType, + isParallelRouteParam + }; +} //# sourceMappingURL=utils.js.map +}), +"[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/esm/build/segment-config/app/app-segments.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "collectFallbackRouteParams", + ()=>collectFallbackRouteParams, + "collectSegments", + ()=>collectSegments +]); +var __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$esm$2f$build$2f$segment$2d$config$2f$app$2f$app$2d$segment$2d$config$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/build/segment-config/app/app-segment-config.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/invariant-error.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$route$2d$modules$2f$checks$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/route-modules/checks.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$client$2d$and$2d$server$2d$references$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/client-and-server-references.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/get-segment-param.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$app$2d$dir$2d$module$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/app-dir-module.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/segment.js [app-rsc] (ecmascript)"); +var __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$esm$2f$build$2f$static$2d$paths$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/build/static-paths/utils.js [app-rsc] (ecmascript)"); +; +; +; +; +; +; +; +; +/** + * Parses the app config and attaches it to the segment. + */ function attach(segment, userland, route) { + // If the userland is not an object, then we can't do anything with it. + if (typeof userland !== 'object' || userland === null) { + return; + } + // Try to parse the application configuration. + const config = (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$esm$2f$build$2f$segment$2d$config$2f$app$2f$app$2d$segment$2d$config$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseAppSegmentConfig"])(userland, route); + // If there was any keys on the config, then attach it to the segment. + if (Object.keys(config).length > 0) { + segment.config = config; + } + if ('generateStaticParams' in userland && typeof userland.generateStaticParams === 'function') { + var _segment_config; + segment.generateStaticParams = userland.generateStaticParams; + // Validate that `generateStaticParams` makes sense in this context. + if (((_segment_config = segment.config) == null ? void 0 : _segment_config.runtime) === 'edge') { + throw Object.defineProperty(new Error('Edge runtime is not supported with `generateStaticParams`.'), "__NEXT_ERROR_CODE", { + value: "E502", + enumerable: false, + configurable: true + }); + } + } +} +/** + * Walks the loader tree and collects the generate parameters for each segment. + * + * @param routeModule the app page route module + * @returns the segments for the app page route module + */ async function collectAppPageSegments(routeModule) { + // We keep track of unique segments, since with parallel routes, it's possible + // to see the same segment multiple times. + const uniqueSegments = new Map(); + const queue = [ + [ + routeModule.userland.loaderTree, + [], + false + ] + ]; + while(queue.length > 0){ + const [loaderTree, currentSegments, isParallelRouteSegment] = queue.shift(); + const [name, parallelRoutes] = loaderTree; + // Process current node + const { mod: userland, filePath } = await (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$esm$2f$server$2f$lib$2f$app$2d$dir$2d$module$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getLayoutOrPageModule"])(loaderTree); + const isClientComponent = userland && (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$esm$2f$lib$2f$client$2d$and$2d$server$2d$references$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isClientReference"])(userland); + const { param: paramName, type: paramType } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(name) ?? {}; + const segment = { + name, + paramName, + paramType, + filePath, + config: undefined, + isDynamicSegment: !!paramName, + generateStaticParams: undefined, + isParallelRouteSegment + }; + // Only server components can have app segment configurations + if (!isClientComponent) { + attach(segment, userland, routeModule.definition.pathname); + } + // Create a unique key for the segment + const segmentKey = getSegmentKey(segment); + if (!uniqueSegments.has(segmentKey)) { + uniqueSegments.set(segmentKey, segment); + } + const updatedSegments = [ + ...currentSegments, + segment + ]; + // If this is a page segment, we've reached a leaf node + if (name === __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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["PAGE_SEGMENT_KEY"]) { + // Add all segments in the current path, preferring non-parallel segments + updatedSegments.forEach((seg)=>{ + const key = getSegmentKey(seg); + if (!uniqueSegments.has(key)) { + uniqueSegments.set(key, seg); + } + }); + } + // Add all parallel routes to the queue + for(const parallelRouteKey in parallelRoutes){ + const parallelRoute = parallelRoutes[parallelRouteKey]; + queue.push([ + parallelRoute, + updatedSegments, + // A parallel route segment is one that descends from a segment that is + // not children or descends from a parallel route segment. + isParallelRouteSegment || parallelRouteKey !== 'children' + ]); + } + } + return Array.from(uniqueSegments.values()); +} +function getSegmentKey(segment) { + return `${segment.name}-${segment.filePath ?? ''}-${segment.paramName ?? ''}-${segment.isParallelRouteSegment ? 'pr' : 'np'}`; +} +/** + * Collects the segments for a given app route module. + * + * @param routeModule the app route module + * @returns the segments for the app route module + */ function collectAppRouteSegments(routeModule) { + // Get the pathname parts, slice off the first element (which is empty). + const parts = routeModule.definition.pathname.split('/').slice(1); + if (parts.length === 0) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Expected at least one segment'), "__NEXT_ERROR_CODE", { + value: "E580", + enumerable: false, + configurable: true + }); + } + // Generate all the segments. + const segments = parts.map((name)=>{ + const { param: paramName, type: paramType } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(name) ?? {}; + return { + name, + paramName, + paramType, + filePath: undefined, + isDynamicSegment: !!paramName, + config: undefined, + generateStaticParams: undefined, + isParallelRouteSegment: undefined + }; + }); + // We know we have at least one, we verified this above. We should get the + // last segment which represents the root route module. + const segment = segments[segments.length - 1]; + segment.filePath = routeModule.definition.filename; + // Extract the segment config from the userland module. + attach(segment, routeModule.userland, routeModule.definition.pathname); + return segments; +} +function collectSegments(routeModule) { + if ((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$esm$2f$server$2f$route$2d$modules$2f$checks$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isAppRouteRouteModule"])(routeModule)) { + return collectAppRouteSegments(routeModule); + } + if ((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$esm$2f$server$2f$route$2d$modules$2f$checks$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isAppPageRouteModule"])(routeModule)) { + return collectAppPageSegments(routeModule); + } + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Expected a route module to be one of app route or page'), "__NEXT_ERROR_CODE", { + value: "E568", + enumerable: false, + configurable: true + }); +} +function collectFallbackRouteParams(routeModule) { + const uniqueSegments = new Map(); + const queue = [ + [ + routeModule.userland.loaderTree, + false + ] + ]; + while(queue.length > 0){ + const [loaderTree, isParallelRouteSegment] = queue.shift(); + const [name, parallelRoutes] = loaderTree; + // Handle this segment (if it's a dynamic segment param). + const segmentParam = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(name); + if (segmentParam) { + const key = `${name}-${segmentParam.param}-${isParallelRouteSegment ? 'pr' : 'np'}`; + if (!uniqueSegments.has(key)) { + uniqueSegments.set(key, (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$esm$2f$build$2f$static$2d$paths$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["createFallbackRouteParam"])(segmentParam.param, segmentParam.type, isParallelRouteSegment)); + } + } + // Add all of this segment's parallel routes to the queue. + for(const parallelRouteKey in parallelRoutes){ + const parallelRoute = parallelRoutes[parallelRouteKey]; + queue.push([ + parallelRoute, + // A parallel route segment is one that descends from a segment that is + // not children or descends from a parallel route segment. + isParallelRouteSegment || parallelRouteKey !== 'children' + ]); + } + } + return Array.from(uniqueSegments.values()); +} //# sourceMappingURL=app-segments.js.map +}), +"[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/esm/shared/lib/utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team. + * https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting + */ __turbopack_context__.s([ + "DecodeError", + ()=>DecodeError, + "MiddlewareNotFoundError", + ()=>MiddlewareNotFoundError, + "MissingStaticPage", + ()=>MissingStaticPage, + "NormalizeError", + ()=>NormalizeError, + "PageNotFoundError", + ()=>PageNotFoundError, + "SP", + ()=>SP, + "ST", + ()=>ST, + "WEB_VITALS", + ()=>WEB_VITALS, + "execOnce", + ()=>execOnce, + "getDisplayName", + ()=>getDisplayName, + "getLocationOrigin", + ()=>getLocationOrigin, + "getURL", + ()=>getURL, + "isAbsoluteUrl", + ()=>isAbsoluteUrl, + "isResSent", + ()=>isResSent, + "loadGetInitialProps", + ()=>loadGetInitialProps, + "normalizeRepeatedSlashes", + ()=>normalizeRepeatedSlashes, + "stringifyError", + ()=>stringifyError +]); +const WEB_VITALS = [ + 'CLS', + 'FCP', + 'FID', + 'INP', + 'LCP', + 'TTFB' +]; +function execOnce(fn) { + let used = false; + let result; + return (...args)=>{ + if (!used) { + used = true; + result = fn(...args); + } + return result; + }; +} +// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 +// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 +const ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/; +const isAbsoluteUrl = (url)=>ABSOLUTE_URL_REGEX.test(url); +function getLocationOrigin() { + const { protocol, hostname, port } = window.location; + return `${protocol}//${hostname}${port ? ':' + port : ''}`; +} +function getURL() { + const { href } = window.location; + const origin = getLocationOrigin(); + return href.substring(origin.length); +} +function getDisplayName(Component) { + return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown'; +} +function isResSent(res) { + return res.finished || res.headersSent; +} +function normalizeRepeatedSlashes(url) { + const urlParts = url.split('?'); + const urlNoQuery = urlParts[0]; + return urlNoQuery // first we replace any non-encoded backslashes with forward + // then normalize repeated forward slashes + .replace(/\\/g, '/').replace(/\/\/+/g, '/') + (urlParts[1] ? `?${urlParts.slice(1).join('?')}` : ''); +} +async function loadGetInitialProps(App, ctx) { + if ("TURBOPACK compile-time truthy", 1) { + if (App.prototype?.getInitialProps) { + const message = `"${getDisplayName(App)}.getInitialProps()" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E394", + enumerable: false, + configurable: true + }); + } + } + // when called from _app `ctx` is nested in `ctx` + const res = ctx.res || ctx.ctx && ctx.ctx.res; + if (!App.getInitialProps) { + if (ctx.ctx && ctx.Component) { + // @ts-ignore pageProps default + return { + pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx) + }; + } + return {}; + } + const props = await App.getInitialProps(ctx); + if (res && isResSent(res)) { + return props; + } + if (!props) { + const message = `"${getDisplayName(App)}.getInitialProps()" should resolve to an object. But found "${props}" instead.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E394", + enumerable: false, + configurable: true + }); + } + if ("TURBOPACK compile-time truthy", 1) { + if (Object.keys(props).length === 0 && !ctx.ctx) { + console.warn(`${getDisplayName(App)} returned an empty object from \`getInitialProps\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`); + } + } + return props; +} +const SP = typeof performance !== 'undefined'; +const ST = SP && [ + 'mark', + 'measure', + 'getEntriesByName' +].every((method)=>typeof performance[method] === 'function'); +class DecodeError extends Error { +} +class NormalizeError extends Error { +} +class PageNotFoundError extends Error { + constructor(page){ + super(); + this.code = 'ENOENT'; + this.name = 'PageNotFoundError'; + this.message = `Cannot find module for page: ${page}`; + } +} +class MissingStaticPage extends Error { + constructor(page, message){ + super(); + this.message = `Failed to load static file for page: ${page} ${message}`; + } +} +class MiddlewareNotFoundError extends Error { + constructor(){ + super(); + this.code = 'ENOENT'; + this.message = `Cannot find the middleware module`; + } +} +function stringifyError(error) { + return JSON.stringify({ + message: error.message, + stack: error.stack + }); +} //# sourceMappingURL=utils.js.map +}), +"[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/path-to-regexp/index.js [app-rsc] (ecmascript)", ((__turbopack_context__, module, exports) => { + +(()=>{ + "use strict"; + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/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/path-to-regexp") + "/"; + var e = {}; + (()=>{ + var n = e; + Object.defineProperty(n, "__esModule", { + value: true + }); + n.pathToRegexp = n.tokensToRegexp = n.regexpToFunction = n.match = n.tokensToFunction = n.compile = n.parse = void 0; + function lexer(e) { + var n = []; + var r = 0; + while(r < e.length){ + var t = e[r]; + if (t === "*" || t === "+" || t === "?") { + n.push({ + type: "MODIFIER", + index: r, + value: e[r++] + }); + continue; + } + if (t === "\\") { + n.push({ + type: "ESCAPED_CHAR", + index: r++, + value: e[r++] + }); + continue; + } + if (t === "{") { + n.push({ + type: "OPEN", + index: r, + value: e[r++] + }); + continue; + } + if (t === "}") { + n.push({ + type: "CLOSE", + index: r, + value: e[r++] + }); + continue; + } + if (t === ":") { + var a = ""; + var i = r + 1; + while(i < e.length){ + var o = e.charCodeAt(i); + if (o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 || o === 95) { + a += e[i++]; + continue; + } + break; + } + if (!a) throw new TypeError("Missing parameter name at ".concat(r)); + n.push({ + type: "NAME", + index: r, + value: a + }); + r = i; + continue; + } + if (t === "(") { + var c = 1; + var f = ""; + var i = r + 1; + if (e[i] === "?") { + throw new TypeError('Pattern cannot start with "?" at '.concat(i)); + } + while(i < e.length){ + if (e[i] === "\\") { + f += e[i++] + e[i++]; + continue; + } + if (e[i] === ")") { + c--; + if (c === 0) { + i++; + break; + } + } else if (e[i] === "(") { + c++; + if (e[i + 1] !== "?") { + throw new TypeError("Capturing groups are not allowed at ".concat(i)); + } + } + f += e[i++]; + } + if (c) throw new TypeError("Unbalanced pattern at ".concat(r)); + if (!f) throw new TypeError("Missing pattern at ".concat(r)); + n.push({ + type: "PATTERN", + index: r, + value: f + }); + r = i; + continue; + } + n.push({ + type: "CHAR", + index: r, + value: e[r++] + }); + } + n.push({ + type: "END", + index: r, + value: "" + }); + return n; + } + function parse(e, n) { + if (n === void 0) { + n = {}; + } + var r = lexer(e); + var t = n.prefixes, a = t === void 0 ? "./" : t, i = n.delimiter, o = i === void 0 ? "/#?" : i; + var c = []; + var f = 0; + var u = 0; + var p = ""; + var tryConsume = function(e) { + if (u < r.length && r[u].type === e) return r[u++].value; + }; + var mustConsume = function(e) { + var n = tryConsume(e); + if (n !== undefined) return n; + var t = r[u], a = t.type, i = t.index; + throw new TypeError("Unexpected ".concat(a, " at ").concat(i, ", expected ").concat(e)); + }; + var consumeText = function() { + var e = ""; + var n; + while(n = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")){ + e += n; + } + return e; + }; + var isSafe = function(e) { + for(var n = 0, r = o; n < r.length; n++){ + var t = r[n]; + if (e.indexOf(t) > -1) return true; + } + return false; + }; + var safePattern = function(e) { + var n = c[c.length - 1]; + var r = e || (n && typeof n === "string" ? n : ""); + if (n && !r) { + throw new TypeError('Must have text between two parameters, missing text after "'.concat(n.name, '"')); + } + if (!r || isSafe(r)) return "[^".concat(escapeString(o), "]+?"); + return "(?:(?!".concat(escapeString(r), ")[^").concat(escapeString(o), "])+?"); + }; + while(u < r.length){ + var v = tryConsume("CHAR"); + var s = tryConsume("NAME"); + var d = tryConsume("PATTERN"); + if (s || d) { + var g = v || ""; + if (a.indexOf(g) === -1) { + p += g; + g = ""; + } + if (p) { + c.push(p); + p = ""; + } + c.push({ + name: s || f++, + prefix: g, + suffix: "", + pattern: d || safePattern(g), + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + var x = v || tryConsume("ESCAPED_CHAR"); + if (x) { + p += x; + continue; + } + if (p) { + c.push(p); + p = ""; + } + var h = tryConsume("OPEN"); + if (h) { + var g = consumeText(); + var l = tryConsume("NAME") || ""; + var m = tryConsume("PATTERN") || ""; + var T = consumeText(); + mustConsume("CLOSE"); + c.push({ + name: l || (m ? f++ : ""), + pattern: l && !m ? safePattern(g) : m, + prefix: g, + suffix: T, + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + mustConsume("END"); + } + return c; + } + n.parse = parse; + function compile(e, n) { + return tokensToFunction(parse(e, n), n); + } + n.compile = compile; + function tokensToFunction(e, n) { + if (n === void 0) { + n = {}; + } + var r = flags(n); + var t = n.encode, a = t === void 0 ? function(e) { + return e; + } : t, i = n.validate, o = i === void 0 ? true : i; + var c = e.map(function(e) { + if (typeof e === "object") { + return new RegExp("^(?:".concat(e.pattern, ")$"), r); + } + }); + return function(n) { + var r = ""; + for(var t = 0; t < e.length; t++){ + var i = e[t]; + if (typeof i === "string") { + r += i; + continue; + } + var f = n ? n[i.name] : undefined; + var u = i.modifier === "?" || i.modifier === "*"; + var p = i.modifier === "*" || i.modifier === "+"; + if (Array.isArray(f)) { + if (!p) { + throw new TypeError('Expected "'.concat(i.name, '" to not repeat, but got an array')); + } + if (f.length === 0) { + if (u) continue; + throw new TypeError('Expected "'.concat(i.name, '" to not be empty')); + } + for(var v = 0; v < f.length; v++){ + var s = a(f[v], i); + if (o && !c[t].test(s)) { + throw new TypeError('Expected all "'.concat(i.name, '" to match "').concat(i.pattern, '", but got "').concat(s, '"')); + } + r += i.prefix + s + i.suffix; + } + continue; + } + if (typeof f === "string" || typeof f === "number") { + var s = a(String(f), i); + if (o && !c[t].test(s)) { + throw new TypeError('Expected "'.concat(i.name, '" to match "').concat(i.pattern, '", but got "').concat(s, '"')); + } + r += i.prefix + s + i.suffix; + continue; + } + if (u) continue; + var d = p ? "an array" : "a string"; + throw new TypeError('Expected "'.concat(i.name, '" to be ').concat(d)); + } + return r; + }; + } + n.tokensToFunction = tokensToFunction; + function match(e, n) { + var r = []; + var t = pathToRegexp(e, r, n); + return regexpToFunction(t, r, n); + } + n.match = match; + function regexpToFunction(e, n, r) { + if (r === void 0) { + r = {}; + } + var t = r.decode, a = t === void 0 ? function(e) { + return e; + } : t; + return function(r) { + var t = e.exec(r); + if (!t) return false; + var i = t[0], o = t.index; + var c = Object.create(null); + var _loop_1 = function(e) { + if (t[e] === undefined) return "continue"; + var r = n[e - 1]; + if (r.modifier === "*" || r.modifier === "+") { + c[r.name] = t[e].split(r.prefix + r.suffix).map(function(e) { + return a(e, r); + }); + } else { + c[r.name] = a(t[e], r); + } + }; + for(var f = 1; f < t.length; f++){ + _loop_1(f); + } + return { + path: i, + index: o, + params: c + }; + }; + } + n.regexpToFunction = regexpToFunction; + function escapeString(e) { + return e.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1"); + } + function flags(e) { + return e && e.sensitive ? "" : "i"; + } + function regexpToRegexp(e, n) { + if (!n) return e; + var r = /\((?:\?<(.*?)>)?(?!\?)/g; + var t = 0; + var a = r.exec(e.source); + while(a){ + n.push({ + name: a[1] || t++, + prefix: "", + suffix: "", + modifier: "", + pattern: "" + }); + a = r.exec(e.source); + } + return e; + } + function arrayToRegexp(e, n, r) { + var t = e.map(function(e) { + return pathToRegexp(e, n, r).source; + }); + return new RegExp("(?:".concat(t.join("|"), ")"), flags(r)); + } + function stringToRegexp(e, n, r) { + return tokensToRegexp(parse(e, r), n, r); + } + function tokensToRegexp(e, n, r) { + if (r === void 0) { + r = {}; + } + var t = r.strict, a = t === void 0 ? false : t, i = r.start, o = i === void 0 ? true : i, c = r.end, f = c === void 0 ? true : c, u = r.encode, p = u === void 0 ? function(e) { + return e; + } : u, v = r.delimiter, s = v === void 0 ? "/#?" : v, d = r.endsWith, g = d === void 0 ? "" : d; + var x = "[".concat(escapeString(g), "]|$"); + var h = "[".concat(escapeString(s), "]"); + var l = o ? "^" : ""; + for(var m = 0, T = e; m < T.length; m++){ + var E = T[m]; + if (typeof E === "string") { + l += escapeString(p(E)); + } else { + var w = escapeString(p(E.prefix)); + var y = escapeString(p(E.suffix)); + if (E.pattern) { + if (n) n.push(E); + if (w || y) { + if (E.modifier === "+" || E.modifier === "*") { + var R = E.modifier === "*" ? "?" : ""; + l += "(?:".concat(w, "((?:").concat(E.pattern, ")(?:").concat(y).concat(w, "(?:").concat(E.pattern, "))*)").concat(y, ")").concat(R); + } else { + l += "(?:".concat(w, "(").concat(E.pattern, ")").concat(y, ")").concat(E.modifier); + } + } else { + if (E.modifier === "+" || E.modifier === "*") { + throw new TypeError('Can not repeat "'.concat(E.name, '" without a prefix and suffix')); + } + l += "(".concat(E.pattern, ")").concat(E.modifier); + } + } else { + l += "(?:".concat(w).concat(y, ")").concat(E.modifier); + } + } + } + if (f) { + if (!a) l += "".concat(h, "?"); + l += !r.endsWith ? "$" : "(?=".concat(x, ")"); + } else { + var A = e[e.length - 1]; + var _ = typeof A === "string" ? h.indexOf(A[A.length - 1]) > -1 : A === undefined; + if (!a) { + l += "(?:".concat(h, "(?=").concat(x, "))?"); + } + if (!_) { + l += "(?=".concat(h, "|").concat(x, ")"); + } + } + return new RegExp(l, flags(r)); + } + n.tokensToRegexp = tokensToRegexp; + function pathToRegexp(e, n, r) { + if (e instanceof RegExp) return regexpToRegexp(e, n); + if (Array.isArray(e)) return arrayToRegexp(e, n, r); + return stringToRegexp(e, n, r); + } + n.pathToRegexp = pathToRegexp; + })(); + module.exports = e; +})(); +}), +"[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/esm/lib/route-pattern-normalizer.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Route pattern normalization utilities for path-to-regexp compatibility. + * + * path-to-regexp 6.3.0+ introduced stricter validation that rejects certain + * patterns commonly used in Next.js interception routes. This module provides + * normalization functions to make Next.js route patterns compatible with the + * updated library while preserving all functionality. + */ /** + * Internal separator used to normalize adjacent parameter patterns. + * This unique marker is inserted between adjacent parameters and stripped out + * during parameter extraction to avoid conflicts with real URL content. + */ __turbopack_context__.s([ + "PARAM_SEPARATOR", + ()=>PARAM_SEPARATOR, + "hasAdjacentParameterIssues", + ()=>hasAdjacentParameterIssues, + "normalizeAdjacentParameters", + ()=>normalizeAdjacentParameters, + "normalizeTokensForRegexp", + ()=>normalizeTokensForRegexp, + "stripNormalizedSeparators", + ()=>stripNormalizedSeparators, + "stripParameterSeparators", + ()=>stripParameterSeparators +]); +const PARAM_SEPARATOR = '_NEXTSEP_'; +function hasAdjacentParameterIssues(route) { + if (typeof route !== 'string') return false; + // Check for interception route markers followed immediately by parameters + // Pattern: /(.):param, /(..):param, /(...):param, /(.)(.):param etc. + // These patterns cause "Must have text between two parameters" errors + if (/\/\(\.{1,3}\):[^/\s]+/.test(route)) { + return true; + } + // Check for basic adjacent parameters without separators + // Pattern: :param1:param2 (but not :param* or other URL patterns) + if (/:[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*/.test(route)) { + return true; + } + return false; +} +function normalizeAdjacentParameters(route) { + let normalized = route; + // Handle interception route patterns: (.):param -> (.)_NEXTSEP_:param + normalized = normalized.replace(/(\([^)]*\)):([^/\s]+)/g, `$1${PARAM_SEPARATOR}:$2`); + // Handle other adjacent parameter patterns: :param1:param2 -> :param1_NEXTSEP_:param2 + normalized = normalized.replace(/:([^:/\s)]+)(?=:)/g, `:$1${PARAM_SEPARATOR}`); + return normalized; +} +function normalizeTokensForRegexp(tokens) { + return tokens.map((token)=>{ + // Token union type: Token = string | TokenObject + // Literal path segments are strings, parameters/wildcards are objects + if (typeof token === 'object' && token !== null && // Not all token objects have 'modifier' property (e.g., simple text tokens) + 'modifier' in token && // Only repeating modifiers (* or +) cause the validation error + // Other modifiers like '?' (optional) are fine + (token.modifier === '*' || token.modifier === '+') && // Token objects can have different shapes depending on route pattern + 'prefix' in token && 'suffix' in token && // Both prefix and suffix must be empty strings + // This is what causes the validation error in path-to-regexp + token.prefix === '' && token.suffix === '') { + // Add minimal prefix to satisfy path-to-regexp validation + // We use '/' as it's the most common path delimiter and won't break route matching + // The prefix gets used in regex generation but doesn't affect parameter extraction + return { + ...token, + prefix: '/' + }; + } + return token; + }); +} +function stripNormalizedSeparators(pathname) { + // Remove separator after interception route markers + // Pattern: (.)_NEXTSEP_ -> (.), (..)_NEXTSEP_ -> (..), etc. + // The separator appears after the closing paren of interception markers + return pathname.replace(new RegExp(`\\)${PARAM_SEPARATOR}`, 'g'), ')'); +} +function stripParameterSeparators(params) { + const cleaned = {}; + for (const [key, value] of Object.entries(params)){ + if (typeof value === 'string') { + // Remove the separator if it appears at the start of parameter values + cleaned[key] = value.replace(new RegExp(`^${PARAM_SEPARATOR}`), ''); + } else if (Array.isArray(value)) { + // Handle array parameters (from repeated route segments) + cleaned[key] = value.map((item)=>typeof item === 'string' ? item.replace(new RegExp(`^${PARAM_SEPARATOR}`), '') : item); + } else { + cleaned[key] = value; + } + } + return cleaned; +} //# sourceMappingURL=route-pattern-normalizer.js.map +}), +"[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/esm/shared/lib/router/utils/route-match-utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Client-safe utilities for route matching that don't import server-side + * utilities to avoid bundling issues with Turbopack + */ __turbopack_context__.s([ + "safeCompile", + ()=>safeCompile, + "safePathToRegexp", + ()=>safePathToRegexp, + "safeRegexpToFunction", + ()=>safeRegexpToFunction, + "safeRouteMatcher", + ()=>safeRouteMatcher +]); +var __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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/path-to-regexp/index.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/route-pattern-normalizer.js [app-rsc] (ecmascript)"); +; +; +function safePathToRegexp(route, keys, options) { + if (typeof route !== 'string') { + return (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["pathToRegexp"])(route, keys, options); + } + // Check if normalization is needed and cache the result + const needsNormalization = (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["hasAdjacentParameterIssues"])(route); + const routeToUse = needsNormalization ? (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAdjacentParameters"])(route) : route; + try { + return (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["pathToRegexp"])(routeToUse, keys, options); + } catch (error) { + // Only try normalization if we haven't already normalized + if (!needsNormalization) { + try { + const normalizedRoute = (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAdjacentParameters"])(route); + return (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["pathToRegexp"])(normalizedRoute, keys, options); + } catch (retryError) { + // If that doesn't work, fall back to original error + throw error; + } + } + throw error; + } +} +function safeCompile(route, options) { + // Check if normalization is needed and cache the result + const needsNormalization = (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["hasAdjacentParameterIssues"])(route); + const routeToUse = needsNormalization ? (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAdjacentParameters"])(route) : route; + try { + const compiler = (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["compile"])(routeToUse, options); + // If we normalized the route, wrap the compiler to strip separators from output + // The normalization inserts _NEXTSEP_ as a literal string in the pattern to satisfy + // path-to-regexp validation, but we don't want it in the final compiled URL + if (needsNormalization) { + return (params)=>{ + return (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["stripNormalizedSeparators"])(compiler(params)); + }; + } + return compiler; + } catch (error) { + // Only try normalization if we haven't already normalized + if (!needsNormalization) { + try { + const normalizedRoute = (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAdjacentParameters"])(route); + const compiler = (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["compile"])(normalizedRoute, options); + // Wrap the compiler to strip separators from output + return (params)=>{ + return (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["stripNormalizedSeparators"])(compiler(params)); + }; + } catch (retryError) { + // If that doesn't work, fall back to original error + throw error; + } + } + throw error; + } +} +function safeRegexpToFunction(regexp, keys) { + const originalMatcher = (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$path$2d$to$2d$regexp$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["regexpToFunction"])(regexp, keys || []); + return (pathname)=>{ + const result = originalMatcher(pathname); + if (!result) return false; + // Clean parameters before returning + return { + ...result, + params: (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["stripParameterSeparators"])(result.params) + }; + }; +} +function safeRouteMatcher(matcherFn) { + return (pathname)=>{ + const result = matcherFn(pathname); + if (!result) return false; + // Clean parameters before returning + return (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$esm$2f$lib$2f$route$2d$pattern$2d$normalizer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["stripParameterSeparators"])(result); + }; +} //# sourceMappingURL=route-match-utils.js.map +}), +"[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/esm/shared/lib/router/utils/route-matcher.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getRouteMatcher", + ()=>getRouteMatcher +]); +var __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$esm$2f$shared$2f$lib$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/utils.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$match$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/route-match-utils.js [app-rsc] (ecmascript)"); +; +; +function getRouteMatcher({ re, groups }) { + const rawMatcher = (pathname)=>{ + const routeMatch = re.exec(pathname); + if (!routeMatch) return false; + const decode = (param)=>{ + try { + return decodeURIComponent(param); + } catch { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["DecodeError"]('failed to decode param'), "__NEXT_ERROR_CODE", { + value: "E528", + enumerable: false, + configurable: true + }); + } + }; + const params = {}; + for (const [key, group] of Object.entries(groups)){ + const match = routeMatch[group.pos]; + if (match !== undefined) { + if (group.repeat) { + params[key] = match.split('/').map((entry)=>decode(entry)); + } else { + params[key] = decode(match); + } + } + } + return params; + }; + // Wrap with safe matcher to handle parameter cleaning + return (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$match$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["safeRouteMatcher"])(rawMatcher); +} //# sourceMappingURL=route-matcher.js.map +}), +"[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/esm/shared/lib/escape-regexp.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +// regexp is based on https://github.com/sindresorhus/escape-string-regexp +__turbopack_context__.s([ + "escapeStringRegexp", + ()=>escapeStringRegexp +]); +const reHasRegExp = /[|\\{}()[\]^$+*?.-]/; +const reReplaceRegExp = /[|\\{}()[\]^$+*?.-]/g; +function escapeStringRegexp(str) { + // see also: https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/escapeRegExp.js#L23 + if (reHasRegExp.test(str)) { + return str.replace(reReplaceRegExp, '\\$&'); + } + return str; +} //# sourceMappingURL=escape-regexp.js.map +}), +"[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/esm/shared/lib/router/utils/parse-loader-tree.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "parseLoaderTree", + ()=>parseLoaderTree +]); +var __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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/segment.js [app-rsc] (ecmascript)"); +; +function parseLoaderTree(tree) { + const [segment, parallelRoutes, modules] = tree; + const { layout, template } = modules; + let { page } = modules; + // a __DEFAULT__ segment means that this route didn't match any of the + // segments in the route, so we should use the default page + page = segment === __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$esm$2f$shared$2f$lib$2f$segment$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["DEFAULT_SEGMENT_KEY"] ? modules.defaultPage : page; + const conventionPath = layout?.[1] || template?.[1] || page?.[1]; + return { + page, + segment, + modules, + /* it can be either layout / template / page */ conventionPath, + parallelRoutes + }; +} //# sourceMappingURL=parse-loader-tree.js.map +}), +"[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/esm/shared/lib/router/utils/get-dynamic-param.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "PARAMETER_PATTERN", + ()=>PARAMETER_PATTERN, + "getDynamicParam", + ()=>getDynamicParam, + "interpolateParallelRouteParams", + ()=>interpolateParallelRouteParams, + "parseMatchedParameter", + ()=>parseMatchedParameter, + "parseParameter", + ()=>parseParameter +]); +var __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/invariant-error.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$parse$2d$loader$2d$tree$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/parse-loader-tree.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/get-segment-param.js [app-rsc] (ecmascript)"); +; +; +; +/** + * Gets the value of a param from the params object. This correctly handles the + * case where the param is a fallback route param and encodes the resulting + * value. + * + * @param interpolatedParams - The params object. + * @param segmentKey - The key of the segment. + * @param fallbackRouteParams - The fallback route params. + * @returns The value of the param. + */ function getParamValue(interpolatedParams, segmentKey, fallbackRouteParams) { + let value = interpolatedParams[segmentKey]; + if (fallbackRouteParams?.has(segmentKey)) { + // We know that the fallback route params has the segment key because we + // checked that above. + const [searchValue] = fallbackRouteParams.get(segmentKey); + value = searchValue; + } else if (Array.isArray(value)) { + value = value.map((i)=>encodeURIComponent(i)); + } else if (typeof value === 'string') { + value = encodeURIComponent(value); + } + return value; +} +function interpolateParallelRouteParams(loaderTree, params, pagePath, fallbackRouteParams) { + const interpolated = structuredClone(params); + // Stack-based traversal with depth tracking + const stack = [ + { + tree: loaderTree, + depth: 0 + } + ]; + // Derive value from pagePath based on depth and parameter type + const pathSegments = pagePath.split('/').slice(1) // Remove first empty string + ; + while(stack.length > 0){ + const { tree, depth } = stack.pop(); + const { segment, parallelRoutes } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$parse$2d$loader$2d$tree$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseLoaderTree"])(tree); + // Check if current segment contains a parameter + const segmentParam = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(segment); + if (segmentParam && !interpolated.hasOwnProperty(segmentParam.param) && // If the param is in the fallback route params, we don't need to + // interpolate it because it's already marked as being unknown. + !fallbackRouteParams?.has(segmentParam.param)) { + switch(segmentParam.type){ + case 'catchall': + case 'optional-catchall': + case 'catchall-intercepted-(..)(..)': + case 'catchall-intercepted-(.)': + case 'catchall-intercepted-(..)': + case 'catchall-intercepted-(...)': + // For catchall parameters, take all remaining segments from this depth + const remainingSegments = pathSegments.slice(depth); + // Process each segment to handle any dynamic params + const processedSegments = remainingSegments.flatMap((pathSegment)=>{ + const param = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(pathSegment); + // If the segment matches a param, return the param value otherwise, + // it's a static segment, so just return that. We don't use the + // `getParamValue` function here because we don't want the values to + // be encoded, that's handled on get by the `getDynamicParam` + // function. + return param ? interpolated[param.param] : pathSegment; + }).filter((s)=>s !== undefined); + if (processedSegments.length > 0) { + interpolated[segmentParam.param] = processedSegments; + } + break; + case 'dynamic': + case 'dynamic-intercepted-(..)(..)': + case 'dynamic-intercepted-(.)': + case 'dynamic-intercepted-(..)': + case 'dynamic-intercepted-(...)': + // For regular dynamic parameters, take the segment at this depth + if (depth < pathSegments.length) { + const pathSegment = pathSegments[depth]; + const param = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$segment$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getSegmentParam"])(pathSegment); + interpolated[segmentParam.param] = param ? interpolated[param.param] : pathSegment; + } + break; + default: + segmentParam.type; + } + } + // Calculate next depth - increment if this is not a route group and not empty + let nextDepth = depth; + const isRouteGroup = segment.startsWith('(') && segment.endsWith(')'); + if (!isRouteGroup && segment !== '') { + nextDepth++; + } + // Add all parallel routes to the stack for processing + for (const route of Object.values(parallelRoutes)){ + stack.push({ + tree: route, + depth: nextDepth + }); + } + } + return interpolated; +} +function getDynamicParam(interpolatedParams, segmentKey, dynamicParamType, fallbackRouteParams) { + let value = getParamValue(interpolatedParams, segmentKey, fallbackRouteParams); + // handle the case where an optional catchall does not have a value, + // e.g. `/dashboard/[[...slug]]` when requesting `/dashboard` + if (!value || value.length === 0) { + if (dynamicParamType === 'oc') { + return { + param: segmentKey, + value: null, + type: dynamicParamType, + treeSegment: [ + segmentKey, + '', + dynamicParamType + ] + }; + } + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"](`Missing value for segment key: "${segmentKey}" with dynamic param type: ${dynamicParamType}`), "__NEXT_ERROR_CODE", { + value: "E864", + enumerable: false, + configurable: true + }); + } + return { + param: segmentKey, + // The value that is passed to user code. + value, + // The value that is rendered in the router tree. + treeSegment: [ + segmentKey, + Array.isArray(value) ? value.join('/') : value, + dynamicParamType + ], + type: dynamicParamType + }; +} +const PARAMETER_PATTERN = /^([^[]*)\[((?:\[[^\]]*\])|[^\]]+)\](.*)$/; +function parseParameter(param) { + const match = param.match(PARAMETER_PATTERN); + if (!match) { + return parseMatchedParameter(param); + } + return parseMatchedParameter(match[2]); +} +function parseMatchedParameter(param) { + const optional = param.startsWith('[') && param.endsWith(']'); + if (optional) { + param = param.slice(1, -1); + } + const repeat = param.startsWith('...'); + if (repeat) { + param = param.slice(3); + } + return { + key: param, + repeat, + optional + }; +} //# sourceMappingURL=get-dynamic-param.js.map +}), +"[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/esm/shared/lib/router/utils/route-regex.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getNamedMiddlewareRegex", + ()=>getNamedMiddlewareRegex, + "getNamedRouteRegex", + ()=>getNamedRouteRegex, + "getRouteRegex", + ()=>getRouteRegex +]); +var __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/constants.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/interception-routes.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/escape-regexp.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$remove$2d$trailing$2d$slash$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/remove-trailing-slash.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/get-dynamic-param.js [app-rsc] (ecmascript)"); +; +; +; +; +; +function getParametrizedRoute(route, includeSuffix, includePrefix) { + const groups = {}; + let groupIndex = 1; + const segments = []; + for (const segment of (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$remove$2d$trailing$2d$slash$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["removeTrailingSlash"])(route).slice(1).split('/')){ + const markerMatch = __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["INTERCEPTION_ROUTE_MARKERS"].find((m)=>segment.startsWith(m)); + const paramMatches = segment.match(__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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["PARAMETER_PATTERN"]) // Check for parameters + ; + if (markerMatch && paramMatches && paramMatches[2]) { + const { key, optional, repeat } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseMatchedParameter"])(paramMatches[2]); + groups[key] = { + pos: groupIndex++, + repeat, + optional + }; + segments.push(`/${(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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(markerMatch)}([^/]+?)`); + } else if (paramMatches && paramMatches[2]) { + const { key, repeat, optional } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseMatchedParameter"])(paramMatches[2]); + groups[key] = { + pos: groupIndex++, + repeat, + optional + }; + if (includePrefix && paramMatches[1]) { + segments.push(`/${(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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(paramMatches[1])}`); + } + let s = repeat ? optional ? '(?:/(.+?))?' : '/(.+?)' : '/([^/]+?)'; + // Remove the leading slash if includePrefix already added it. + if (includePrefix && paramMatches[1]) { + s = s.substring(1); + } + segments.push(s); + } else { + segments.push(`/${(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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(segment)}`); + } + // If there's a suffix, add it to the segments if it's enabled. + if (includeSuffix && paramMatches && paramMatches[3]) { + segments.push((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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(paramMatches[3])); + } + } + return { + parameterizedRoute: segments.join(''), + groups + }; +} +function getRouteRegex(normalizedRoute, { includeSuffix = false, includePrefix = false, excludeOptionalTrailingSlash = false } = {}) { + const { parameterizedRoute, groups } = getParametrizedRoute(normalizedRoute, includeSuffix, includePrefix); + let re = parameterizedRoute; + if (!excludeOptionalTrailingSlash) { + re += '(?:/)?'; + } + return { + re: new RegExp(`^${re}$`), + groups: groups + }; +} +/** + * Builds a function to generate a minimal routeKey using only a-z and minimal + * number of characters. + */ function buildGetSafeRouteKey() { + let i = 0; + return ()=>{ + let routeKey = ''; + let j = ++i; + while(j > 0){ + routeKey += String.fromCharCode(97 + (j - 1) % 26); + j = Math.floor((j - 1) / 26); + } + return routeKey; + }; +} +function getSafeKeyFromSegment({ interceptionMarker, getSafeRouteKey, segment, routeKeys, keyPrefix, backreferenceDuplicateKeys }) { + const { key, optional, repeat } = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseMatchedParameter"])(segment); + // replace any non-word characters since they can break + // the named regex + let cleanedKey = key.replace(/\W/g, ''); + if (keyPrefix) { + cleanedKey = `${keyPrefix}${cleanedKey}`; + } + let invalidKey = false; + // check if the key is still invalid and fallback to using a known + // safe key + if (cleanedKey.length === 0 || cleanedKey.length > 30) { + invalidKey = true; + } + if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) { + invalidKey = true; + } + if (invalidKey) { + cleanedKey = getSafeRouteKey(); + } + const duplicateKey = cleanedKey in routeKeys; + if (keyPrefix) { + routeKeys[cleanedKey] = `${keyPrefix}${key}`; + } else { + routeKeys[cleanedKey] = key; + } + // if the segment has an interception marker, make sure that's part of the regex pattern + // this is to ensure that the route with the interception marker doesn't incorrectly match + // the non-intercepted route (ie /app/(.)[username] should not match /app/[username]) + const interceptionPrefix = interceptionMarker ? (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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(interceptionMarker) : ''; + let pattern; + if (duplicateKey && backreferenceDuplicateKeys) { + // Use a backreference to the key to ensure that the key is the same value + // in each of the placeholders. + pattern = `\\k<${cleanedKey}>`; + } else if (repeat) { + pattern = `(?<${cleanedKey}>.+?)`; + } else { + pattern = `(?<${cleanedKey}>[^/]+?)`; + } + return { + key, + pattern: optional ? `(?:/${interceptionPrefix}${pattern})?` : `/${interceptionPrefix}${pattern}`, + cleanedKey: cleanedKey, + optional, + repeat + }; +} +function getNamedParametrizedRoute(route, prefixRouteKeys, includeSuffix, includePrefix, backreferenceDuplicateKeys, reference = { + names: {}, + intercepted: {} +}) { + const getSafeRouteKey = buildGetSafeRouteKey(); + const routeKeys = {}; + const segments = []; + const inverseParts = []; + // Ensure we don't mutate the original reference object. + reference = structuredClone(reference); + for (const segment of (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$remove$2d$trailing$2d$slash$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["removeTrailingSlash"])(route).slice(1).split('/')){ + const hasInterceptionMarker = __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["INTERCEPTION_ROUTE_MARKERS"].some((m)=>segment.startsWith(m)); + const paramMatches = segment.match(__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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$get$2d$dynamic$2d$param$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["PARAMETER_PATTERN"]) // Check for parameters + ; + const interceptionMarker = hasInterceptionMarker ? paramMatches?.[1] : undefined; + let keyPrefix; + if (interceptionMarker && paramMatches?.[2]) { + keyPrefix = prefixRouteKeys ? __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_INTERCEPTION_MARKER_PREFIX"] : undefined; + reference.intercepted[paramMatches[2]] = interceptionMarker; + } else if (paramMatches?.[2] && reference.intercepted[paramMatches[2]]) { + keyPrefix = prefixRouteKeys ? __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_INTERCEPTION_MARKER_PREFIX"] : undefined; + } else { + keyPrefix = prefixRouteKeys ? __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_QUERY_PARAM_PREFIX"] : undefined; + } + if (interceptionMarker && paramMatches && paramMatches[2]) { + // If there's an interception marker, add it to the segments. + const { key, pattern, cleanedKey, repeat, optional } = getSafeKeyFromSegment({ + getSafeRouteKey, + interceptionMarker, + segment: paramMatches[2], + routeKeys, + keyPrefix, + backreferenceDuplicateKeys + }); + segments.push(pattern); + inverseParts.push(`/${paramMatches[1]}:${reference.names[key] ?? cleanedKey}${repeat ? optional ? '*' : '+' : ''}`); + reference.names[key] ??= cleanedKey; + } else if (paramMatches && paramMatches[2]) { + // If there's a prefix, add it to the segments if it's enabled. + if (includePrefix && paramMatches[1]) { + segments.push(`/${(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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(paramMatches[1])}`); + inverseParts.push(`/${paramMatches[1]}`); + } + const { key, pattern, cleanedKey, repeat, optional } = getSafeKeyFromSegment({ + getSafeRouteKey, + segment: paramMatches[2], + routeKeys, + keyPrefix, + backreferenceDuplicateKeys + }); + // Remove the leading slash if includePrefix already added it. + let s = pattern; + if (includePrefix && paramMatches[1]) { + s = s.substring(1); + } + segments.push(s); + inverseParts.push(`/:${reference.names[key] ?? cleanedKey}${repeat ? optional ? '*' : '+' : ''}`); + reference.names[key] ??= cleanedKey; + } else { + segments.push(`/${(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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(segment)}`); + inverseParts.push(`/${segment}`); + } + // If there's a suffix, add it to the segments if it's enabled. + if (includeSuffix && paramMatches && paramMatches[3]) { + segments.push((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$esm$2f$shared$2f$lib$2f$escape$2d$regexp$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["escapeStringRegexp"])(paramMatches[3])); + inverseParts.push(paramMatches[3]); + } + } + return { + namedParameterizedRoute: segments.join(''), + routeKeys, + pathToRegexpPattern: inverseParts.join(''), + reference + }; +} +function getNamedRouteRegex(normalizedRoute, options) { + const result = getNamedParametrizedRoute(normalizedRoute, options.prefixRouteKeys, options.includeSuffix ?? false, options.includePrefix ?? false, options.backreferenceDuplicateKeys ?? false, options.reference); + let namedRegex = result.namedParameterizedRoute; + if (!options.excludeOptionalTrailingSlash) { + namedRegex += '(?:/)?'; + } + return { + ...getRouteRegex(normalizedRoute, options), + namedRegex: `^${namedRegex}$`, + routeKeys: result.routeKeys, + pathToRegexpPattern: result.pathToRegexpPattern, + reference: result.reference + }; +} +function getNamedMiddlewareRegex(normalizedRoute, options) { + const { parameterizedRoute } = getParametrizedRoute(normalizedRoute, false, false); + const { catchAll = true } = options; + if (parameterizedRoute === '/') { + let catchAllRegex = catchAll ? '.*' : ''; + return { + namedRegex: `^/${catchAllRegex}$` + }; + } + const { namedParameterizedRoute } = getNamedParametrizedRoute(normalizedRoute, false, false, false, false, undefined); + let catchAllGroupedRegex = catchAll ? '(?:(/.*)?)' : ''; + return { + namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$` + }; +} //# sourceMappingURL=route-regex.js.map +}), +"[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/esm/server/app-render/get-short-dynamic-param-type.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "dynamicParamTypes", + ()=>dynamicParamTypes +]); +const dynamicParamTypes = { + catchall: 'c', + 'catchall-intercepted-(..)(..)': 'ci(..)(..)', + 'catchall-intercepted-(.)': 'ci(.)', + 'catchall-intercepted-(..)': 'ci(..)', + 'catchall-intercepted-(...)': 'ci(...)', + 'optional-catchall': 'oc', + dynamic: 'd', + 'dynamic-intercepted-(..)(..)': 'di(..)(..)', + 'dynamic-intercepted-(.)': 'di(.)', + 'dynamic-intercepted-(..)': 'di(..)', + 'dynamic-intercepted-(...)': 'di(...)' +}; //# sourceMappingURL=get-short-dynamic-param-type.js.map +}), +"[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/esm/server/request/fallback-params.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "createOpaqueFallbackRouteParams", + ()=>createOpaqueFallbackRouteParams, + "getFallbackRouteParams", + ()=>getFallbackRouteParams +]); +var __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$esm$2f$build$2f$segment$2d$config$2f$app$2f$app$2d$segments$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/build/segment-config/app/app-segments.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/invariant-error.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$matcher$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/route-matcher.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$regex$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/route-regex.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$app$2d$render$2f$get$2d$short$2d$dynamic$2d$param$2d$type$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/app-render/get-short-dynamic-param-type.js [app-rsc] (ecmascript)"); +; +; +; +; +; +function getParamKeys(page) { + const pattern = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$regex$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRouteRegex"])(page); + const matcher = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$route$2d$matcher$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRouteMatcher"])(pattern); + // Get the default list of allowed params. + return Object.keys(matcher(page)); +} +function createOpaqueFallbackRouteParams(fallbackRouteParams) { + // If there are no fallback route params, we can return early. + if (fallbackRouteParams.length === 0) return null; + // As we're creating unique keys for each of the dynamic route params, we only + // need to generate a unique ID once per request because each of the keys will + // be also be unique. + const uniqueID = Math.random().toString(16).slice(2); + const keys = new Map(); + // Generate a unique key for the fallback route param, if this key is found + // in the static output, it represents a bug in cache components. + for (const { paramName, paramType } of fallbackRouteParams){ + keys.set(paramName, [ + `%%drp:${paramName}:${uniqueID}%%`, + __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$esm$2f$server$2f$app$2d$render$2f$get$2d$short$2d$dynamic$2d$param$2d$type$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["dynamicParamTypes"][paramType] + ]); + } + return keys; +} +function getFallbackRouteParams(page, routeModule) { + // First, get the fallback route params based on the provided page. + const unknownParamKeys = new Set(getParamKeys(page)); + // Needed when processing fallback route params for catchall routes in + // parallel segments, derive from pathname. This is similar to + // getDynamicParam's pagePath parsing logic. + const pathSegments = page.split('/').filter(Boolean); + const collected = (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$esm$2f$build$2f$segment$2d$config$2f$app$2f$app$2d$segments$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["collectFallbackRouteParams"])(routeModule); + // Then, we have to get the fallback route params from the segments that are + // associated with parallel route segments. + const fallbackRouteParams = []; + for (const fallbackRouteParam of collected){ + if (fallbackRouteParam.isParallelRouteParam) { + // Try to see if we can resolve this parameter from the page that was + // passed in. + if (unknownParamKeys.has(fallbackRouteParam.paramName)) { + continue; + } + if (fallbackRouteParam.paramType === 'optional-catchall' || fallbackRouteParam.paramType === 'catchall') { + // If there are any fallback route segments then we can't use the + // pathname to derive the value because it's not complete. We can + // make this assumption because the routes are always resolved left + // to right and the catchall is always the last segment, so any + // route parameters that are unknown will always contribute to the + // pathname and therefore the catchall param too. + if (collected.some((param)=>!param.isParallelRouteParam && unknownParamKeys.has(param.paramName))) { + fallbackRouteParams.push(fallbackRouteParam); + continue; + } + if (pathSegments.length === 0 && fallbackRouteParam.paramType !== 'optional-catchall') { + // We shouldn't be able to match a catchall segment without any path + // segments if it's not an optional catchall. + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"](`Unexpected empty path segments match for a pathname "${page}" with param "${fallbackRouteParam.paramName}" of type "${fallbackRouteParam.paramType}"`), "__NEXT_ERROR_CODE", { + value: "E792", + enumerable: false, + configurable: true + }); + } + // The path segments are not empty, and the segments didn't contain any + // unknown params, so we know that this particular fallback route param + // route param is not actually unknown, and is known. We can skip adding + // it to the fallback route params. + } else { + // This is some other type of route param that shouldn't get resolved + // statically. + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"](`Unexpected match for a pathname "${page}" with a param "${fallbackRouteParam.paramName}" of type "${fallbackRouteParam.paramType}"`), "__NEXT_ERROR_CODE", { + value: "E791", + enumerable: false, + configurable: true + }); + } + } else if (unknownParamKeys.has(fallbackRouteParam.paramName)) { + // As this is a non-parallel route segment, and it exists in the unknown + // param keys, we know it's a fallback route param. + fallbackRouteParams.push(fallbackRouteParam); + } + } + return createOpaqueFallbackRouteParams(fallbackRouteParams); +} //# sourceMappingURL=fallback-params.js.map +}), +"[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/esm/server/app-render/encryption-utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "arrayBufferToString", + ()=>arrayBufferToString, + "decrypt", + ()=>decrypt, + "encrypt", + ()=>encrypt, + "getActionEncryptionKey", + ()=>getActionEncryptionKey, + "getClientReferenceManifestForRsc", + ()=>getClientReferenceManifestForRsc, + "getServerModuleMap", + ()=>getServerModuleMap, + "setReferenceManifestsSingleton", + ()=>setReferenceManifestsSingleton, + "stringToUint8Array", + ()=>stringToUint8Array +]); +var __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/invariant-error.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/app-paths.js [app-rsc] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/next/dist/server/app-render/work-async-storage.external.js [external] (next/dist/server/app-render/work-async-storage.external.js, cjs)"); +; +; +; +let __next_loaded_action_key; +function arrayBufferToString(buffer) { + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + // @anonrig: V8 has a limit of 65535 arguments in a function. + // For len < 65535, this is faster. + // https://github.com/vercel/next.js/pull/56377#pullrequestreview-1656181623 + if (len < 65535) { + return String.fromCharCode.apply(null, bytes); + } + let binary = ''; + for(let i = 0; i < len; i++){ + binary += String.fromCharCode(bytes[i]); + } + return binary; +} +function stringToUint8Array(binary) { + const len = binary.length; + const arr = new Uint8Array(len); + for(let i = 0; i < len; i++){ + arr[i] = binary.charCodeAt(i); + } + return arr; +} +function encrypt(key, iv, data) { + return crypto.subtle.encrypt({ + name: 'AES-GCM', + iv + }, key, data); +} +function decrypt(key, iv, data) { + return crypto.subtle.decrypt({ + name: 'AES-GCM', + iv + }, key, data); +} +// This is a global singleton that is used to encode/decode the action bound args from +// the closure. This can't be using a AsyncLocalStorage as it might happen on the module +// level. Since the client reference manifest won't be mutated, let's use a global singleton +// to keep it. +const SERVER_ACTION_MANIFESTS_SINGLETON = Symbol.for('next.server.action-manifests'); +function setReferenceManifestsSingleton({ page, clientReferenceManifest, serverActionsManifest, serverModuleMap }) { + var _globalThis_SERVER_ACTION_MANIFESTS_SINGLETON; + // @ts-expect-error + const clientReferenceManifestsPerPage = (_globalThis_SERVER_ACTION_MANIFESTS_SINGLETON = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON]) == null ? void 0 : _globalThis_SERVER_ACTION_MANIFESTS_SINGLETON.clientReferenceManifestsPerPage; + // @ts-expect-error + globalThis[SERVER_ACTION_MANIFESTS_SINGLETON] = { + clientReferenceManifestsPerPage: { + ...clientReferenceManifestsPerPage, + [(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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAppPath"])(page)]: clientReferenceManifest + }, + serverActionsManifest, + serverModuleMap + }; +} +function getServerModuleMap() { + const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON]; + if (!serverActionsManifestSingleton) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Missing manifest for Server Actions.'), "__NEXT_ERROR_CODE", { + value: "E606", + enumerable: false, + configurable: true + }); + } + return serverActionsManifestSingleton.serverModuleMap; +} +function getClientReferenceManifestForRsc() { + const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON]; + if (!serverActionsManifestSingleton) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Missing manifest for Server Actions.'), "__NEXT_ERROR_CODE", { + value: "E606", + enumerable: false, + configurable: true + }); + } + const { clientReferenceManifestsPerPage } = serverActionsManifestSingleton; + const workStore = __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js$2c$__cjs$29$__["workAsyncStorage"].getStore(); + if (!workStore) { + // If there's no work store defined, we can assume that a client reference + // manifest is needed during module evaluation, e.g. to create a server + // action using a higher-order function. This might also use client + // components which need to be serialized by Flight, and therefore client + // references need to be resolvable. To make this work, we're returning a + // merged manifest across all pages. This is fine as long as the module IDs + // are not page specific, which they are not for Webpack. TODO: Fix this in + // Turbopack. + return mergeClientReferenceManifests(clientReferenceManifestsPerPage); + } + const clientReferenceManifest = clientReferenceManifestsPerPage[workStore.route]; + if (!clientReferenceManifest) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"](`Missing Client Reference Manifest for ${workStore.route}.`), "__NEXT_ERROR_CODE", { + value: "E570", + enumerable: false, + configurable: true + }); + } + return clientReferenceManifest; +} +async function getActionEncryptionKey() { + if (__next_loaded_action_key) { + return __next_loaded_action_key; + } + const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON]; + if (!serverActionsManifestSingleton) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Missing manifest for Server Actions.'), "__NEXT_ERROR_CODE", { + value: "E606", + enumerable: false, + configurable: true + }); + } + const rawKey = process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY || serverActionsManifestSingleton.serverActionsManifest.encryptionKey; + if (rawKey === undefined) { + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"]('Missing encryption key for Server Actions'), "__NEXT_ERROR_CODE", { + value: "E571", + enumerable: false, + configurable: true + }); + } + __next_loaded_action_key = await crypto.subtle.importKey('raw', stringToUint8Array(atob(rawKey)), 'AES-GCM', true, [ + 'encrypt', + 'decrypt' + ]); + return __next_loaded_action_key; +} +function mergeClientReferenceManifests(clientReferenceManifestsPerPage) { + const clientReferenceManifests = Object.values(clientReferenceManifestsPerPage); + const mergedClientReferenceManifest = { + clientModules: {}, + edgeRscModuleMapping: {}, + rscModuleMapping: {} + }; + for (const clientReferenceManifest of clientReferenceManifests){ + mergedClientReferenceManifest.clientModules = { + ...mergedClientReferenceManifest.clientModules, + ...clientReferenceManifest.clientModules + }; + mergedClientReferenceManifest.edgeRscModuleMapping = { + ...mergedClientReferenceManifest.edgeRscModuleMapping, + ...clientReferenceManifest.edgeRscModuleMapping + }; + mergedClientReferenceManifest.rscModuleMapping = { + ...mergedClientReferenceManifest.rscModuleMapping, + ...clientReferenceManifest.rscModuleMapping + }; + } + return mergedClientReferenceManifest; +} //# sourceMappingURL=encryption-utils.js.map +}), +"[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/esm/shared/lib/router/utils/html-bots.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +// This regex contains the bots that we need to do a blocking render for and can't safely stream the response +// due to how they parse the DOM. For example, they might explicitly check for metadata in the `head` tag, so we can't stream metadata tags after the `head` was sent. +// Note: The pattern [\w-]+-Google captures all Google crawlers with "-Google" suffix (e.g., Mediapartners-Google, AdsBot-Google, Storebot-Google) +// as well as crawlers starting with "Google-" (e.g., Google-PageRenderer, Google-InspectionTool) +__turbopack_context__.s([ + "HTML_LIMITED_BOT_UA_RE", + ()=>HTML_LIMITED_BOT_UA_RE +]); +const HTML_LIMITED_BOT_UA_RE = /[\w-]+-Google|Google-[\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i; //# sourceMappingURL=html-bots.js.map +}), +"[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/esm/shared/lib/router/utils/is-bot.js [app-rsc] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "HTML_LIMITED_BOT_UA_RE_STRING", + ()=>HTML_LIMITED_BOT_UA_RE_STRING, + "getBotType", + ()=>getBotType, + "isBot", + ()=>isBot +]); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$html$2d$bots$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/html-bots.js [app-rsc] (ecmascript)"); +; +// Bot crawler that will spin up a headless browser and execute JS. +// Only the main Googlebot search crawler executes JavaScript, not other Google crawlers. +// x-ref: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers +// This regex specifically matches "Googlebot" but NOT "Mediapartners-Google", "AdsBot-Google", etc. +const HEADLESS_BROWSER_BOT_UA_RE = /Googlebot(?!-)|Googlebot$/i; +const HTML_LIMITED_BOT_UA_RE_STRING = __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$html$2d$bots$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["HTML_LIMITED_BOT_UA_RE"].source; +; +function isDomBotUA(userAgent) { + return HEADLESS_BROWSER_BOT_UA_RE.test(userAgent); +} +function isHtmlLimitedBotUA(userAgent) { + return __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$html$2d$bots$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["HTML_LIMITED_BOT_UA_RE"].test(userAgent); +} +function isBot(userAgent) { + return isDomBotUA(userAgent) || isHtmlLimitedBotUA(userAgent); +} +function getBotType(userAgent) { + if (isDomBotUA(userAgent)) { + return 'dom'; + } + if (isHtmlLimitedBotUA(userAgent)) { + return 'html'; + } + return undefined; +} //# sourceMappingURL=is-bot.js.map +}), +"[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/esm/server/lib/streaming-metadata.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "isHtmlBotRequest", + ()=>isHtmlBotRequest, + "shouldServeStreamingMetadata", + ()=>shouldServeStreamingMetadata +]); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/is-bot.js [app-rsc] (ecmascript) "); +; +function shouldServeStreamingMetadata(userAgent, htmlLimitedBots) { + const blockingMetadataUARegex = new RegExp(htmlLimitedBots || __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["HTML_LIMITED_BOT_UA_RE_STRING"], 'i'); + // Only block metadata for HTML-limited bots + if (userAgent && blockingMetadataUARegex.test(userAgent)) { + return false; + } + return true; +} +function isHtmlBotRequest(req) { + const ua = req.headers['user-agent'] || ''; + const botType = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["getBotType"])(ua); + return botType === 'html'; +} //# sourceMappingURL=streaming-metadata.js.map +}), +"[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/esm/server/app-render/action-utils.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "createServerModuleMap", + ()=>createServerModuleMap, + "selectWorkerForForwarding", + ()=>selectWorkerForForwarding +]); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/app-paths.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$path$2d$has$2d$prefix$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/path-has-prefix.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$remove$2d$path$2d$prefix$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/remove-path-prefix.js [app-rsc] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/next/dist/server/app-render/work-async-storage.external.js [external] (next/dist/server/app-render/work-async-storage.external.js, cjs)"); +; +; +; +; +function createServerModuleMap({ serverActionsManifest }) { + return new Proxy({}, { + get: (_, id)=>{ + var _serverActionsManifest__id, _serverActionsManifest_; + const workers = (_serverActionsManifest_ = serverActionsManifest[("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : 'node']) == null ? void 0 : (_serverActionsManifest__id = _serverActionsManifest_[id]) == null ? void 0 : _serverActionsManifest__id.workers; + if (!workers) { + return undefined; + } + const workStore = __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$server$2f$app$2d$render$2f$work$2d$async$2d$storage$2e$external$2e$js$2c$__cjs$29$__["workAsyncStorage"].getStore(); + let workerEntry; + if (workStore) { + workerEntry = workers[normalizeWorkerPageName(workStore.page)]; + } else { + // If there's no work store defined, we can assume that a server + // module map is needed during module evaluation, e.g. to create a + // server action using a higher-order function. Therefore it should be + // safe to return any entry from the manifest that matches the action + // ID. They all refer to the same module ID, which must also exist in + // the current page bundle. TODO: This is currently not guaranteed in + // Turbopack, and needs to be fixed. + workerEntry = Object.values(workers).at(0); + } + if (!workerEntry) { + return undefined; + } + const { moduleId, async } = workerEntry; + return { + id: moduleId, + name: id, + chunks: [], + async + }; + } + }); +} +function selectWorkerForForwarding(actionId, pageName, serverActionsManifest) { + var _serverActionsManifest__actionId; + const workers = (_serverActionsManifest__actionId = serverActionsManifest[("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : 'node'][actionId]) == null ? void 0 : _serverActionsManifest__actionId.workers; + const workerName = normalizeWorkerPageName(pageName); + // no workers, nothing to forward to + if (!workers) return; + // if there is a worker for this page, no need to forward it. + if (workers[workerName]) { + return; + } + // otherwise, grab the first worker that has a handler for this action id + return denormalizeWorkerPageName(Object.keys(workers)[0]); +} +/** + * The flight entry loader keys actions by bundlePath. + * bundlePath corresponds with the relative path (including 'app') to the page entrypoint. + */ function normalizeWorkerPageName(pageName) { + if ((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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$path$2d$has$2d$prefix$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["pathHasPrefix"])(pageName, 'app')) { + return pageName; + } + return 'app' + pageName; +} +/** + * Converts a bundlePath (relative path to the entrypoint) to a routable page name + */ function denormalizeWorkerPageName(bundlePath) { + return (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAppPath"])((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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$remove$2d$path$2d$prefix$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["removePathPrefix"])(bundlePath, 'app')); +} //# sourceMappingURL=action-utils.js.map +}), +"[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/esm/server/lib/server-action-request-meta.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getIsPossibleServerAction", + ()=>getIsPossibleServerAction, + "getServerActionRequestMetadata", + ()=>getServerActionRequestMetadata +]); +var __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/client/components/app-router-headers.js [app-rsc] (ecmascript)"); +; +function getServerActionRequestMetadata(req) { + let actionId; + let contentType; + if (req.headers instanceof Headers) { + actionId = req.headers.get(__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ACTION_HEADER"]) ?? null; + contentType = req.headers.get('content-type'); + } else { + actionId = req.headers[__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ACTION_HEADER"]] ?? null; + contentType = req.headers['content-type'] ?? null; + } + const isURLEncodedAction = Boolean(req.method === 'POST' && contentType === 'application/x-www-form-urlencoded'); + const isMultipartAction = Boolean(req.method === 'POST' && (contentType == null ? void 0 : contentType.startsWith('multipart/form-data'))); + const isFetchAction = Boolean(actionId !== undefined && typeof actionId === 'string' && req.method === 'POST'); + const isPossibleServerAction = Boolean(isFetchAction || isURLEncodedAction || isMultipartAction); + return { + actionId, + isURLEncodedAction, + isMultipartAction, + isFetchAction, + isPossibleServerAction + }; +} +function getIsPossibleServerAction(req) { + return getServerActionRequestMetadata(req).isPossibleServerAction; +} //# sourceMappingURL=server-action-request-meta.js.map +}), +"[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/esm/lib/fallback.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Describes the different fallback modes that a given page can have. + */ __turbopack_context__.s([ + "FallbackMode", + ()=>FallbackMode, + "fallbackModeToFallbackField", + ()=>fallbackModeToFallbackField, + "parseFallbackField", + ()=>parseFallbackField, + "parseStaticPathsResult", + ()=>parseStaticPathsResult +]); +var FallbackMode = /*#__PURE__*/ function(FallbackMode) { + /** + * A BLOCKING_STATIC_RENDER fallback will block the request until the page is + * generated. No fallback page will be rendered, and users will have to wait + * to render the page. + */ FallbackMode["BLOCKING_STATIC_RENDER"] = "BLOCKING_STATIC_RENDER"; + /** + * When set to PRERENDER, a fallback page will be sent to users in place of + * forcing them to wait for the page to be generated. This allows the user to + * see a rendered page earlier. + */ FallbackMode["PRERENDER"] = "PRERENDER"; + /** + * When set to NOT_FOUND, pages that are not already prerendered will result + * in a not found response. + */ FallbackMode["NOT_FOUND"] = "NOT_FOUND"; + return FallbackMode; +}({}); +function parseFallbackField(fallbackField) { + if (typeof fallbackField === 'string') { + return "PRERENDER"; + } else if (fallbackField === null) { + return "BLOCKING_STATIC_RENDER"; + } else if (fallbackField === false) { + return "NOT_FOUND"; + } else if (fallbackField === undefined) { + return undefined; + } else { + throw Object.defineProperty(new Error(`Invalid fallback option: ${fallbackField}. Fallback option must be a string, null, undefined, or false.`), "__NEXT_ERROR_CODE", { + value: "E285", + enumerable: false, + configurable: true + }); + } +} +function fallbackModeToFallbackField(fallback, page) { + switch(fallback){ + case "BLOCKING_STATIC_RENDER": + return null; + case "NOT_FOUND": + return false; + case "PRERENDER": + if (!page) { + throw Object.defineProperty(new Error(`Invariant: expected a page to be provided when fallback mode is "${fallback}"`), "__NEXT_ERROR_CODE", { + value: "E422", + enumerable: false, + configurable: true + }); + } + return page; + default: + throw Object.defineProperty(new Error(`Invalid fallback mode: ${fallback}`), "__NEXT_ERROR_CODE", { + value: "E254", + enumerable: false, + configurable: true + }); + } +} +function parseStaticPathsResult(result) { + if (result === true) { + return "PRERENDER"; + } else if (result === 'blocking') { + return "BLOCKING_STATIC_RENDER"; + } else { + return "NOT_FOUND"; + } +} //# sourceMappingURL=fallback.js.map +}), +"[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/esm/server/lib/etag.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * FNV-1a Hash implementation + * @author Travis Webb (tjwebb) + * + * Ported from https://github.com/tjwebb/fnv-plus/blob/master/index.js + * + * Simplified, optimized and add modified for 52 bit, which provides a larger hash space + * and still making use of Javascript's 53-bit integer space. + */ __turbopack_context__.s([ + "fnv1a52", + ()=>fnv1a52, + "generateETag", + ()=>generateETag +]); +const fnv1a52 = (str)=>{ + const len = str.length; + let i = 0, t0 = 0, v0 = 0x2325, t1 = 0, v1 = 0x8422, t2 = 0, v2 = 0x9ce4, t3 = 0, v3 = 0xcbf2; + while(i < len){ + v0 ^= str.charCodeAt(i++); + t0 = v0 * 435; + t1 = v1 * 435; + t2 = v2 * 435; + t3 = v3 * 435; + t2 += v0 << 8; + t3 += v1 << 8; + t1 += t0 >>> 16; + v0 = t0 & 65535; + t2 += t1 >>> 16; + v1 = t1 & 65535; + v3 = t3 + (t2 >>> 16) & 65535; + v2 = t2 & 65535; + } + return (v3 & 15) * 281474976710656 + v2 * 4294967296 + v1 * 65536 + (v0 ^ v3 >> 4); +}; +const generateETag = (payload, weak = false)=>{ + const prefix = weak ? 'W/"' : '"'; + return prefix + fnv1a52(payload).toString(36) + payload.length.toString(36) + '"'; +}; //# sourceMappingURL=etag.js.map +}), +"[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/fresh/index.js [app-rsc] (ecmascript)", ((__turbopack_context__, module, exports) => { + +(()=>{ + "use strict"; + var e = { + 695: (e)=>{ + /*! + * fresh + * Copyright(c) 2012 TJ Holowaychuk + * Copyright(c) 2016-2017 Douglas Christopher Wilson + * MIT Licensed + */ var r = /(?:^|,)\s*?no-cache\s*?(?:,|$)/; + e.exports = fresh; + function fresh(e, a) { + var t = e["if-modified-since"]; + var s = e["if-none-match"]; + if (!t && !s) { + return false; + } + var i = e["cache-control"]; + if (i && r.test(i)) { + return false; + } + if (s && s !== "*") { + var f = a["etag"]; + if (!f) { + return false; + } + var n = true; + var u = parseTokenList(s); + for(var _ = 0; _ < u.length; _++){ + var o = u[_]; + if (o === f || o === "W/" + f || "W/" + o === f) { + n = false; + break; + } + } + if (n) { + return false; + } + } + if (t) { + var p = a["last-modified"]; + var v = !p || !(parseHttpDate(p) <= parseHttpDate(t)); + if (v) { + return false; + } + } + return true; + } + function parseHttpDate(e) { + var r = e && Date.parse(e); + return typeof r === "number" ? r : NaN; + } + function parseTokenList(e) { + var r = 0; + var a = []; + var t = 0; + for(var s = 0, i = e.length; s < i; s++){ + switch(e.charCodeAt(s)){ + case 32: + if (t === r) { + t = r = s + 1; + } + break; + case 44: + a.push(e.substring(t, r)); + t = r = s + 1; + break; + default: + r = s + 1; + break; + } + } + a.push(e.substring(t, r)); + return a; + } + } + }; + var r = {}; + function __nccwpck_require__(a) { + var t = r[a]; + if (t !== undefined) { + return t.exports; + } + var s = r[a] = { + exports: {} + }; + var i = true; + try { + e[a](s, s.exports, __nccwpck_require__); + i = false; + } finally{ + if (i) delete r[a]; + } + return s.exports; + } + if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/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/fresh") + "/"; + var a = __nccwpck_require__(695); + module.exports = a; +})(); +}), +"[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/esm/server/lib/cache-control.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getCacheControlHeader", + ()=>getCacheControlHeader +]); +var __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/constants.js [app-rsc] (ecmascript)"); +; +function getCacheControlHeader({ revalidate, expire }) { + const swrHeader = typeof revalidate === 'number' && expire !== undefined && revalidate < expire ? `, stale-while-revalidate=${expire - revalidate}` : ''; + if (revalidate === 0) { + return 'private, no-cache, no-store, max-age=0, must-revalidate'; + } else if (typeof revalidate === 'number') { + return `s-maxage=${revalidate}${swrHeader}`; + } + return `s-maxage=${__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CACHE_ONE_YEAR"]}${swrHeader}`; +} //# sourceMappingURL=cache-control.js.map +}), +"[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/esm/server/send-payload.js [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "sendEtagResponse", + ()=>sendEtagResponse, + "sendRenderResult", + ()=>sendRenderResult +]); +var __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$esm$2f$shared$2f$lib$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/utils.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$etag$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/etag.js [app-rsc] (ecmascript)"); +var __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$fresh$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/fresh/index.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$cache$2d$control$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/cache-control.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/constants.js [app-rsc] (ecmascript)"); +; +; +; +; +; +function sendEtagResponse(req, res, etag) { + if (etag) { + /** + * The server generating a 304 response MUST generate any of the + * following header fields that would have been sent in a 200 (OK) + * response to the same request: Cache-Control, Content-Location, Date, + * ETag, Expires, and Vary. https://tools.ietf.org/html/rfc7232#section-4.1 + */ res.setHeader('ETag', etag); + } + if ((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$fresh$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"])(req.headers, { + etag + })) { + res.statusCode = 304; + res.end(); + return true; + } + return false; +} +async function sendRenderResult({ req, res, result, generateEtags, poweredByHeader, cacheControl }) { + if ((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$esm$2f$shared$2f$lib$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isResSent"])(res)) { + return; + } + if (poweredByHeader && result.contentType === __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["HTML_CONTENT_TYPE_HEADER"]) { + res.setHeader('X-Powered-By', 'Next.js'); + } + // If cache control is already set on the response we don't + // override it to allow users to customize it via next.config + if (cacheControl && !res.getHeader('Cache-Control')) { + res.setHeader('Cache-Control', (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$esm$2f$server$2f$lib$2f$cache$2d$control$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getCacheControlHeader"])(cacheControl)); + } + const payload = result.isDynamic ? null : result.toUnchunkedString(); + if (generateEtags && payload !== null) { + const etag = (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$esm$2f$server$2f$lib$2f$etag$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["generateETag"])(payload); + if (sendEtagResponse(req, res, etag)) { + return; + } + } + if (!res.getHeader('Content-Type') && result.contentType) { + res.setHeader('Content-Type', result.contentType); + } + if (payload) { + res.setHeader('Content-Length', Buffer.byteLength(payload)); + } + if (req.method === 'HEAD') { + res.end(null); + return; + } + if (payload !== null) { + res.end(payload); + return; + } + // Pipe the render result to the response after we get a writer for it. + await result.pipeToNodeResponse(res); +} //# sourceMappingURL=send-payload.js.map +}), +"[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/client/components/builtin/global-error.js [app-rsc] (ecmascript)")); +}), +"[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript, Next.js server utility) ", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript) "));}), +"[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript, Next.js server utility)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript)"));}), +"[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/client/components/builtin/not-found.js [app-rsc] (ecmascript)")); +}), +"[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript)")); +}), +"[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript)")); +}), +"[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/esm/build/templates/app-page.js?page=/relationship-test/page { GLOBAL_ERROR_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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "__next_app__", + ()=>__next_app__, + "handler", + ()=>handler, + "routeModule", + ()=>routeModule +]); +var __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$esm$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$module$2e$compiled$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/route-modules/app-page/module.compiled.js [app-ssr] (ecmascript)"); +var __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__ = __turbopack_context__.i("[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/esm/server/route-kind.js [app-rsc] (ecmascript, Next.js server utility)"); +var __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$esm$2f$server$2f$instrumentation$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/instrumentation/utils.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/trace/tracer.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/request-meta.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$trace$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/trace/constants.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$app$2d$render$2f$interop$2d$default$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/app-render/interop-default.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$app$2d$render$2f$strip$2d$flight$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/app-render/strip-flight-headers.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$base$2d$http$2f$node$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/base-http/node.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$experimental$2f$ppr$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/experimental/ppr.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$request$2f$fallback$2d$params$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/request/fallback-params.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$app$2d$render$2f$encryption$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/app-render/encryption-utils.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$streaming$2d$metadata$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/streaming-metadata.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$app$2d$render$2f$action$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/app-render/action-utils.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/app-paths.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$lib$2f$server$2d$action$2d$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/lib/server-action-request-meta.js [app-rsc] (ecmascript)"); +var __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/client/components/app-router-headers.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/is-bot.js [app-rsc] (ecmascript) "); +var __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$esm$2f$server$2f$response$2d$cache$2f$index$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[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/esm/server/response-cache/index.js [app-rsc] (ecmascript) "); +var __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/response-cache/types.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/fallback.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/render-result.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/constants.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$stream$2d$utils$2f$encoded$2d$tags$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/stream-utils/encoded-tags.js [app-rsc] (ecmascript)"); +var __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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/server/send-payload.js [app-rsc] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)"); +var __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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29$__ = __turbopack_context__.i("[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)"); +var __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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__$3c$locals$3e$__ = __turbopack_context__.i("[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript, Next.js server utility) "); +var __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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__ = __turbopack_context__.i("[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript, Next.js server utility)"); +var __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$esm$2f$client$2f$components$2f$redirect$2d$status$2d$code$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/client/components/redirect-status-code.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/invariant-error.js [app-rsc] (ecmascript)"); +var __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$esm$2f$lib$2f$scheduler$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/lib/scheduler.js [app-rsc] (ecmascript)"); +var __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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/esm/shared/lib/router/utils/interception-routes.js [app-rsc] (ecmascript)"); +const __TURBOPACK__layout__$23$0__ = ()=>__turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__loading__$23$1__ = ()=>__turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__not$2d$found__$23$2__ = ()=>__turbopack_context__.r("[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__forbidden__$23$3__ = ()=>__turbopack_context__.r("[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__unauthorized__$23$4__ = ()=>__turbopack_context__.r("[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__global$2d$error__$23$5__ = ()=>__turbopack_context__.r("[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)"); +const __TURBOPACK__page__$23$6__ = ()=>__turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)"); +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +// We inject the tree and pages here so that we can use them in the route +// module. +const tree = [ + "", + { + "children": [ + "relationship-test", + { + "children": [ + "__PAGE__", + {}, + { + metadata: {}, + "page": [ + __TURBOPACK__page__$23$6__, + "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx" + ] + } + ] + }, + { + metadata: {} + } + ] + }, + { + "layout": [ + __TURBOPACK__layout__$23$0__, + "[project]/Documents/go-new/chinese-family-tree/app/layout.tsx" + ], + "loading": [ + __TURBOPACK__loading__$23$1__, + "[project]/Documents/go-new/chinese-family-tree/app/loading.tsx" + ], + "not-found": [ + __TURBOPACK__not$2d$found__$23$2__, + "[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/client/components/builtin/not-found.js" + ], + "forbidden": [ + __TURBOPACK__forbidden__$23$3__, + "[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/client/components/builtin/forbidden.js" + ], + "unauthorized": [ + __TURBOPACK__unauthorized__$23$4__, + "[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/client/components/builtin/unauthorized.js" + ], + "global-error": [ + __TURBOPACK__global$2d$error__$23$5__, + "[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/client/components/builtin/global-error.js" + ] + } +]; +; +; +const __next_app_require__ = __turbopack_context__.r.bind(__turbopack_context__); +const __next_app_load_chunk__ = __turbopack_context__.l.bind(__turbopack_context__); +const __next_app__ = { + require: __next_app_require__, + loadChunk: __next_app_load_chunk__ +}; +; +; +; +; +; +; +const routeModule = new __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$esm$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$module$2e$compiled$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AppPageRouteModule"]({ + definition: { + kind: __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["RouteKind"].APP_PAGE, + page: "/relationship-test/page", + pathname: "/relationship-test", + // The following aren't used in production. + bundlePath: '', + filename: '', + appPaths: [] + }, + userland: { + loaderTree: tree + }, + distDir: ("TURBOPACK compile-time value", ".next/dev") || '', + relativeProjectDir: ("TURBOPACK compile-time value", "") || '' +}); +async function handler(req, res, ctx) { + var _this; + if (routeModule.isDev) { + (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["addRequestMeta"])(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint()); + } + let srcPage = "/relationship-test/page"; + // turbopack doesn't normalize `/index` in the page name + // so we need to to process dynamic routes properly + // TODO: fix turbopack providing differing value from webpack + if ("TURBOPACK compile-time truthy", 1) { + srcPage = srcPage.replace(/\/index$/, '') || '/'; + } else if (srcPage === '/index') { + // we always normalize /index specifically + srcPage = '/'; + } + const multiZoneDraftMode = ("TURBOPACK compile-time value", false); + const isMinimalMode = Boolean(("TURBOPACK compile-time value", false) || (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'minimalMode')); + const prepareResult = await routeModule.prepare(req, res, { + srcPage, + multiZoneDraftMode + }); + if (!prepareResult) { + res.statusCode = 400; + res.end('Bad Request'); + ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve()); + return null; + } + const { buildId, query, params, pageIsDynamic, buildManifest, nextFontManifest, reactLoadableManifest, serverActionsManifest, clientReferenceManifest, subresourceIntegrityManifest, prerenderManifest, isDraftMode, resolvedPathname, revalidateOnlyGenerated, routerServerContext, nextConfig, parsedUrl, interceptionRoutePatterns } = prepareResult; + const normalizedSrcPage = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$app$2d$paths$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["normalizeAppPath"])(srcPage); + let { isOnDemandRevalidate } = prepareResult; + // We use the resolvedPathname instead of the parsedUrl.pathname because it + // is not rewritten as resolvedPathname is. This will ensure that the correct + // prerender info is used instead of using the original pathname as the + // source. If however PPR is enabled and cacheComponents is disabled, we + // treat the pathname as dynamic. Currently, there's a bug in the PPR + // implementation that incorrectly leaves %%drp placeholders in the output of + // parallel routes. This is addressed with cacheComponents. + const prerenderInfo = nextConfig.experimental.ppr && !nextConfig.cacheComponents && (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$interception$2d$routes$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isInterceptionRouteAppPath"])(resolvedPathname) ? null : routeModule.match(resolvedPathname, prerenderManifest); + const isPrerendered = !!prerenderManifest.routes[resolvedPathname]; + const userAgent = req.headers['user-agent'] || ''; + const botType = (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["getBotType"])(userAgent); + const isHtmlBot = (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$esm$2f$server$2f$lib$2f$streaming$2d$metadata$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["isHtmlBotRequest"])(req); + /** + * If true, this indicates that the request being made is for an app + * prefetch request. + */ const isPrefetchRSCRequest = (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'isPrefetchRSCRequest') ?? req.headers[__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_ROUTER_PREFETCH_HEADER"]] === '1' // exclude runtime prefetches, which use '2' + ; + // NOTE: Don't delete headers[RSC] yet, it still needs to be used in renderToHTML later + const isRSCRequest = (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'isRSCRequest') ?? Boolean(req.headers[__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RSC_HEADER"]]); + const isPossibleServerAction = (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$esm$2f$server$2f$lib$2f$server$2d$action$2d$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getIsPossibleServerAction"])(req); + /** + * If the route being rendered is an app page, and the ppr feature has been + * enabled, then the given route _could_ support PPR. + */ const couldSupportPPR = (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$esm$2f$server$2f$lib$2f$experimental$2f$ppr$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["checkIsAppPPREnabled"])(nextConfig.experimental.ppr); + // When enabled, this will allow the use of the `?__nextppronly` query to + // enable debugging of the static shell. + const hasDebugStaticShellQuery = ("TURBOPACK compile-time value", false) === '1' && typeof query.__nextppronly !== 'undefined' && couldSupportPPR; + // When enabled, this will allow the use of the `?__nextppronly` query + // to enable debugging of the fallback shell. + const hasDebugFallbackShellQuery = hasDebugStaticShellQuery && query.__nextppronly === 'fallback'; + // This page supports PPR if it is marked as being `PARTIALLY_STATIC` in the + // prerender manifest and this is an app page. + const isRoutePPREnabled = couldSupportPPR && (((_this = prerenderManifest.routes[normalizedSrcPage] ?? prerenderManifest.dynamicRoutes[normalizedSrcPage]) == null ? void 0 : _this.renderingMode) === 'PARTIALLY_STATIC' || // Ideally we'd want to check the appConfig to see if this page has PPR + // enabled or not, but that would require plumbing the appConfig through + // to the server during development. We assume that the page supports it + // but only during development. + hasDebugStaticShellQuery && (routeModule.isDev === true || (routerServerContext == null ? void 0 : routerServerContext.experimentalTestProxy) === true)); + const isDebugStaticShell = hasDebugStaticShellQuery && isRoutePPREnabled; + // We should enable debugging dynamic accesses when the static shell + // debugging has been enabled and we're also in development mode. + const isDebugDynamicAccesses = isDebugStaticShell && routeModule.isDev === true; + const isDebugFallbackShell = hasDebugFallbackShellQuery && isRoutePPREnabled; + // If we're in minimal mode, then try to get the postponed information from + // the request metadata. If available, use it for resuming the postponed + // render. + const minimalPostponed = isRoutePPREnabled ? (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'postponed') : undefined; + // If PPR is enabled, and this is a RSC request (but not a prefetch), then + // we can use this fact to only generate the flight data for the request + // because we can't cache the HTML (as it's also dynamic). + let isDynamicRSCRequest = isRoutePPREnabled && isRSCRequest && !isPrefetchRSCRequest; + // During a PPR revalidation, the RSC request is not dynamic if we do not have the postponed data. + // We only attach the postponed data during a resume. If there's no postponed data, then it must be a revalidation. + // This is to ensure that we don't bypass the cache during a revalidation. + if (isMinimalMode) { + isDynamicRSCRequest = isDynamicRSCRequest && !!minimalPostponed; + } + // Need to read this before it's stripped by stripFlightHeaders. We don't + // need to transfer it to the request meta because it's only read + // within this function; the static segment data should have already been + // generated, so we will always either return a static response or a 404. + const segmentPrefetchHeader = (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'segmentPrefetchRSCRequest'); + // TODO: investigate existing bug with shouldServeStreamingMetadata always + // being true for a revalidate due to modifying the base-server this.renderOpts + // when fixing this to correct logic it causes hydration issue since we set + // serveStreamingMetadata to true during export + const serveStreamingMetadata = isHtmlBot && isRoutePPREnabled ? false : !userAgent ? true : (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$esm$2f$server$2f$lib$2f$streaming$2d$metadata$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["shouldServeStreamingMetadata"])(userAgent, nextConfig.htmlLimitedBots); + const isSSG = Boolean((prerenderInfo || isPrerendered || prerenderManifest.routes[normalizedSrcPage]) && // If this is a html bot request and PPR is enabled, then we don't want + // to serve a static response. + !(isHtmlBot && isRoutePPREnabled)); + // When a page supports cacheComponents, we can support RDC for Navigations + const supportsRDCForNavigations = isRoutePPREnabled && nextConfig.cacheComponents === true; + // In development, we always want to generate dynamic HTML. + const supportsDynamicResponse = // a data request, in which case we only produce static HTML. + routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports + // dynamic HTML. + !isSSG || // If this request has provided postponed data, it supports dynamic + // HTML. + typeof minimalPostponed === 'string' || // If this handler supports onCacheEntryV2, then we can only support + // dynamic responses if it's a dynamic RSC request and not in minimal mode. If it + // doesn't support it we must fallback to the default behavior. + (supportsRDCForNavigations && (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'onCacheEntryV2') ? // RSC request, we'll pass the minimal postponed data to the render + // which will trigger the `supportsDynamicResponse` to be true. + isDynamicRSCRequest && !isMinimalMode : isDynamicRSCRequest); + // When html bots request PPR page, perform the full dynamic rendering. + const shouldWaitOnAllReady = isHtmlBot && isRoutePPREnabled; + let ssgCacheKey = null; + if (!isDraftMode && isSSG && !supportsDynamicResponse && !isPossibleServerAction && !minimalPostponed && !isDynamicRSCRequest) { + ssgCacheKey = resolvedPathname; + } + // the staticPathKey differs from ssgCacheKey since + // ssgCacheKey is null in dev since we're always in "dynamic" + // mode in dev to bypass the cache, but we still need to honor + // dynamicParams = false in dev mode + let staticPathKey = ssgCacheKey; + if (!staticPathKey && routeModule.isDev) { + staticPathKey = resolvedPathname; + } + // If this is a request for an app path that should be statically generated + // and we aren't in the edge runtime, strip the flight headers so it will + // generate the static response. + if (!routeModule.isDev && !isDraftMode && isSSG && isRSCRequest && !isDynamicRSCRequest) { + (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$esm$2f$server$2f$app$2d$render$2f$strip$2d$flight$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["stripFlightHeaders"])(req.headers); + } + const ComponentMod = { + ...__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__, + tree, + GlobalError: __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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29$__["default"], + handler, + routeModule, + __next_app__ + }; + // Before rendering (which initializes component tree modules), we have to + // set the reference manifests to our global store so Server Action's + // encryption util can access to them at the top level of the page module. + if (serverActionsManifest && clientReferenceManifest) { + (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$esm$2f$server$2f$app$2d$render$2f$encryption$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["setReferenceManifestsSingleton"])({ + page: srcPage, + clientReferenceManifest, + serverActionsManifest, + serverModuleMap: (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$esm$2f$server$2f$app$2d$render$2f$action$2d$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["createServerModuleMap"])({ + serverActionsManifest + }) + }); + } + const method = req.method || 'GET'; + const tracer = (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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getTracer"])(); + const activeSpan = tracer.getActiveScopeSpan(); + const render404 = async ()=>{ + // TODO: should route-module itself handle rendering the 404 + if (routerServerContext == null ? void 0 : routerServerContext.render404) { + await routerServerContext.render404(req, res, parsedUrl, false); + } else { + res.end('This page could not be found'); + } + return null; + }; + try { + const varyHeader = routeModule.getVaryHeader(resolvedPathname, interceptionRoutePatterns); + res.setHeader('Vary', varyHeader); + const invokeRouteModule = async (span, context)=>{ + const nextReq = new __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$esm$2f$server$2f$base$2d$http$2f$node$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NodeNextRequest"](req); + const nextRes = new __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$esm$2f$server$2f$base$2d$http$2f$node$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NodeNextResponse"](res); + return routeModule.render(nextReq, nextRes, context).finally(()=>{ + if (!span) return; + span.setAttributes({ + 'http.status_code': res.statusCode, + 'next.rsc': false + }); + const rootSpanAttributes = tracer.getRootSpanAttributes(); + // We were unable to get attributes, probably OTEL is not enabled + if (!rootSpanAttributes) { + return; + } + if (rootSpanAttributes.get('next.span_type') !== __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$esm$2f$server$2f$lib$2f$trace$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["BaseServerSpan"].handleRequest) { + console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`); + return; + } + const route = rootSpanAttributes.get('next.route'); + if (route) { + const name = `${method} ${route}`; + span.setAttributes({ + 'next.route': route, + 'http.route': route, + 'next.span_name': name + }); + span.updateName(name); + } else { + span.updateName(`${method} ${srcPage}`); + } + }); + }; + const incrementalCache = (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'incrementalCache'); + const doRender = async ({ span, postponed, fallbackRouteParams, forceStaticRender })=>{ + const context = { + query, + params, + page: normalizedSrcPage, + sharedContext: { + buildId + }, + serverComponentsHmrCache: (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'serverComponentsHmrCache'), + fallbackRouteParams, + renderOpts: { + App: ()=>null, + Document: ()=>null, + pageConfig: {}, + ComponentMod, + Component: (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$esm$2f$server$2f$app$2d$render$2f$interop$2d$default$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["interopDefault"])(ComponentMod), + params, + routeModule, + page: srcPage, + postponed, + shouldWaitOnAllReady, + serveStreamingMetadata, + supportsDynamicResponse: typeof postponed === 'string' || supportsDynamicResponse, + buildManifest, + nextFontManifest, + reactLoadableManifest, + subresourceIntegrityManifest, + serverActionsManifest, + clientReferenceManifest, + setCacheStatus: routerServerContext == null ? void 0 : routerServerContext.setCacheStatus, + setIsrStatus: routerServerContext == null ? void 0 : routerServerContext.setIsrStatus, + setReactDebugChannel: routerServerContext == null ? void 0 : routerServerContext.setReactDebugChannel, + dir: ("TURBOPACK compile-time truthy", 1) ? require('path').join(/* turbopackIgnore: true */ process.cwd(), routeModule.relativeProjectDir) : "TURBOPACK unreachable", + isDraftMode, + botType, + isOnDemandRevalidate, + isPossibleServerAction, + assetPrefix: nextConfig.assetPrefix, + nextConfigOutput: nextConfig.output, + crossOrigin: nextConfig.crossOrigin, + trailingSlash: nextConfig.trailingSlash, + images: nextConfig.images, + previewProps: prerenderManifest.preview, + deploymentId: nextConfig.deploymentId, + enableTainting: nextConfig.experimental.taint, + htmlLimitedBots: nextConfig.htmlLimitedBots, + reactMaxHeadersLength: nextConfig.reactMaxHeadersLength, + multiZoneDraftMode, + incrementalCache, + cacheLifeProfiles: nextConfig.cacheLife, + basePath: nextConfig.basePath, + serverActions: nextConfig.experimental.serverActions, + ...isDebugStaticShell || isDebugDynamicAccesses || isDebugFallbackShell ? { + nextExport: true, + supportsDynamicResponse: false, + isStaticGeneration: true, + isDebugDynamicAccesses: isDebugDynamicAccesses + } : {}, + cacheComponents: Boolean(nextConfig.cacheComponents), + experimental: { + isRoutePPREnabled, + expireTime: nextConfig.expireTime, + staleTimes: nextConfig.experimental.staleTimes, + dynamicOnHover: Boolean(nextConfig.experimental.dynamicOnHover), + inlineCss: Boolean(nextConfig.experimental.inlineCss), + authInterrupts: Boolean(nextConfig.experimental.authInterrupts), + clientTraceMetadata: nextConfig.experimental.clientTraceMetadata || [], + clientParamParsingOrigins: nextConfig.experimental.clientParamParsingOrigins + }, + waitUntil: ctx.waitUntil, + onClose: (cb)=>{ + res.on('close', cb); + }, + onAfterTaskError: ()=>{}, + onInstrumentationRequestError: (error, _request, errorContext)=>routeModule.onRequestError(req, error, errorContext, routerServerContext), + err: (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'invokeError'), + dev: routeModule.isDev + } + }; + if (isDebugStaticShell || isDebugDynamicAccesses) { + context.renderOpts.nextExport = true; + context.renderOpts.supportsDynamicResponse = false; + context.renderOpts.isDebugDynamicAccesses = isDebugDynamicAccesses; + } + // When we're revalidating in the background, we should not allow dynamic + // responses. + if (forceStaticRender) { + context.renderOpts.supportsDynamicResponse = false; + } + const result = await invokeRouteModule(span, context); + const { metadata } = result; + const { cacheControl, headers = {}, fetchTags: cacheTags, fetchMetrics } = metadata; + if (cacheTags) { + headers[__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"]] = cacheTags; + } + // Pull any fetch metrics from the render onto the request. + ; + req.fetchMetrics = fetchMetrics; + // we don't throw static to dynamic errors in dev as isSSG + // is a best guess in dev since we don't have the prerender pass + // to know whether the path is actually static or not + if (isSSG && (cacheControl == null ? void 0 : cacheControl.revalidate) === 0 && !routeModule.isDev && !isRoutePPREnabled) { + const staticBailoutInfo = metadata.staticBailoutInfo; + const err = Object.defineProperty(new Error(`Page changed from static to dynamic at runtime ${resolvedPathname}${(staticBailoutInfo == null ? void 0 : staticBailoutInfo.description) ? `, reason: ${staticBailoutInfo.description}` : ``}` + `\nsee more here https://nextjs.org/docs/messages/app-static-to-dynamic-error`), "__NEXT_ERROR_CODE", { + value: "E132", + enumerable: false, + configurable: true + }); + if (staticBailoutInfo == null ? void 0 : staticBailoutInfo.stack) { + const stack = staticBailoutInfo.stack; + err.stack = err.message + stack.substring(stack.indexOf('\n')); + } + throw err; + } + return { + value: { + kind: __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].APP_PAGE, + html: result, + headers, + rscData: metadata.flightData, + postponed: metadata.postponed, + status: metadata.statusCode, + segmentData: metadata.segmentData + }, + cacheControl + }; + }; + const responseGenerator = async ({ hasResolved, previousCacheEntry: previousIncrementalCacheEntry, isRevalidating, span, forceStaticRender = false })=>{ + const isProduction = routeModule.isDev === false; + const didRespond = hasResolved || res.writableEnded; + // skip on-demand revalidate if cache is not present and + // revalidate-if-generated is set + if (isOnDemandRevalidate && revalidateOnlyGenerated && !previousIncrementalCacheEntry && !isMinimalMode) { + if (routerServerContext == null ? void 0 : routerServerContext.render404) { + await routerServerContext.render404(req, res); + } else { + res.statusCode = 404; + res.end('This page could not be found'); + } + return null; + } + let fallbackMode; + if (prerenderInfo) { + fallbackMode = (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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["parseFallbackField"])(prerenderInfo.fallback); + } + // When serving a HTML bot request, we want to serve a blocking render and + // not the prerendered page. This ensures that the correct content is served + // to the bot in the head. + if (fallbackMode === __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].PRERENDER && (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$esm$2f$shared$2f$lib$2f$router$2f$utils$2f$is$2d$bot$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["isBot"])(userAgent)) { + if (!isRoutePPREnabled || isHtmlBot) { + fallbackMode = __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].BLOCKING_STATIC_RENDER; + } + } + if ((previousIncrementalCacheEntry == null ? void 0 : previousIncrementalCacheEntry.isStale) === -1) { + isOnDemandRevalidate = true; + } + // TODO: adapt for PPR + // only allow on-demand revalidate for fallback: true/blocking + // or for prerendered fallback: false paths + if (isOnDemandRevalidate && (fallbackMode !== __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].NOT_FOUND || previousIncrementalCacheEntry)) { + fallbackMode = __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].BLOCKING_STATIC_RENDER; + } + if (!isMinimalMode && fallbackMode !== __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].BLOCKING_STATIC_RENDER && staticPathKey && !didRespond && !isDraftMode && pageIsDynamic && (isProduction || !isPrerendered)) { + // if the page has dynamicParams: false and this pathname wasn't + // prerendered trigger the no fallback handling + if (// getStaticPaths. + (isProduction || prerenderInfo) && // When fallback isn't present, abort this render so we 404 + fallbackMode === __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$esm$2f$lib$2f$fallback$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["FallbackMode"].NOT_FOUND) { + if (nextConfig.experimental.adapterPath) { + return await render404(); + } + throw new __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js$2c$__cjs$29$__["NoFallbackError"](); + } + // When cacheComponents is enabled, we can use the fallback + // response if the request is not a dynamic RSC request because the + // RSC data when this feature flag is enabled does not contain any + // param references. Without this feature flag enabled, the RSC data + // contains param references, and therefore we can't use the fallback. + if (isRoutePPREnabled && (nextConfig.cacheComponents ? !isDynamicRSCRequest : !isRSCRequest)) { + const cacheKey = isProduction && typeof (prerenderInfo == null ? void 0 : prerenderInfo.fallback) === 'string' ? prerenderInfo.fallback : normalizedSrcPage; + const fallbackRouteParams = // can use the manifest fallback route params. + isProduction && (prerenderInfo == null ? void 0 : prerenderInfo.fallbackRouteParams) ? (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$esm$2f$server$2f$request$2f$fallback$2d$params$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["createOpaqueFallbackRouteParams"])(prerenderInfo.fallbackRouteParams) : isDebugFallbackShell ? (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$esm$2f$server$2f$request$2f$fallback$2d$params$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getFallbackRouteParams"])(normalizedSrcPage, routeModule) : null; + // We use the response cache here to handle the revalidation and + // management of the fallback shell. + const fallbackResponse = await routeModule.handleResponse({ + cacheKey, + req, + nextConfig, + routeKind: __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["RouteKind"].APP_PAGE, + isFallback: true, + prerenderManifest, + isRoutePPREnabled, + responseGenerator: async ()=>doRender({ + span, + // We pass `undefined` as rendering a fallback isn't resumed + // here. + postponed: undefined, + fallbackRouteParams, + forceStaticRender: false + }), + waitUntil: ctx.waitUntil, + isMinimalMode + }); + // If the fallback response was set to null, then we should return null. + if (fallbackResponse === null) return null; + // Otherwise, if we did get a fallback response, we should return it. + if (fallbackResponse) { + // Remove the cache control from the response to prevent it from being + // used in the surrounding cache. + delete fallbackResponse.cacheControl; + return fallbackResponse; + } + } + } + // Only requests that aren't revalidating can be resumed. If we have the + // minimal postponed data, then we should resume the render with it. + let postponed = !isOnDemandRevalidate && !isRevalidating && minimalPostponed ? minimalPostponed : undefined; + // If this is a dynamic RSC request, we should use the postponed data from + // the static render (if available). This ensures that we can utilize the + // resume data cache (RDC) from the static render to ensure that the data + // is consistent between the static and dynamic renders. + if (supportsRDCForNavigations && ("TURBOPACK compile-time value", "nodejs") !== 'edge' && !isMinimalMode && incrementalCache && isDynamicRSCRequest && // We don't typically trigger an on-demand revalidation for dynamic RSC + // requests, as we're typically revalidating the page in the background + // instead. However, if the cache entry is stale, we should trigger a + // background revalidation on dynamic RSC requests. This prevents us + // from entering an infinite loop of revalidations. + !forceStaticRender) { + const incrementalCacheEntry = await incrementalCache.get(resolvedPathname, { + kind: __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["IncrementalCacheKind"].APP_PAGE, + isRoutePPREnabled: true, + isFallback: false + }); + // If the cache entry is found, we should use the postponed data from + // the cache. + if (incrementalCacheEntry && incrementalCacheEntry.value && incrementalCacheEntry.value.kind === __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].APP_PAGE) { + // CRITICAL: we're assigning the postponed data from the cache entry + // here as we're using the RDC to resume the render. + postponed = incrementalCacheEntry.value.postponed; + // If the cache entry is stale, we should trigger a background + // revalidation so that subsequent requests will get a fresh response. + if (incrementalCacheEntry && // We want to trigger this flow if the cache entry is stale and if + // the requested revalidation flow is either foreground or + // background. + (incrementalCacheEntry.isStale === -1 || incrementalCacheEntry.isStale === true)) { + // We want to schedule this on the next tick to ensure that the + // render is not blocked on it. + (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$esm$2f$lib$2f$scheduler$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["scheduleOnNextTick"])(async ()=>{ + const responseCache = routeModule.getResponseCache(req); + try { + await responseCache.revalidate(resolvedPathname, incrementalCache, isRoutePPREnabled, false, (c)=>responseGenerator({ + ...c, + // CRITICAL: we need to set this to true as we're + // revalidating in the background and typically this dynamic + // RSC request is not treated as static. + forceStaticRender: true + }), // previous cache entry here (which is stale) will switch on + // isOnDemandRevalidate and break the prerendering. + null, hasResolved, ctx.waitUntil); + } catch (err) { + console.error('Error revalidating the page in the background', err); + } + }); + } + } + } + // When we're in minimal mode, if we're trying to debug the static shell, + // we should just return nothing instead of resuming the dynamic render. + if ((isDebugStaticShell || isDebugDynamicAccesses) && typeof postponed !== 'undefined') { + return { + cacheControl: { + revalidate: 1, + expire: undefined + }, + value: { + kind: __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].PAGES, + html: __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"].EMPTY, + pageData: {}, + headers: undefined, + status: undefined + } + }; + } + const fallbackRouteParams = // can use the manifest fallback route params if we need to render the + // fallback shell. + isProduction && (prerenderInfo == null ? void 0 : prerenderInfo.fallbackRouteParams) && (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'renderFallbackShell') ? (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$esm$2f$server$2f$request$2f$fallback$2d$params$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["createOpaqueFallbackRouteParams"])(prerenderInfo.fallbackRouteParams) : isDebugFallbackShell ? (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$esm$2f$server$2f$request$2f$fallback$2d$params$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getFallbackRouteParams"])(normalizedSrcPage, routeModule) : null; + // Perform the render. + return doRender({ + span, + postponed, + fallbackRouteParams, + forceStaticRender + }); + }; + const handleResponse = async (span)=>{ + var _cacheEntry_value, _cachedData_headers; + const cacheEntry = await routeModule.handleResponse({ + cacheKey: ssgCacheKey, + responseGenerator: (c)=>responseGenerator({ + span, + ...c + }), + routeKind: __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$esm$2f$server$2f$route$2d$kind$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["RouteKind"].APP_PAGE, + isOnDemandRevalidate, + isRoutePPREnabled, + req, + nextConfig, + prerenderManifest, + waitUntil: ctx.waitUntil, + isMinimalMode + }); + if (isDraftMode) { + res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate'); + } + // In dev, we should not cache pages for any reason. + if (routeModule.isDev) { + res.setHeader('Cache-Control', 'no-store, must-revalidate'); + } + if (!cacheEntry) { + if (ssgCacheKey) { + // A cache entry might not be generated if a response is written + // in `getInitialProps` or `getServerSideProps`, but those shouldn't + // have a cache key. If we do have a cache key but we don't end up + // with a cache entry, then either Next.js or the application has a + // bug that needs fixing. + throw Object.defineProperty(new Error('invariant: cache entry required but not generated'), "__NEXT_ERROR_CODE", { + value: "E62", + enumerable: false, + configurable: true + }); + } + return null; + } + if (((_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].APP_PAGE) { + var _cacheEntry_value1; + throw Object.defineProperty(new Error(`Invariant app-page handler received invalid cache entry ${(_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), "__NEXT_ERROR_CODE", { + value: "E707", + enumerable: false, + configurable: true + }); + } + const didPostpone = typeof cacheEntry.value.postponed === 'string'; + if (isSSG && // We don't want to send a cache header for requests that contain dynamic + // data. If this is a Dynamic RSC request or wasn't a Prefetch RSC + // request, then we should set the cache header. + !isDynamicRSCRequest && (!didPostpone || isPrefetchRSCRequest)) { + if (!isMinimalMode) { + // set x-nextjs-cache header to match the header + // we set for the image-optimizer + res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT'); + } + // Set a header used by the client router to signal the response is static + // and should respect the `static` cache staleTime value. + res.setHeader(__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_IS_PRERENDER_HEADER"], '1'); + } + const { value: cachedData } = cacheEntry; + // Coerce the cache control parameter from the render. + let cacheControl; + // If this is a resume request in minimal mode it is streamed with dynamic + // content and should not be cached. + if (minimalPostponed) { + cacheControl = { + revalidate: 0, + expire: undefined + }; + } else if (isDynamicRSCRequest) { + cacheControl = { + revalidate: 0, + expire: undefined + }; + } else if (!routeModule.isDev) { + // If this is a preview mode request, we shouldn't cache it + if (isDraftMode) { + cacheControl = { + revalidate: 0, + expire: undefined + }; + } else if (!isSSG) { + if (!res.getHeader('Cache-Control')) { + cacheControl = { + revalidate: 0, + expire: undefined + }; + } + } else if (cacheEntry.cacheControl) { + // If the cache entry has a cache control with a revalidate value that's + // a number, use it. + if (typeof cacheEntry.cacheControl.revalidate === 'number') { + var _cacheEntry_cacheControl; + if (cacheEntry.cacheControl.revalidate < 1) { + throw Object.defineProperty(new Error(`Invalid revalidate configuration provided: ${cacheEntry.cacheControl.revalidate} < 1`), "__NEXT_ERROR_CODE", { + value: "E22", + enumerable: false, + configurable: true + }); + } + cacheControl = { + revalidate: cacheEntry.cacheControl.revalidate, + expire: ((_cacheEntry_cacheControl = cacheEntry.cacheControl) == null ? void 0 : _cacheEntry_cacheControl.expire) ?? nextConfig.expireTime + }; + } else { + cacheControl = { + revalidate: __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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CACHE_ONE_YEAR"], + expire: undefined + }; + } + } + } + cacheEntry.cacheControl = cacheControl; + if (typeof segmentPrefetchHeader === 'string' && (cachedData == null ? void 0 : cachedData.kind) === __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].APP_PAGE && cachedData.segmentData) { + var _cachedData_headers1; + // This is a prefetch request issued by the client Segment Cache. These + // should never reach the application layer (lambda). We should either + // respond from the cache (HIT) or respond with 204 No Content (MISS). + // Set a header to indicate that PPR is enabled for this route. This + // lets the client distinguish between a regular cache miss and a cache + // miss due to PPR being disabled. In other contexts this header is used + // to indicate that the response contains dynamic data, but here we're + // only using it to indicate that the feature is enabled — the segment + // response itself contains whether the data is dynamic. + res.setHeader(__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_DID_POSTPONE_HEADER"], '2'); + // Add the cache tags header to the response if it exists and we're in + // minimal mode while rendering a static page. + const tags = (_cachedData_headers1 = cachedData.headers) == null ? void 0 : _cachedData_headers1[__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"]]; + if (isMinimalMode && isSSG && tags && typeof tags === 'string') { + res.setHeader(__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"], tags); + } + const matchedSegment = cachedData.segmentData.get(segmentPrefetchHeader); + if (matchedSegment !== undefined) { + // Cache hit + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"].fromStatic(matchedSegment, __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RSC_CONTENT_TYPE_HEADER"]), + cacheControl: cacheEntry.cacheControl + }); + } + // Cache miss. Either a cache entry for this route has not been generated + // (which technically should not be possible when PPR is enabled, because + // at a minimum there should always be a fallback entry) or there's no + // match for the requested segment. Respond with a 204 No Content. We + // don't bother to respond with 404, because these requests are only + // issued as part of a prefetch. + res.statusCode = 204; + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"].EMPTY, + cacheControl: cacheEntry.cacheControl + }); + } + // If there's a callback for `onCacheEntry`, call it with the cache entry + // and the revalidate options. If we support RDC for Navigations, we + // prefer the `onCacheEntryV2` callback. Once RDC for Navigations is the + // default, we can remove the fallback to `onCacheEntry` as + // `onCacheEntryV2` is now fully supported. + const onCacheEntry = supportsRDCForNavigations ? (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'onCacheEntryV2') ?? (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'onCacheEntry') : (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'onCacheEntry'); + if (onCacheEntry) { + const finished = await onCacheEntry(cacheEntry, { + url: (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$esm$2f$server$2f$request$2d$meta$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRequestMeta"])(req, 'initURL') ?? req.url + }); + if (finished) return null; + } + if (cachedData.headers) { + const headers = { + ...cachedData.headers + }; + if (!isMinimalMode || !isSSG) { + delete headers[__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"]]; + } + for (let [key, value] of Object.entries(headers)){ + if (typeof value === 'undefined') continue; + if (Array.isArray(value)) { + for (const v of value){ + res.appendHeader(key, v); + } + } else if (typeof value === 'number') { + value = value.toString(); + res.appendHeader(key, value); + } else { + res.appendHeader(key, value); + } + } + } + // Add the cache tags header to the response if it exists and we're in + // minimal mode while rendering a static page. + const tags = (_cachedData_headers = cachedData.headers) == null ? void 0 : _cachedData_headers[__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"]]; + if (isMinimalMode && isSSG && tags && typeof tags === 'string') { + res.setHeader(__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$esm$2f$lib$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_CACHE_TAGS_HEADER"], tags); + } + // If the request is a data request, then we shouldn't set the status code + // from the response because it should always be 200. This should be gated + // behind the experimental PPR flag. + if (cachedData.status && (!isRSCRequest || !isRoutePPREnabled)) { + res.statusCode = cachedData.status; + } + // Redirect information is encoded in RSC payload, so we don't need to use redirect status codes + if (!isMinimalMode && cachedData.status && __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$esm$2f$client$2f$components$2f$redirect$2d$status$2d$code$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RedirectStatusCode"][cachedData.status] && isRSCRequest) { + res.statusCode = 200; + } + // Mark that the request did postpone. + if (didPostpone && !isDynamicRSCRequest) { + res.setHeader(__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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["NEXT_DID_POSTPONE_HEADER"], '1'); + } + // we don't go through this block when preview mode is true + // as preview mode is a dynamic request (bypasses cache) and doesn't + // generate both HTML and payloads in the same request so continue to just + // return the generated payload + if (isRSCRequest && !isDraftMode) { + // If this is a dynamic RSC request, then stream the response. + if (typeof cachedData.rscData === 'undefined') { + // If the response is not an RSC response, then we can't serve it. + if (cachedData.html.contentType !== __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RSC_CONTENT_TYPE_HEADER"]) { + if (nextConfig.cacheComponents) { + res.statusCode = 404; + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"].EMPTY, + cacheControl: cacheEntry.cacheControl + }); + } else { + // Otherwise this case is not expected. + throw Object.defineProperty(new __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$esm$2f$shared$2f$lib$2f$invariant$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["InvariantError"](`Expected RSC response, got ${cachedData.html.contentType}`), "__NEXT_ERROR_CODE", { + value: "E789", + enumerable: false, + configurable: true + }); + } + } + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: cachedData.html, + cacheControl: cacheEntry.cacheControl + }); + } + // As this isn't a prefetch request, we should serve the static flight + // data. + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: __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$esm$2f$server$2f$render$2d$result$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"].fromStatic(cachedData.rscData, __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$esm$2f$client$2f$components$2f$app$2d$router$2d$headers$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["RSC_CONTENT_TYPE_HEADER"]), + cacheControl: cacheEntry.cacheControl + }); + } + // This is a request for HTML data. + const body = cachedData.html; + // If there's no postponed state, we should just serve the HTML. This + // should also be the case for a resume request because it's completed + // as a server render (rather than a static render). + if (!didPostpone || isMinimalMode || isRSCRequest) { + // If we're in test mode, we should add a sentinel chunk to the response + // that's between the static and dynamic parts so we can compare the + // chunks and add assertions. + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: body, + cacheControl: cacheEntry.cacheControl + }); + } + // If we're debugging the static shell or the dynamic API accesses, we + // should just serve the HTML without resuming the render. The returned + // HTML will be the static shell so all the Dynamic API's will be used + // during static generation. + if (isDebugStaticShell || isDebugDynamicAccesses) { + // Since we're not resuming the render, we need to at least add the + // closing body and html tags to create valid HTML. + body.push(new ReadableStream({ + start (controller) { + controller.enqueue(__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$esm$2f$server$2f$stream$2d$utils$2f$encoded$2d$tags$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["ENCODED_TAGS"].CLOSED.BODY_AND_HTML); + controller.close(); + } + })); + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: body, + cacheControl: { + revalidate: 0, + expire: undefined + } + }); + } + // If we're in test mode, we should add a sentinel chunk to the response + // that's between the static and dynamic parts so we can compare the + // chunks and add assertions. + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + // This request has postponed, so let's create a new transformer that the + // dynamic data can pipe to that will attach the dynamic data to the end + // of the response. + const transformer = new TransformStream(); + body.push(transformer.readable); + // Perform the render again, but this time, provide the postponed state. + // We don't await because we want the result to start streaming now, and + // we've already chained the transformer's readable to the render result. + doRender({ + span, + postponed: cachedData.postponed, + // This is a resume render, not a fallback render, so we don't need to + // set this. + fallbackRouteParams: null, + forceStaticRender: false + }).then(async (result)=>{ + var _result_value; + if (!result) { + throw Object.defineProperty(new Error('Invariant: expected a result to be returned'), "__NEXT_ERROR_CODE", { + value: "E463", + enumerable: false, + configurable: true + }); + } + if (((_result_value = result.value) == null ? void 0 : _result_value.kind) !== __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$esm$2f$server$2f$response$2d$cache$2f$types$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CachedRouteKind"].APP_PAGE) { + var _result_value1; + throw Object.defineProperty(new Error(`Invariant: expected a page response, got ${(_result_value1 = result.value) == null ? void 0 : _result_value1.kind}`), "__NEXT_ERROR_CODE", { + value: "E305", + enumerable: false, + configurable: true + }); + } + // Pipe the resume result to the transformer. + await result.value.html.pipeTo(transformer.writable); + }).catch((err)=>{ + // An error occurred during piping or preparing the render, abort + // the transformers writer so we can terminate the stream. + transformer.writable.abort(err).catch((e)=>{ + console.error("couldn't abort transformer", e); + }); + }); + return (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$esm$2f$server$2f$send$2d$payload$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["sendRenderResult"])({ + req, + res, + generateEtags: nextConfig.generateEtags, + poweredByHeader: nextConfig.poweredByHeader, + result: body, + // We don't want to cache the response if it has postponed data because + // the response being sent to the client it's dynamic parts are streamed + // to the client on the same request. + cacheControl: { + revalidate: 0, + expire: undefined + } + }); + }; + // TODO: activeSpan code path is for when wrapped by + // next-server can be removed when this is no longer used + if (activeSpan) { + await handleResponse(activeSpan); + } else { + return await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(__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$esm$2f$server$2f$lib$2f$trace$2f$constants$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["BaseServerSpan"].handleRequest, { + spanName: `${method} ${srcPage}`, + kind: __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$esm$2f$server$2f$lib$2f$trace$2f$tracer$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["SpanKind"].SERVER, + attributes: { + 'http.method': method, + 'http.target': req.url + } + }, handleResponse)); + } + } catch (err) { + if (!(err instanceof __TURBOPACK__imported__module__$5b$externals$5d2f$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js__$5b$external$5d$__$28$next$2f$dist$2f$shared$2f$lib$2f$no$2d$fallback$2d$error$2e$external$2e$js$2c$__cjs$29$__["NoFallbackError"])) { + await routeModule.onRequestError(req, err, { + routerKind: 'App Router', + routePath: srcPage, + routeType: 'render', + revalidateReason: (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$esm$2f$server$2f$instrumentation$2f$utils$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["getRevalidateReason"])({ + isStaticGeneration: isSSG, + isOnDemandRevalidate + }) + }, routerServerContext); + } + // rethrow so that we can handle serving error page + throw err; + } +} +// TODO: omit this from production builds, only test builds should include it +/** + * Creates a readable stream that emits a PPR boundary sentinel. + * + * @returns A readable stream that emits a PPR boundary sentinel. + */ function createPPRBoundarySentinel() { + return new ReadableStream({ + start (controller) { + controller.enqueue(new TextEncoder().encode('')); + controller.close(); + } + }); +} //# sourceMappingURL=app-page.js.map +}), +"[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/esm/build/templates/app-page.js?page=/relationship-test/page { GLOBAL_ERROR_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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "ClientPageRoot", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["ClientPageRoot"], + "ClientSegmentRoot", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["ClientSegmentRoot"], + "Fragment", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["Fragment"], + "GlobalError", + ()=>__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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29$__["default"], + "HTTPAccessFallbackBoundary", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["HTTPAccessFallbackBoundary"], + "LayoutRouter", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["LayoutRouter"], + "Postpone", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["Postpone"], + "RenderFromTemplateContext", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["RenderFromTemplateContext"], + "RootLayoutBoundary", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["RootLayoutBoundary"], + "SegmentViewNode", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["SegmentViewNode"], + "SegmentViewStateNode", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["SegmentViewStateNode"], + "__next_app__", + ()=>__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$esm$2f$build$2f$templates$2f$app$2d$page$2e$js$3f$page$3d2f$relationship$2d$test$2f$page__$7b$__GLOBAL_ERROR_MODULE__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_0__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$layout$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_1__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$loading$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_2__$3d3e$__$225b$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$components$2f$builtin$2f$not$2d$found$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_3__$3d3e$__$225b$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$components$2f$builtin$2f$forbidden$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_4__$3d3e$__$225b$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$components$2f$builtin$2f$unauthorized$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_5__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_6__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$2922$__$7d$__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["__next_app__"], + "actionAsyncStorage", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["actionAsyncStorage"], + "captureOwnerStack", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["captureOwnerStack"], + "collectSegmentData", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["collectSegmentData"], + "createElement", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createElement"], + "createMetadataComponents", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createMetadataComponents"], + "createPrerenderParamsForClientSegment", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createPrerenderParamsForClientSegment"], + "createPrerenderSearchParamsForClientPage", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createPrerenderSearchParamsForClientPage"], + "createServerParamsForServerSegment", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createServerParamsForServerSegment"], + "createServerSearchParamsForServerPage", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createServerSearchParamsForServerPage"], + "createTemporaryReferenceSet", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["createTemporaryReferenceSet"], + "decodeAction", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["decodeAction"], + "decodeFormState", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["decodeFormState"], + "decodeReply", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["decodeReply"], + "handler", + ()=>__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$esm$2f$build$2f$templates$2f$app$2d$page$2e$js$3f$page$3d2f$relationship$2d$test$2f$page__$7b$__GLOBAL_ERROR_MODULE__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_0__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$layout$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_1__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$loading$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_2__$3d3e$__$225b$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$components$2f$builtin$2f$not$2d$found$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_3__$3d3e$__$225b$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$components$2f$builtin$2f$forbidden$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_4__$3d3e$__$225b$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$components$2f$builtin$2f$unauthorized$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_5__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_6__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$2922$__$7d$__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["handler"], + "patchFetch", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["patchFetch"], + "preconnect", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["preconnect"], + "preloadFont", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["preloadFont"], + "preloadStyle", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["preloadStyle"], + "prerender", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["prerender"], + "renderToReadableStream", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["renderToReadableStream"], + "routeModule", + ()=>__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$esm$2f$build$2f$templates$2f$app$2d$page$2e$js$3f$page$3d2f$relationship$2d$test$2f$page__$7b$__GLOBAL_ERROR_MODULE__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_0__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$layout$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_1__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$loading$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_2__$3d3e$__$225b$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$components$2f$builtin$2f$not$2d$found$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_3__$3d3e$__$225b$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$components$2f$builtin$2f$forbidden$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_4__$3d3e$__$225b$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$components$2f$builtin$2f$unauthorized$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_5__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_6__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$2922$__$7d$__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__["routeModule"], + "serverHooks", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["serverHooks"], + "taintObjectReference", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["taintObjectReference"], + "workAsyncStorage", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["workAsyncStorage"], + "workUnitAsyncStorage", + ()=>__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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__["workUnitAsyncStorage"] +]); +var __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$esm$2f$build$2f$templates$2f$app$2d$page$2e$js$3f$page$3d2f$relationship$2d$test$2f$page__$7b$__GLOBAL_ERROR_MODULE__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_0__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$layout$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_1__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$loading$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_2__$3d3e$__$225b$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$components$2f$builtin$2f$not$2d$found$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_3__$3d3e$__$225b$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$components$2f$builtin$2f$forbidden$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_4__$3d3e$__$225b$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$components$2f$builtin$2f$unauthorized$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_5__$3d3e$__$225b$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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29222c$__MODULE_6__$3d3e$__$225b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$2922$__$7d$__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i('[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/esm/build/templates/app-page.js?page=/relationship-test/page { GLOBAL_ERROR_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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)", MODULE_0 => "[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)", MODULE_1 => "[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)", MODULE_2 => "[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/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)", MODULE_3 => "[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/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)", MODULE_4 => "[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/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)", MODULE_5 => "[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)", MODULE_6 => "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)" } [app-rsc] (ecmascript) '); +var __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$components$2f$builtin$2f$global$2d$error$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__Server__Component$29$__ = __turbopack_context__.i("[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/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)"); +var __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$esm$2f$server$2f$app$2d$render$2f$entry$2d$base$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$2c$__Next$2e$js__server__utility$29$__ = __turbopack_context__.i("[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/esm/server/app-render/entry-base.js [app-rsc] (ecmascript, Next.js server utility)"); +}), +]; + +//# sourceMappingURL=4e98a_next_dist_429ef594._.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js.map b/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js.map new file mode 100644 index 00000000..8175a195 --- /dev/null +++ b/.next/dev/server/chunks/ssr/4e98a_next_dist_429ef594._.js.map @@ -0,0 +1,50 @@ +{ + "version": 3, + "sources": [], + "sections": [ + {"offset": {"line": 3, "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/module.compiled.js"],"sourcesContent":["if (process.env.NEXT_RUNTIME === 'edge') {\n module.exports = require('next/dist/server/route-modules/app-page/module.js')\n} else {\n if (process.env.__NEXT_EXPERIMENTAL_REACT) {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.prod.js')\n }\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.dev.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.dev.js')\n }\n } else {\n if (process.env.TURBOPACK) {\n module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.prod.js')\n } else {\n module.exports = require('next/dist/compiled/next-server/app-page.runtime.prod.js')\n }\n }\n }\n}\n"],"names":["process","env","NEXT_RUNTIME","module","exports","require","__NEXT_EXPERIMENTAL_REACT","NODE_ENV","TURBOPACK"],"mappings":"AAAA,IAAIA,QAAQC,GAAG,CAACC,YAAY,KAAK,QAAQ;;KAElC;IACL,IAAIF,QAAQC,GAAG,CAACK,yBAAyB,EAAE;;SAcpC;QACL,IAAIN,QAAQC,GAAG,CAACM,QAAQ,KAAK,WAAe;YAC1C,IAAIP,QAAQC,GAAG,CAACO,SAAS,eAAE;gBACzBL,OAAOC,OAAO,GAAGC,QAAQ;YAC3B,OAAO;;QAGT,OAAO;;IAOT;AACF","ignoreList":[0]}}, + {"offset": {"line": 25, "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/instrumentation/utils.ts"],"sourcesContent":["export function getRevalidateReason(params: {\n isOnDemandRevalidate?: boolean\n isStaticGeneration?: boolean\n}): 'on-demand' | 'stale' | undefined {\n if (params.isOnDemandRevalidate) {\n return 'on-demand'\n }\n if (params.isStaticGeneration) {\n return 'stale'\n }\n return undefined\n}\n"],"names":["getRevalidateReason","params","isOnDemandRevalidate","isStaticGeneration","undefined"],"mappings":";;;;AAAO,SAASA,oBAAoBC,MAGnC;IACC,IAAIA,OAAOC,oBAAoB,EAAE;QAC/B,OAAO;IACT;IACA,IAAID,OAAOE,kBAAkB,EAAE;QAC7B,OAAO;IACT;IACA,OAAOC;AACT","ignoreList":[0]}}, + {"offset": {"line": 42, "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/app-render/interop-default.ts"],"sourcesContent":["/**\n * Interop between \"export default\" and \"module.exports\".\n */\nexport function interopDefault(mod: any) {\n return mod.default || mod\n}\n"],"names":["interopDefault","mod","default"],"mappings":"AAAA;;CAEC,GACD;;;;AAAO,SAASA,eAAeC,GAAQ;IACrC,OAAOA,IAAIC,OAAO,IAAID;AACxB","ignoreList":[0]}}, + {"offset": {"line": 55, "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/app-render/strip-flight-headers.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'node:http'\n\nimport { FLIGHT_HEADERS } from '../../client/components/app-router-headers'\n\n/**\n * Removes the flight headers from the request.\n *\n * @param req the request to strip the headers from\n */\nexport function stripFlightHeaders(headers: IncomingHttpHeaders) {\n for (const header of FLIGHT_HEADERS) {\n delete headers[header]\n }\n}\n"],"names":["FLIGHT_HEADERS","stripFlightHeaders","headers","header"],"mappings":";;;;AAEA,SAASA,cAAc,QAAQ,6CAA4C;;AAOpE,SAASC,mBAAmBC,OAA4B;IAC7D,KAAK,MAAMC,UAAUH,+XAAAA,CAAgB;QACnC,OAAOE,OAAO,CAACC,OAAO;IACxB;AACF","ignoreList":[0]}}, + {"offset": {"line": 70, "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/web/spec-extension/adapters/headers.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'http'\n\nimport { ReflectAdapter } from './reflect'\n\n/**\n * @internal\n */\nexport class ReadonlyHeadersError extends Error {\n constructor() {\n super(\n 'Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers'\n )\n }\n\n public static callable() {\n throw new ReadonlyHeadersError()\n }\n}\n\nexport type ReadonlyHeaders = Headers & {\n /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n append(...args: any[]): void\n /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n set(...args: any[]): void\n /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n delete(...args: any[]): void\n}\nexport class HeadersAdapter extends Headers {\n private readonly headers: IncomingHttpHeaders\n\n constructor(headers: IncomingHttpHeaders) {\n // We've already overridden the methods that would be called, so we're just\n // calling the super constructor to ensure that the instanceof check works.\n super()\n\n this.headers = new Proxy(headers, {\n get(target, prop, receiver) {\n // Because this is just an object, we expect that all \"get\" operations\n // are for properties. If it's a \"get\" for a symbol, we'll just return\n // the symbol.\n if (typeof prop === 'symbol') {\n return ReflectAdapter.get(target, prop, receiver)\n }\n\n const lowercased = prop.toLowerCase()\n\n // Let's find the original casing of the key. This assumes that there is\n // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n // headers object.\n const original = Object.keys(headers).find(\n (o) => o.toLowerCase() === lowercased\n )\n\n // If the original casing doesn't exist, return undefined.\n if (typeof original === 'undefined') return\n\n // If the original casing exists, return the value.\n return ReflectAdapter.get(target, original, receiver)\n },\n set(target, prop, value, receiver) {\n if (typeof prop === 'symbol') {\n return ReflectAdapter.set(target, prop, value, receiver)\n }\n\n const lowercased = prop.toLowerCase()\n\n // Let's find the original casing of the key. This assumes that there is\n // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n // headers object.\n const original = Object.keys(headers).find(\n (o) => o.toLowerCase() === lowercased\n )\n\n // If the original casing doesn't exist, use the prop as the key.\n return ReflectAdapter.set(target, original ?? prop, value, receiver)\n },\n has(target, prop) {\n if (typeof prop === 'symbol') return ReflectAdapter.has(target, prop)\n\n const lowercased = prop.toLowerCase()\n\n // Let's find the original casing of the key. This assumes that there is\n // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n // headers object.\n const original = Object.keys(headers).find(\n (o) => o.toLowerCase() === lowercased\n )\n\n // If the original casing doesn't exist, return false.\n if (typeof original === 'undefined') return false\n\n // If the original casing exists, return true.\n return ReflectAdapter.has(target, original)\n },\n deleteProperty(target, prop) {\n if (typeof prop === 'symbol')\n return ReflectAdapter.deleteProperty(target, prop)\n\n const lowercased = prop.toLowerCase()\n\n // Let's find the original casing of the key. This assumes that there is\n // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n // headers object.\n const original = Object.keys(headers).find(\n (o) => o.toLowerCase() === lowercased\n )\n\n // If the original casing doesn't exist, return true.\n if (typeof original === 'undefined') return true\n\n // If the original casing exists, delete the property.\n return ReflectAdapter.deleteProperty(target, original)\n },\n })\n }\n\n /**\n * Seals a Headers instance to prevent modification by throwing an error when\n * any mutating method is called.\n */\n public static seal(headers: Headers): ReadonlyHeaders {\n return new Proxy(headers, {\n get(target, prop, receiver) {\n switch (prop) {\n case 'append':\n case 'delete':\n case 'set':\n return ReadonlyHeadersError.callable\n default:\n return ReflectAdapter.get(target, prop, receiver)\n }\n },\n })\n }\n\n /**\n * Merges a header value into a string. This stores multiple values as an\n * array, so we need to merge them into a string.\n *\n * @param value a header value\n * @returns a merged header value (a string)\n */\n private merge(value: string | string[]): string {\n if (Array.isArray(value)) return value.join(', ')\n\n return value\n }\n\n /**\n * Creates a Headers instance from a plain object or a Headers instance.\n *\n * @param headers a plain object or a Headers instance\n * @returns a headers instance\n */\n public static from(headers: IncomingHttpHeaders | Headers): Headers {\n if (headers instanceof Headers) return headers\n\n return new HeadersAdapter(headers)\n }\n\n public append(name: string, value: string): void {\n const existing = this.headers[name]\n if (typeof existing === 'string') {\n this.headers[name] = [existing, value]\n } else if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n this.headers[name] = value\n }\n }\n\n public delete(name: string): void {\n delete this.headers[name]\n }\n\n public get(name: string): string | null {\n const value = this.headers[name]\n if (typeof value !== 'undefined') return this.merge(value)\n\n return null\n }\n\n public has(name: string): boolean {\n return typeof this.headers[name] !== 'undefined'\n }\n\n public set(name: string, value: string): void {\n this.headers[name] = value\n }\n\n public forEach(\n callbackfn: (value: string, name: string, parent: Headers) => void,\n thisArg?: any\n ): void {\n for (const [name, value] of this.entries()) {\n callbackfn.call(thisArg, value, name, this)\n }\n }\n\n public *entries(): HeadersIterator<[string, string]> {\n for (const key of Object.keys(this.headers)) {\n const name = key.toLowerCase()\n // We assert here that this is a string because we got it from the\n // Object.keys() call above.\n const value = this.get(name) as string\n\n yield [name, value] as [string, string]\n }\n }\n\n public *keys(): HeadersIterator {\n for (const key of Object.keys(this.headers)) {\n const name = key.toLowerCase()\n yield name\n }\n }\n\n public *values(): HeadersIterator {\n for (const key of Object.keys(this.headers)) {\n // We assert here that this is a string because we got it from the\n // Object.keys() call above.\n const value = this.get(key) as string\n\n yield value\n }\n }\n\n public [Symbol.iterator](): HeadersIterator<[string, string]> {\n return this.entries()\n }\n}\n"],"names":["ReflectAdapter","ReadonlyHeadersError","Error","constructor","callable","HeadersAdapter","Headers","headers","Proxy","get","target","prop","receiver","lowercased","toLowerCase","original","Object","keys","find","o","set","value","has","deleteProperty","seal","merge","Array","isArray","join","from","append","name","existing","push","delete","forEach","callbackfn","thisArg","entries","call","key","values","Symbol","iterator"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 248, "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/dist/compiled/cookie/index.js"],"sourcesContent":["(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var r=e;\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */r.parse=parse;r.serialize=serialize;var i=decodeURIComponent;var t=encodeURIComponent;var a=/; */;var n=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function parse(e,r){if(typeof e!==\"string\"){throw new TypeError(\"argument str must be a string\")}var t={};var n=r||{};var o=e.split(a);var s=n.decode||i;for(var p=0;p\nexport type NextApiRequestQuery = Partial<{ [key: string]: string | string[] }>\n\nexport type __ApiPreviewProps = {\n previewModeId: string\n previewModeEncryptionKey: string\n previewModeSigningKey: string\n}\n\nexport function wrapApiHandler any>(\n page: string,\n handler: T\n): T {\n return ((...args) => {\n getTracer().setRootSpanAttribute('next.route', page)\n // Call API route method\n return getTracer().trace(\n NodeSpan.runHandler,\n {\n spanName: `executing api route (pages) ${page}`,\n },\n () => handler(...args)\n )\n }) as T\n}\n\n/**\n *\n * @param res response object\n * @param statusCode `HTTP` status code of response\n */\nexport function sendStatusCode(\n res: NextApiResponse,\n statusCode: number\n): NextApiResponse {\n res.statusCode = statusCode\n return res\n}\n\n/**\n *\n * @param res response object\n * @param [statusOrUrl] `HTTP` status code of redirect\n * @param url URL of redirect\n */\nexport function redirect(\n res: NextApiResponse,\n statusOrUrl: string | number,\n url?: string\n): NextApiResponse {\n if (typeof statusOrUrl === 'string') {\n url = statusOrUrl\n statusOrUrl = 307\n }\n if (typeof statusOrUrl !== 'number' || typeof url !== 'string') {\n throw new Error(\n `Invalid redirect arguments. Please use a single argument URL, e.g. res.redirect('/destination') or use a status code and URL, e.g. res.redirect(307, '/destination').`\n )\n }\n res.writeHead(statusOrUrl, { Location: url })\n res.write(url)\n res.end()\n return res\n}\n\nexport function checkIsOnDemandRevalidate(\n req: Request | IncomingMessage | BaseNextRequest,\n previewProps: __ApiPreviewProps\n): {\n isOnDemandRevalidate: boolean\n revalidateOnlyGenerated: boolean\n} {\n const headers = HeadersAdapter.from(req.headers)\n\n const previewModeId = headers.get(PRERENDER_REVALIDATE_HEADER)\n const isOnDemandRevalidate = previewModeId === previewProps.previewModeId\n\n const revalidateOnlyGenerated = headers.has(\n PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER\n )\n\n return { isOnDemandRevalidate, revalidateOnlyGenerated }\n}\n\nexport const COOKIE_NAME_PRERENDER_BYPASS = `__prerender_bypass`\nexport const COOKIE_NAME_PRERENDER_DATA = `__next_preview_data`\n\nexport const RESPONSE_LIMIT_DEFAULT = 4 * 1024 * 1024\n\nexport const SYMBOL_PREVIEW_DATA = Symbol(COOKIE_NAME_PRERENDER_DATA)\nexport const SYMBOL_CLEARED_COOKIES = Symbol(COOKIE_NAME_PRERENDER_BYPASS)\n\nexport function clearPreviewData(\n res: NextApiResponse,\n options: {\n path?: string\n } = {}\n): NextApiResponse {\n if (SYMBOL_CLEARED_COOKIES in res) {\n return res\n }\n\n const { serialize } =\n require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n const previous = res.getHeader('Set-Cookie')\n res.setHeader(`Set-Cookie`, [\n ...(typeof previous === 'string'\n ? [previous]\n : Array.isArray(previous)\n ? previous\n : []),\n serialize(COOKIE_NAME_PRERENDER_BYPASS, '', {\n // To delete a cookie, set `expires` to a date in the past:\n // https://tools.ietf.org/html/rfc6265#section-4.1.1\n // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted.\n expires: new Date(0),\n httpOnly: true,\n sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n secure: process.env.NODE_ENV !== 'development',\n path: '/',\n ...(options.path !== undefined\n ? ({ path: options.path } as CookieSerializeOptions)\n : undefined),\n }),\n serialize(COOKIE_NAME_PRERENDER_DATA, '', {\n // To delete a cookie, set `expires` to a date in the past:\n // https://tools.ietf.org/html/rfc6265#section-4.1.1\n // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted.\n expires: new Date(0),\n httpOnly: true,\n sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n secure: process.env.NODE_ENV !== 'development',\n path: '/',\n ...(options.path !== undefined\n ? ({ path: options.path } as CookieSerializeOptions)\n : undefined),\n }),\n ])\n\n Object.defineProperty(res, SYMBOL_CLEARED_COOKIES, {\n value: true,\n enumerable: false,\n })\n return res\n}\n\n/**\n * Custom error class\n */\nexport class ApiError extends Error {\n readonly statusCode: number\n\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n\n/**\n * Sends error in `response`\n * @param res response object\n * @param statusCode of response\n * @param message of response\n */\nexport function sendError(\n res: NextApiResponse,\n statusCode: number,\n message: string\n): void {\n res.statusCode = statusCode\n res.statusMessage = message\n res.end(message)\n}\n\ninterface LazyProps {\n req: IncomingMessage\n}\n\n/**\n * Execute getter function only if its needed\n * @param LazyProps `req` and `params` for lazyProp\n * @param prop name of property\n * @param getter function to get data\n */\nexport function setLazyProp(\n { req }: LazyProps,\n prop: string,\n getter: () => T\n): void {\n const opts = { configurable: true, enumerable: true }\n const optsReset = { ...opts, writable: true }\n\n Object.defineProperty(req, prop, {\n ...opts,\n get: () => {\n const value = getter()\n // we set the property on the object to avoid recalculating it\n Object.defineProperty(req, prop, { ...optsReset, value })\n return value\n },\n set: (value) => {\n Object.defineProperty(req, prop, { ...optsReset, value })\n },\n })\n}\n"],"names":["HeadersAdapter","PRERENDER_REVALIDATE_HEADER","PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER","getTracer","NodeSpan","wrapApiHandler","page","handler","args","setRootSpanAttribute","trace","runHandler","spanName","sendStatusCode","res","statusCode","redirect","statusOrUrl","url","Error","writeHead","Location","write","end","checkIsOnDemandRevalidate","req","previewProps","headers","from","previewModeId","get","isOnDemandRevalidate","revalidateOnlyGenerated","has","COOKIE_NAME_PRERENDER_BYPASS","COOKIE_NAME_PRERENDER_DATA","RESPONSE_LIMIT_DEFAULT","SYMBOL_PREVIEW_DATA","Symbol","SYMBOL_CLEARED_COOKIES","clearPreviewData","options","serialize","require","previous","getHeader","setHeader","Array","isArray","expires","Date","httpOnly","sameSite","process","env","NODE_ENV","secure","path","undefined","Object","defineProperty","value","enumerable","ApiError","constructor","message","sendError","statusMessage","setLazyProp","prop","getter","opts","configurable","optsReset","writable","set"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 539, "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/api-utils/get-cookie-parser.ts"],"sourcesContent":["import type { NextApiRequestCookies } from '.'\n\n/**\n * Parse cookies from the `headers` of request\n * @param req request object\n */\n\nexport function getCookieParser(headers: {\n [key: string]: string | string[] | null | undefined\n}): () => NextApiRequestCookies {\n return function parseCookie(): NextApiRequestCookies {\n const { cookie } = headers\n\n if (!cookie) {\n return {}\n }\n\n const { parse: parseCookieFn } =\n require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n return parseCookieFn(Array.isArray(cookie) ? cookie.join('; ') : cookie)\n }\n}\n"],"names":["getCookieParser","headers","parseCookie","cookie","parse","parseCookieFn","require","Array","isArray","join"],"mappings":"AAEA;;;CAGC,GAED;;;;AAAO,SAASA,gBAAgBC,OAE/B;IACC,OAAO,SAASC;QACd,MAAM,EAAEC,MAAM,EAAE,GAAGF;QAEnB,IAAI,CAACE,QAAQ;YACX,OAAO,CAAC;QACV;QAEA,MAAM,EAAEC,OAAOC,aAAa,EAAE,GAC5BC,QAAQ;QACV,OAAOD,cAAcE,MAAMC,OAAO,CAACL,UAAUA,OAAOM,IAAI,CAAC,QAAQN;IACnE;AACF","ignoreList":[0]}}, + {"offset": {"line": 560, "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/base-http/index.ts"],"sourcesContent":["import type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'http'\nimport type { I18NConfig } from '../config-shared'\n\nimport { RedirectStatusCode } from '../../client/components/redirect-status-code'\nimport type { NextApiRequestCookies } from '../api-utils'\nimport { getCookieParser } from '../api-utils/get-cookie-parser'\n\nexport interface BaseNextRequestConfig {\n basePath: string | undefined\n i18n?: I18NConfig\n trailingSlash?: boolean | undefined\n}\n\nexport type FetchMetric = {\n url: string\n idx: number\n end: number\n start: number\n method: string\n status: number\n cacheReason: string\n cacheStatus: 'hit' | 'miss' | 'skip' | 'hmr'\n cacheWarning?: string\n}\n\nexport type FetchMetrics = Array\n\nexport abstract class BaseNextRequest {\n protected _cookies: NextApiRequestCookies | undefined\n public abstract headers: IncomingHttpHeaders\n public abstract fetchMetrics: FetchMetric[] | undefined\n\n constructor(\n public method: string,\n public url: string,\n public body: Body\n ) {}\n\n // Utils implemented using the abstract methods above\n\n public get cookies() {\n if (this._cookies) return this._cookies\n return (this._cookies = getCookieParser(this.headers)())\n }\n}\n\nexport abstract class BaseNextResponse {\n abstract statusCode: number | undefined\n abstract statusMessage: string | undefined\n abstract get sent(): boolean\n\n constructor(public destination: Destination) {}\n\n /**\n * Sets a value for the header overwriting existing values\n */\n abstract setHeader(name: string, value: string | string[]): this\n\n /**\n * Removes a header\n */\n abstract removeHeader(name: string): this\n\n /**\n * Appends value for the given header name\n */\n abstract appendHeader(name: string, value: string): this\n\n /**\n * Get all values for a header as an array or undefined if no value is present\n */\n abstract getHeaderValues(name: string): string[] | undefined\n\n abstract hasHeader(name: string): boolean\n\n /**\n * Get values for a header concatenated using `,` or undefined if no value is present\n */\n abstract getHeader(name: string): string | undefined\n\n abstract getHeaders(): OutgoingHttpHeaders\n\n abstract body(value: string): this\n\n abstract send(): void\n\n abstract onClose(callback: () => void): void\n\n // Utils implemented using the abstract methods above\n\n public redirect(destination: string, statusCode: number) {\n this.setHeader('Location', destination)\n this.statusCode = statusCode\n\n // Since IE11 doesn't support the 308 header add backwards\n // compatibility using refresh header\n if (statusCode === RedirectStatusCode.PermanentRedirect) {\n this.setHeader('Refresh', `0;url=${destination}`)\n }\n\n return this\n }\n}\n"],"names":["RedirectStatusCode","getCookieParser","BaseNextRequest","constructor","method","url","body","cookies","_cookies","headers","BaseNextResponse","destination","redirect","statusCode","setHeader","PermanentRedirect"],"mappings":";;;;;;AAGA,SAASA,kBAAkB,QAAQ,+CAA8C;AAEjF,SAASC,eAAe,QAAQ,iCAAgC;;;AAsBzD,MAAeC;IAKpBC,YACSC,MAAc,EACdC,GAAW,EACXC,IAAU,CACjB;aAHOF,MAAAA,GAAAA;aACAC,GAAAA,GAAAA;aACAC,IAAAA,GAAAA;IACN;IAEH,qDAAqD;IAErD,IAAWC,UAAU;QACnB,IAAI,IAAI,CAACC,QAAQ,EAAE,OAAO,IAAI,CAACA,QAAQ;QACvC,OAAQ,IAAI,CAACA,QAAQ,OAAGP,iYAAAA,EAAgB,IAAI,CAACQ,OAAO;IACtD;AACF;AAEO,MAAeC;IAKpBP,YAAmBQ,WAAwB,CAAE;aAA1BA,WAAAA,GAAAA;IAA2B;IAqC9C,qDAAqD;IAE9CC,SAASD,WAAmB,EAAEE,UAAkB,EAAE;QACvD,IAAI,CAACC,SAAS,CAAC,YAAYH;QAC3B,IAAI,CAACE,UAAU,GAAGA;QAElB,0DAA0D;QAC1D,qCAAqC;QACrC,IAAIA,eAAeb,qYAAAA,CAAmBe,iBAAiB,EAAE;YACvD,IAAI,CAACD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAEH,aAAa;QAClD;QAEA,OAAO,IAAI;IACb;AACF","ignoreList":[0]}}, + {"offset": {"line": 602, "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/base-http/node.ts"],"sourcesContent":["import type { ServerResponse, IncomingMessage } from 'http'\nimport type { Writable, Readable } from 'stream'\n\nimport { SYMBOL_CLEARED_COOKIES } from '../api-utils'\nimport type { NextApiRequestCookies } from '../api-utils'\n\nimport { NEXT_REQUEST_META } from '../request-meta'\nimport type { RequestMeta } from '../request-meta'\n\nimport { BaseNextRequest, BaseNextResponse, type FetchMetric } from './index'\nimport type { OutgoingHttpHeaders } from 'node:http'\n\ntype Req = IncomingMessage & {\n [NEXT_REQUEST_META]?: RequestMeta\n cookies?: NextApiRequestCookies\n fetchMetrics?: FetchMetric[]\n}\n\nexport class NodeNextRequest extends BaseNextRequest {\n public headers = this._req.headers\n public fetchMetrics: FetchMetric[] | undefined = this._req?.fetchMetrics;\n\n [NEXT_REQUEST_META]: RequestMeta = this._req[NEXT_REQUEST_META] || {}\n\n constructor(private _req: Req) {\n super(_req.method!.toUpperCase(), _req.url!, _req)\n }\n\n get originalRequest() {\n // Need to mimic these changes to the original req object for places where we use it:\n // render.tsx, api/ssg requests\n this._req[NEXT_REQUEST_META] = this[NEXT_REQUEST_META]\n this._req.url = this.url\n this._req.cookies = this.cookies\n return this._req\n }\n\n set originalRequest(value: Req) {\n this._req = value\n }\n\n private streaming = false\n\n /**\n * Returns the request body as a Web Readable Stream. The body here can only\n * be read once as the body will start flowing as soon as the data handler\n * is attached.\n *\n * @internal\n */\n public stream() {\n if (this.streaming) {\n throw new Error(\n 'Invariant: NodeNextRequest.stream() can only be called once'\n )\n }\n this.streaming = true\n\n return new ReadableStream({\n start: (controller) => {\n this._req.on('data', (chunk) => {\n controller.enqueue(new Uint8Array(chunk))\n })\n this._req.on('end', () => {\n controller.close()\n })\n this._req.on('error', (err) => {\n controller.error(err)\n })\n },\n })\n }\n}\n\nexport class NodeNextResponse extends BaseNextResponse {\n private textBody: string | undefined = undefined\n\n public [SYMBOL_CLEARED_COOKIES]?: boolean\n\n get originalResponse() {\n if (SYMBOL_CLEARED_COOKIES in this) {\n this._res[SYMBOL_CLEARED_COOKIES] = this[SYMBOL_CLEARED_COOKIES]\n }\n\n return this._res\n }\n\n constructor(\n private _res: ServerResponse & { [SYMBOL_CLEARED_COOKIES]?: boolean }\n ) {\n super(_res)\n }\n\n get sent() {\n return this._res.finished || this._res.headersSent\n }\n\n get statusCode() {\n return this._res.statusCode\n }\n\n set statusCode(value: number) {\n this._res.statusCode = value\n }\n\n get statusMessage() {\n return this._res.statusMessage\n }\n\n set statusMessage(value: string) {\n this._res.statusMessage = value\n }\n\n setHeader(name: string, value: string | string[]): this {\n this._res.setHeader(name, value)\n return this\n }\n\n removeHeader(name: string): this {\n this._res.removeHeader(name)\n return this\n }\n\n getHeaderValues(name: string): string[] | undefined {\n const values = this._res.getHeader(name)\n\n if (values === undefined) return undefined\n\n return (Array.isArray(values) ? values : [values]).map((value) =>\n value.toString()\n )\n }\n\n hasHeader(name: string): boolean {\n return this._res.hasHeader(name)\n }\n\n getHeader(name: string): string | undefined {\n const values = this.getHeaderValues(name)\n return Array.isArray(values) ? values.join(',') : undefined\n }\n\n getHeaders(): OutgoingHttpHeaders {\n return this._res.getHeaders()\n }\n\n appendHeader(name: string, value: string): this {\n const currentValues = this.getHeaderValues(name) ?? []\n\n if (!currentValues.includes(value)) {\n this._res.setHeader(name, [...currentValues, value])\n }\n\n return this\n }\n\n body(value: string) {\n this.textBody = value\n return this\n }\n\n send() {\n this._res.end(this.textBody)\n }\n\n public onClose(callback: () => void) {\n this.originalResponse.on('close', callback)\n }\n}\n"],"names":["SYMBOL_CLEARED_COOKIES","NEXT_REQUEST_META","BaseNextRequest","BaseNextResponse","NodeNextRequest","constructor","_req","method","toUpperCase","url","headers","fetchMetrics","streaming","originalRequest","cookies","value","stream","Error","ReadableStream","start","controller","on","chunk","enqueue","Uint8Array","close","err","error","NodeNextResponse","originalResponse","_res","textBody","undefined","sent","finished","headersSent","statusCode","statusMessage","setHeader","name","removeHeader","getHeaderValues","values","getHeader","Array","isArray","map","toString","hasHeader","join","getHeaders","appendHeader","currentValues","includes","body","send","end","onClose","callback"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 738, "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/lib/experimental/ppr.ts"],"sourcesContent":["/**\n * If set to `incremental`, only those leaf pages that export\n * `experimental_ppr = true` will have partial prerendering enabled. If any\n * page exports this value as `false` or does not export it at all will not\n * have partial prerendering enabled. If set to a boolean, the options for\n * `experimental_ppr` will be ignored.\n */\n\nexport type ExperimentalPPRConfig = boolean | 'incremental'\n\n/**\n * Returns true if partial prerendering is enabled for the application. It does\n * not tell you if a given route has PPR enabled, as that requires analysis of\n * the route's configuration.\n *\n * @see {@link checkIsRoutePPREnabled} - for checking if a specific route has PPR enabled.\n */\nexport function checkIsAppPPREnabled(\n config: ExperimentalPPRConfig | undefined\n): boolean {\n // If the config is undefined, partial prerendering is disabled.\n if (typeof config === 'undefined') return false\n\n // If the config is a boolean, use it directly.\n if (typeof config === 'boolean') return config\n\n // If the config is a string, it must be 'incremental' to enable partial\n // prerendering.\n if (config === 'incremental') return true\n\n return false\n}\n\n/**\n * Returns true if partial prerendering is supported for the current page with\n * the provided app configuration. If the application doesn't have partial\n * prerendering enabled, this function will always return false. If you want to\n * check if the application has partial prerendering enabled\n *\n * @see {@link checkIsAppPPREnabled} for checking if the application has PPR enabled.\n */\nexport function checkIsRoutePPREnabled(\n config: ExperimentalPPRConfig | undefined\n): boolean {\n // If the config is undefined, partial prerendering is disabled.\n if (typeof config === 'undefined') return false\n\n // If the config is a boolean, use it directly.\n if (typeof config === 'boolean') return config\n\n return false\n}\n"],"names":["checkIsAppPPREnabled","config","checkIsRoutePPREnabled"],"mappings":"AAAA;;;;;;CAMC,GAID;;;;;;CAMC,GACD;;;;;;AAAO,SAASA,qBACdC,MAAyC;IAEzC,gEAAgE;IAChE,IAAI,OAAOA,WAAW,aAAa,OAAO;IAE1C,+CAA+C;IAC/C,IAAI,OAAOA,WAAW,WAAW,OAAOA;IAExC,wEAAwE;IACxE,gBAAgB;IAChB,IAAIA,WAAW,eAAe,OAAO;IAErC,OAAO;AACT;AAUO,SAASC,uBACdD,MAAyC;IAEzC,gEAAgE;IAChE,IAAI,OAAOA,WAAW,aAAa,OAAO;IAE1C,+CAA+C;IAC/C,IAAI,OAAOA,WAAW,WAAW,OAAOA;IAExC,OAAO;AACT","ignoreList":[0]}}, + {"offset": {"line": 776, "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/dist/compiled/zod/index.cjs"],"sourcesContent":["(()=>{\"use strict\";var e={629:function(e,t,s){var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var a=Object.getOwnPropertyDescriptor(t,s);if(!a||(\"get\"in a?!t.__esModule:a.writable||a.configurable)){a={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,a)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,\"default\",{enumerable:true,value:t})}:function(e,t){e[\"default\"]=t});var n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s in e)if(s!==\"default\"&&Object.prototype.hasOwnProperty.call(e,s))r(t,e,s);a(t,e);return t};var i=this&&this.__exportStar||function(e,t){for(var s in e)if(s!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,s))r(t,e,s)};Object.defineProperty(t,\"__esModule\",{value:true});t.z=void 0;const o=n(s(923));t.z=o;i(s(923),t);t[\"default\"]=o},348:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:true});t.ZodError=t.quotelessJson=t.ZodIssueCode=void 0;const r=s(709);t.ZodIssueCode=r.util.arrayToEnum([\"invalid_type\",\"invalid_literal\",\"custom\",\"invalid_union\",\"invalid_union_discriminator\",\"invalid_enum_value\",\"unrecognized_keys\",\"invalid_arguments\",\"invalid_return_type\",\"invalid_date\",\"invalid_string\",\"too_small\",\"too_big\",\"invalid_intersection_types\",\"not_multiple_of\",\"not_finite\"]);const quotelessJson=e=>{const t=JSON.stringify(e,null,2);return t.replace(/\"([^\"]+)\":/g,\"$1:\")};t.quotelessJson=quotelessJson;class ZodError extends Error{get errors(){return this.issues}constructor(e){super();this.issues=[];this.addIssue=e=>{this.issues=[...this.issues,e]};this.addIssues=(e=[])=>{this.issues=[...this.issues,...e]};const t=new.target.prototype;if(Object.setPrototypeOf){Object.setPrototypeOf(this,t)}else{this.__proto__=t}this.name=\"ZodError\";this.issues=e}format(e){const t=e||function(e){return e.message};const s={_errors:[]};const processError=e=>{for(const r of e.issues){if(r.code===\"invalid_union\"){r.unionErrors.map(processError)}else if(r.code===\"invalid_return_type\"){processError(r.returnTypeError)}else if(r.code===\"invalid_arguments\"){processError(r.argumentsError)}else if(r.path.length===0){s._errors.push(t(r))}else{let e=s;let a=0;while(ae.message)){const t={};const s=[];for(const r of this.issues){if(r.path.length>0){const s=r.path[0];t[s]=t[s]||[];t[s].push(e(r))}else{s.push(e(r))}}return{formErrors:s,fieldErrors:t}}get formErrors(){return this.flatten()}}t.ZodError=ZodError;ZodError.create=e=>{const t=new ZodError(e);return t}},61:function(e,t,s){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:true});t.defaultErrorMap=void 0;t.setErrorMap=setErrorMap;t.getErrorMap=getErrorMap;const a=r(s(871));t.defaultErrorMap=a.default;let n=a.default;function setErrorMap(e){n=e}function getErrorMap(){return n}},923:function(e,t,s){var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var a=Object.getOwnPropertyDescriptor(t,s);if(!a||(\"get\"in a?!t.__esModule:a.writable||a.configurable)){a={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,a)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var a=this&&this.__exportStar||function(e,t){for(var s in e)if(s!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,s))r(t,e,s)};Object.defineProperty(t,\"__esModule\",{value:true});a(s(61),t);a(s(818),t);a(s(515),t);a(s(709),t);a(s(155),t);a(s(348),t)},538:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:true});t.errorUtil=void 0;var s;(function(e){e.errToObj=e=>typeof e===\"string\"?{message:e}:e||{};e.toString=e=>typeof e===\"string\"?e:e?.message})(s||(t.errorUtil=s={}))},818:function(e,t,s){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:true});t.isAsync=t.isValid=t.isDirty=t.isAborted=t.OK=t.DIRTY=t.INVALID=t.ParseStatus=t.EMPTY_PATH=t.makeIssue=void 0;t.addIssueToContext=addIssueToContext;const a=s(61);const n=r(s(871));const makeIssue=e=>{const{data:t,path:s,errorMaps:r,issueData:a}=e;const n=[...s,...a.path||[]];const i={...a,path:n};if(a.message!==undefined){return{...a,path:n,message:a.message}}let o=\"\";const d=r.filter((e=>!!e)).slice().reverse();for(const e of d){o=e(i,{data:t,defaultError:o}).message}return{...a,path:n,message:o}};t.makeIssue=makeIssue;t.EMPTY_PATH=[];function addIssueToContext(e,s){const r=(0,a.getErrorMap)();const i=(0,t.makeIssue)({issueData:s,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,r,r===n.default?undefined:n.default].filter((e=>!!e))});e.common.issues.push(i)}class ParseStatus{constructor(){this.value=\"valid\"}dirty(){if(this.value===\"valid\")this.value=\"dirty\"}abort(){if(this.value!==\"aborted\")this.value=\"aborted\"}static mergeArray(e,s){const r=[];for(const a of s){if(a.status===\"aborted\")return t.INVALID;if(a.status===\"dirty\")e.dirty();r.push(a.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,t){const s=[];for(const e of t){const t=await e.key;const r=await e.value;s.push({key:t,value:r})}return ParseStatus.mergeObjectSync(e,s)}static mergeObjectSync(e,s){const r={};for(const a of s){const{key:s,value:n}=a;if(s.status===\"aborted\")return t.INVALID;if(n.status===\"aborted\")return t.INVALID;if(s.status===\"dirty\")e.dirty();if(n.status===\"dirty\")e.dirty();if(s.value!==\"__proto__\"&&(typeof n.value!==\"undefined\"||a.alwaysSet)){r[s.value]=n.value}}return{status:e.value,value:r}}}t.ParseStatus=ParseStatus;t.INVALID=Object.freeze({status:\"aborted\"});const DIRTY=e=>({status:\"dirty\",value:e});t.DIRTY=DIRTY;const OK=e=>({status:\"valid\",value:e});t.OK=OK;const isAborted=e=>e.status===\"aborted\";t.isAborted=isAborted;const isDirty=e=>e.status===\"dirty\";t.isDirty=isDirty;const isValid=e=>e.status===\"valid\";t.isValid=isValid;const isAsync=e=>typeof Promise!==\"undefined\"&&e instanceof Promise;t.isAsync=isAsync},515:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:true})},709:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:true});t.getParsedType=t.ZodParsedType=t.objectUtil=t.util=void 0;var s;(function(e){e.assertEqual=e=>{};function assertIs(e){}e.assertIs=assertIs;function assertNever(e){throw new Error}e.assertNever=assertNever;e.arrayToEnum=e=>{const t={};for(const s of e){t[s]=s}return t};e.getValidEnumValues=t=>{const s=e.objectKeys(t).filter((e=>typeof t[t[e]]!==\"number\"));const r={};for(const e of s){r[e]=t[e]}return e.objectValues(r)};e.objectValues=t=>e.objectKeys(t).map((function(e){return t[e]}));e.objectKeys=typeof Object.keys===\"function\"?e=>Object.keys(e):e=>{const t=[];for(const s in e){if(Object.prototype.hasOwnProperty.call(e,s)){t.push(s)}}return t};e.find=(e,t)=>{for(const s of e){if(t(s))return s}return undefined};e.isInteger=typeof Number.isInteger===\"function\"?e=>Number.isInteger(e):e=>typeof e===\"number\"&&Number.isFinite(e)&&Math.floor(e)===e;function joinValues(e,t=\" | \"){return e.map((e=>typeof e===\"string\"?`'${e}'`:e)).join(t)}e.joinValues=joinValues;e.jsonStringifyReplacer=(e,t)=>{if(typeof t===\"bigint\"){return t.toString()}return t}})(s||(t.util=s={}));var r;(function(e){e.mergeShapes=(e,t)=>({...e,...t})})(r||(t.objectUtil=r={}));t.ZodParsedType=s.arrayToEnum([\"string\",\"nan\",\"number\",\"integer\",\"float\",\"boolean\",\"date\",\"bigint\",\"symbol\",\"function\",\"undefined\",\"null\",\"array\",\"object\",\"unknown\",\"promise\",\"void\",\"never\",\"map\",\"set\"]);const getParsedType=e=>{const s=typeof e;switch(s){case\"undefined\":return t.ZodParsedType.undefined;case\"string\":return t.ZodParsedType.string;case\"number\":return Number.isNaN(e)?t.ZodParsedType.nan:t.ZodParsedType.number;case\"boolean\":return t.ZodParsedType.boolean;case\"function\":return t.ZodParsedType.function;case\"bigint\":return t.ZodParsedType.bigint;case\"symbol\":return t.ZodParsedType.symbol;case\"object\":if(Array.isArray(e)){return t.ZodParsedType.array}if(e===null){return t.ZodParsedType.null}if(e.then&&typeof e.then===\"function\"&&e.catch&&typeof e.catch===\"function\"){return t.ZodParsedType.promise}if(typeof Map!==\"undefined\"&&e instanceof Map){return t.ZodParsedType.map}if(typeof Set!==\"undefined\"&&e instanceof Set){return t.ZodParsedType.set}if(typeof Date!==\"undefined\"&&e instanceof Date){return t.ZodParsedType.date}return t.ZodParsedType.object;default:return t.ZodParsedType.unknown}};t.getParsedType=getParsedType},871:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:true});const r=s(348);const a=s(709);const errorMap=(e,t)=>{let s;switch(e.code){case r.ZodIssueCode.invalid_type:if(e.received===a.ZodParsedType.undefined){s=\"Required\"}else{s=`Expected ${e.expected}, received ${e.received}`}break;case r.ZodIssueCode.invalid_literal:s=`Invalid literal value, expected ${JSON.stringify(e.expected,a.util.jsonStringifyReplacer)}`;break;case r.ZodIssueCode.unrecognized_keys:s=`Unrecognized key(s) in object: ${a.util.joinValues(e.keys,\", \")}`;break;case r.ZodIssueCode.invalid_union:s=`Invalid input`;break;case r.ZodIssueCode.invalid_union_discriminator:s=`Invalid discriminator value. Expected ${a.util.joinValues(e.options)}`;break;case r.ZodIssueCode.invalid_enum_value:s=`Invalid enum value. Expected ${a.util.joinValues(e.options)}, received '${e.received}'`;break;case r.ZodIssueCode.invalid_arguments:s=`Invalid function arguments`;break;case r.ZodIssueCode.invalid_return_type:s=`Invalid function return type`;break;case r.ZodIssueCode.invalid_date:s=`Invalid date`;break;case r.ZodIssueCode.invalid_string:if(typeof e.validation===\"object\"){if(\"includes\"in e.validation){s=`Invalid input: must include \"${e.validation.includes}\"`;if(typeof e.validation.position===\"number\"){s=`${s} at one or more positions greater than or equal to ${e.validation.position}`}}else if(\"startsWith\"in e.validation){s=`Invalid input: must start with \"${e.validation.startsWith}\"`}else if(\"endsWith\"in e.validation){s=`Invalid input: must end with \"${e.validation.endsWith}\"`}else{a.util.assertNever(e.validation)}}else if(e.validation!==\"regex\"){s=`Invalid ${e.validation}`}else{s=\"Invalid\"}break;case r.ZodIssueCode.too_small:if(e.type===\"array\")s=`Array must contain ${e.exact?\"exactly\":e.inclusive?`at least`:`more than`} ${e.minimum} element(s)`;else if(e.type===\"string\")s=`String must contain ${e.exact?\"exactly\":e.inclusive?`at least`:`over`} ${e.minimum} character(s)`;else if(e.type===\"number\")s=`Number must be ${e.exact?`exactly equal to `:e.inclusive?`greater than or equal to `:`greater than `}${e.minimum}`;else if(e.type===\"bigint\")s=`Number must be ${e.exact?`exactly equal to `:e.inclusive?`greater than or equal to `:`greater than `}${e.minimum}`;else if(e.type===\"date\")s=`Date must be ${e.exact?`exactly equal to `:e.inclusive?`greater than or equal to `:`greater than `}${new Date(Number(e.minimum))}`;else s=\"Invalid input\";break;case r.ZodIssueCode.too_big:if(e.type===\"array\")s=`Array must contain ${e.exact?`exactly`:e.inclusive?`at most`:`less than`} ${e.maximum} element(s)`;else if(e.type===\"string\")s=`String must contain ${e.exact?`exactly`:e.inclusive?`at most`:`under`} ${e.maximum} character(s)`;else if(e.type===\"number\")s=`Number must be ${e.exact?`exactly`:e.inclusive?`less than or equal to`:`less than`} ${e.maximum}`;else if(e.type===\"bigint\")s=`BigInt must be ${e.exact?`exactly`:e.inclusive?`less than or equal to`:`less than`} ${e.maximum}`;else if(e.type===\"date\")s=`Date must be ${e.exact?`exactly`:e.inclusive?`smaller than or equal to`:`smaller than`} ${new Date(Number(e.maximum))}`;else s=\"Invalid input\";break;case r.ZodIssueCode.custom:s=`Invalid input`;break;case r.ZodIssueCode.invalid_intersection_types:s=`Intersection results could not be merged`;break;case r.ZodIssueCode.not_multiple_of:s=`Number must be a multiple of ${e.multipleOf}`;break;case r.ZodIssueCode.not_finite:s=\"Number must be finite\";break;default:s=t.defaultError;a.util.assertNever(e)}return{message:s}};t[\"default\"]=errorMap},155:(e,t,s)=>{Object.defineProperty(t,\"__esModule\",{value:true});t.discriminatedUnion=t.date=t.boolean=t.bigint=t.array=t.any=t.coerce=t.ZodFirstPartyTypeKind=t.late=t.ZodSchema=t.Schema=t.ZodReadonly=t.ZodPipeline=t.ZodBranded=t.BRAND=t.ZodNaN=t.ZodCatch=t.ZodDefault=t.ZodNullable=t.ZodOptional=t.ZodTransformer=t.ZodEffects=t.ZodPromise=t.ZodNativeEnum=t.ZodEnum=t.ZodLiteral=t.ZodLazy=t.ZodFunction=t.ZodSet=t.ZodMap=t.ZodRecord=t.ZodTuple=t.ZodIntersection=t.ZodDiscriminatedUnion=t.ZodUnion=t.ZodObject=t.ZodArray=t.ZodVoid=t.ZodNever=t.ZodUnknown=t.ZodAny=t.ZodNull=t.ZodUndefined=t.ZodSymbol=t.ZodDate=t.ZodBoolean=t.ZodBigInt=t.ZodNumber=t.ZodString=t.ZodType=void 0;t.NEVER=t[\"void\"]=t.unknown=t.union=t.undefined=t.tuple=t.transformer=t.symbol=t.string=t.strictObject=t.set=t.record=t.promise=t.preprocess=t.pipeline=t.ostring=t.optional=t.onumber=t.oboolean=t.object=t.number=t.nullable=t[\"null\"]=t.never=t.nativeEnum=t.nan=t.map=t.literal=t.lazy=t.intersection=t[\"instanceof\"]=t[\"function\"]=t[\"enum\"]=t.effect=void 0;t.datetimeRegex=datetimeRegex;t.custom=custom;const r=s(348);const a=s(61);const n=s(538);const i=s(818);const o=s(709);class ParseInputLazyPath{constructor(e,t,s,r){this._cachedPath=[];this.parent=e;this.data=t;this._path=s;this._key=r}get path(){if(!this._cachedPath.length){if(Array.isArray(this._key)){this._cachedPath.push(...this._path,...this._key)}else{this._cachedPath.push(...this._path,this._key)}}return this._cachedPath}}const handleResult=(e,t)=>{if((0,i.isValid)(t)){return{success:true,data:t.value}}else{if(!e.common.issues.length){throw new Error(\"Validation failed but no issues detected.\")}return{success:false,get error(){if(this._error)return this._error;const t=new r.ZodError(e.common.issues);this._error=t;return this._error}}}};function processCreateParams(e){if(!e)return{};const{errorMap:t,invalid_type_error:s,required_error:r,description:a}=e;if(t&&(s||r)){throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`)}if(t)return{errorMap:t,description:a};const customMap=(t,a)=>{const{message:n}=e;if(t.code===\"invalid_enum_value\"){return{message:n??a.defaultError}}if(typeof a.data===\"undefined\"){return{message:n??r??a.defaultError}}if(t.code!==\"invalid_type\")return{message:a.defaultError};return{message:n??s??a.defaultError}};return{errorMap:customMap,description:a}}class ZodType{get description(){return this._def.description}_getType(e){return(0,o.getParsedType)(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:(0,o.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new i.ParseStatus,ctx:{common:e.parent.common,data:e.data,parsedType:(0,o.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if((0,i.isAsync)(t)){throw new Error(\"Synchronous parse encountered promise.\")}return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const s=this.safeParse(e,t);if(s.success)return s.data;throw s.error}safeParse(e,t){const s={common:{issues:[],async:t?.async??false,contextualErrorMap:t?.errorMap},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,o.getParsedType)(e)};const r=this._parseSync({data:e,path:s.path,parent:s});return handleResult(s,r)}\"~validate\"(e){const t={common:{issues:[],async:!!this[\"~standard\"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,o.getParsedType)(e)};if(!this[\"~standard\"].async){try{const s=this._parseSync({data:e,path:[],parent:t});return(0,i.isValid)(s)?{value:s.value}:{issues:t.common.issues}}catch(e){if(e?.message?.toLowerCase()?.includes(\"encountered\")){this[\"~standard\"].async=true}t.common={issues:[],async:true}}}return this._parseAsync({data:e,path:[],parent:t}).then((e=>(0,i.isValid)(e)?{value:e.value}:{issues:t.common.issues}))}async parseAsync(e,t){const s=await this.safeParseAsync(e,t);if(s.success)return s.data;throw s.error}async safeParseAsync(e,t){const s={common:{issues:[],contextualErrorMap:t?.errorMap,async:true},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,o.getParsedType)(e)};const r=this._parse({data:e,path:s.path,parent:s});const a=await((0,i.isAsync)(r)?r:Promise.resolve(r));return handleResult(s,a)}refine(e,t){const getIssueProperties=e=>{if(typeof t===\"string\"||typeof t===\"undefined\"){return{message:t}}else if(typeof t===\"function\"){return t(e)}else{return t}};return this._refinement(((t,s)=>{const a=e(t);const setError=()=>s.addIssue({code:r.ZodIssueCode.custom,...getIssueProperties(t)});if(typeof Promise!==\"undefined\"&&a instanceof Promise){return a.then((e=>{if(!e){setError();return false}else{return true}}))}if(!a){setError();return false}else{return true}}))}refinement(e,t){return this._refinement(((s,r)=>{if(!e(s)){r.addIssue(typeof t===\"function\"?t(s,r):t);return false}else{return true}}))}_refinement(e){return new ZodEffects({schema:this,typeName:k.ZodEffects,effect:{type:\"refinement\",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync;this._def=e;this.parse=this.parse.bind(this);this.safeParse=this.safeParse.bind(this);this.parseAsync=this.parseAsync.bind(this);this.safeParseAsync=this.safeParseAsync.bind(this);this.spa=this.spa.bind(this);this.refine=this.refine.bind(this);this.refinement=this.refinement.bind(this);this.superRefine=this.superRefine.bind(this);this.optional=this.optional.bind(this);this.nullable=this.nullable.bind(this);this.nullish=this.nullish.bind(this);this.array=this.array.bind(this);this.promise=this.promise.bind(this);this.or=this.or.bind(this);this.and=this.and.bind(this);this.transform=this.transform.bind(this);this.brand=this.brand.bind(this);this.default=this.default.bind(this);this.catch=this.catch.bind(this);this.describe=this.describe.bind(this);this.pipe=this.pipe.bind(this);this.readonly=this.readonly.bind(this);this.isNullable=this.isNullable.bind(this);this.isOptional=this.isOptional.bind(this);this[\"~standard\"]={version:1,vendor:\"zod\",validate:e=>this[\"~validate\"](e)}}optional(){return ZodOptional.create(this,this._def)}nullable(){return ZodNullable.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray.create(this)}promise(){return ZodPromise.create(this,this._def)}or(e){return ZodUnion.create([this,e],this._def)}and(e){return ZodIntersection.create(this,e,this._def)}transform(e){return new ZodEffects({...processCreateParams(this._def),schema:this,typeName:k.ZodEffects,effect:{type:\"transform\",transform:e}})}default(e){const t=typeof e===\"function\"?e:()=>e;return new ZodDefault({...processCreateParams(this._def),innerType:this,defaultValue:t,typeName:k.ZodDefault})}brand(){return new ZodBranded({typeName:k.ZodBranded,type:this,...processCreateParams(this._def)})}catch(e){const t=typeof e===\"function\"?e:()=>e;return new ZodCatch({...processCreateParams(this._def),innerType:this,catchValue:t,typeName:k.ZodCatch})}describe(e){const t=this.constructor;return new t({...this._def,description:e})}pipe(e){return ZodPipeline.create(this,e)}readonly(){return ZodReadonly.create(this)}isOptional(){return this.safeParse(undefined).success}isNullable(){return this.safeParse(null).success}}t.ZodType=ZodType;t.Schema=ZodType;t.ZodSchema=ZodType;const d=/^c[^\\s-]{8,}$/i;const u=/^[0-9a-z]+$/;const c=/^[0-9A-HJKMNP-TV-Z]{26}$/i;const l=/^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;const p=/^[a-z0-9_-]{21}$/i;const f=/^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;const h=/^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;const m=/^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;const y=`^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;let Z;const _=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;const g=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;const v=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;const I=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;const T=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;const b=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;const x=`((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;const C=new RegExp(`^${x}$`);function timeRegexSource(e){let t=`[0-5]\\\\d`;if(e.precision){t=`${t}\\\\.\\\\d{${e.precision}}`}else if(e.precision==null){t=`${t}(\\\\.\\\\d+)?`}const s=e.precision?\"+\":\"?\";return`([01]\\\\d|2[0-3]):[0-5]\\\\d(:${t})${s}`}function timeRegex(e){return new RegExp(`^${timeRegexSource(e)}$`)}function datetimeRegex(e){let t=`${x}T${timeRegexSource(e)}`;const s=[];s.push(e.local?`Z?`:`Z`);if(e.offset)s.push(`([+-]\\\\d{2}:?\\\\d{2})`);t=`${t}(${s.join(\"|\")})`;return new RegExp(`^${t}$`)}function isValidIP(e,t){if((t===\"v4\"||!t)&&_.test(e)){return true}if((t===\"v6\"||!t)&&v.test(e)){return true}return false}function isValidJWT(e,t){if(!f.test(e))return false;try{const[s]=e.split(\".\");if(!s)return false;const r=s.replace(/-/g,\"+\").replace(/_/g,\"/\").padEnd(s.length+(4-s.length%4)%4,\"=\");const a=JSON.parse(atob(r));if(typeof a!==\"object\"||a===null)return false;if(\"typ\"in a&&a?.typ!==\"JWT\")return false;if(!a.alg)return false;if(t&&a.alg!==t)return false;return true}catch{return false}}function isValidCidr(e,t){if((t===\"v4\"||!t)&&g.test(e)){return true}if((t===\"v6\"||!t)&&I.test(e)){return true}return false}class ZodString extends ZodType{_parse(e){if(this._def.coerce){e.data=String(e.data)}const t=this._getType(e);if(t!==o.ZodParsedType.string){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.string,received:t.parsedType});return i.INVALID}const s=new i.ParseStatus;let a=undefined;for(const t of this._def.checks){if(t.kind===\"min\"){if(e.data.lengtht.value){a=this._getOrReturnCtx(e,a);(0,i.addIssueToContext)(a,{code:r.ZodIssueCode.too_big,maximum:t.value,type:\"string\",inclusive:true,exact:false,message:t.message});s.dirty()}}else if(t.kind===\"length\"){const n=e.data.length>t.value;const o=e.data.lengthe.test(t)),{validation:t,code:r.ZodIssueCode.invalid_string,...n.errorUtil.errToObj(s)})}_addCheck(e){return new ZodString({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:\"email\",...n.errorUtil.errToObj(e)})}url(e){return this._addCheck({kind:\"url\",...n.errorUtil.errToObj(e)})}emoji(e){return this._addCheck({kind:\"emoji\",...n.errorUtil.errToObj(e)})}uuid(e){return this._addCheck({kind:\"uuid\",...n.errorUtil.errToObj(e)})}nanoid(e){return this._addCheck({kind:\"nanoid\",...n.errorUtil.errToObj(e)})}cuid(e){return this._addCheck({kind:\"cuid\",...n.errorUtil.errToObj(e)})}cuid2(e){return this._addCheck({kind:\"cuid2\",...n.errorUtil.errToObj(e)})}ulid(e){return this._addCheck({kind:\"ulid\",...n.errorUtil.errToObj(e)})}base64(e){return this._addCheck({kind:\"base64\",...n.errorUtil.errToObj(e)})}base64url(e){return this._addCheck({kind:\"base64url\",...n.errorUtil.errToObj(e)})}jwt(e){return this._addCheck({kind:\"jwt\",...n.errorUtil.errToObj(e)})}ip(e){return this._addCheck({kind:\"ip\",...n.errorUtil.errToObj(e)})}cidr(e){return this._addCheck({kind:\"cidr\",...n.errorUtil.errToObj(e)})}datetime(e){if(typeof e===\"string\"){return this._addCheck({kind:\"datetime\",precision:null,offset:false,local:false,message:e})}return this._addCheck({kind:\"datetime\",precision:typeof e?.precision===\"undefined\"?null:e?.precision,offset:e?.offset??false,local:e?.local??false,...n.errorUtil.errToObj(e?.message)})}date(e){return this._addCheck({kind:\"date\",message:e})}time(e){if(typeof e===\"string\"){return this._addCheck({kind:\"time\",precision:null,message:e})}return this._addCheck({kind:\"time\",precision:typeof e?.precision===\"undefined\"?null:e?.precision,...n.errorUtil.errToObj(e?.message)})}duration(e){return this._addCheck({kind:\"duration\",...n.errorUtil.errToObj(e)})}regex(e,t){return this._addCheck({kind:\"regex\",regex:e,...n.errorUtil.errToObj(t)})}includes(e,t){return this._addCheck({kind:\"includes\",value:e,position:t?.position,...n.errorUtil.errToObj(t?.message)})}startsWith(e,t){return this._addCheck({kind:\"startsWith\",value:e,...n.errorUtil.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:\"endsWith\",value:e,...n.errorUtil.errToObj(t)})}min(e,t){return this._addCheck({kind:\"min\",value:e,...n.errorUtil.errToObj(t)})}max(e,t){return this._addCheck({kind:\"max\",value:e,...n.errorUtil.errToObj(t)})}length(e,t){return this._addCheck({kind:\"length\",value:e,...n.errorUtil.errToObj(t)})}nonempty(e){return this.min(1,n.errorUtil.errToObj(e))}trim(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:\"trim\"}]})}toLowerCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:\"toLowerCase\"}]})}toUpperCase(){return new ZodString({...this._def,checks:[...this._def.checks,{kind:\"toUpperCase\"}]})}get isDatetime(){return!!this._def.checks.find((e=>e.kind===\"datetime\"))}get isDate(){return!!this._def.checks.find((e=>e.kind===\"date\"))}get isTime(){return!!this._def.checks.find((e=>e.kind===\"time\"))}get isDuration(){return!!this._def.checks.find((e=>e.kind===\"duration\"))}get isEmail(){return!!this._def.checks.find((e=>e.kind===\"email\"))}get isURL(){return!!this._def.checks.find((e=>e.kind===\"url\"))}get isEmoji(){return!!this._def.checks.find((e=>e.kind===\"emoji\"))}get isUUID(){return!!this._def.checks.find((e=>e.kind===\"uuid\"))}get isNANOID(){return!!this._def.checks.find((e=>e.kind===\"nanoid\"))}get isCUID(){return!!this._def.checks.find((e=>e.kind===\"cuid\"))}get isCUID2(){return!!this._def.checks.find((e=>e.kind===\"cuid2\"))}get isULID(){return!!this._def.checks.find((e=>e.kind===\"ulid\"))}get isIP(){return!!this._def.checks.find((e=>e.kind===\"ip\"))}get isCIDR(){return!!this._def.checks.find((e=>e.kind===\"cidr\"))}get isBase64(){return!!this._def.checks.find((e=>e.kind===\"base64\"))}get isBase64url(){return!!this._def.checks.find((e=>e.kind===\"base64url\"))}get minLength(){let e=null;for(const t of this._def.checks){if(t.kind===\"min\"){if(e===null||t.value>e)e=t.value}}return e}get maxLength(){let e=null;for(const t of this._def.checks){if(t.kind===\"max\"){if(e===null||t.valuenew ZodString({checks:[],typeName:k.ZodString,coerce:e?.coerce??false,...processCreateParams(e)});function floatSafeRemainder(e,t){const s=(e.toString().split(\".\")[1]||\"\").length;const r=(t.toString().split(\".\")[1]||\"\").length;const a=s>r?s:r;const n=Number.parseInt(e.toFixed(a).replace(\".\",\"\"));const i=Number.parseInt(t.toFixed(a).replace(\".\",\"\"));return n%i/10**a}class ZodNumber extends ZodType{constructor(){super(...arguments);this.min=this.gte;this.max=this.lte;this.step=this.multipleOf}_parse(e){if(this._def.coerce){e.data=Number(e.data)}const t=this._getType(e);if(t!==o.ZodParsedType.number){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.number,received:t.parsedType});return i.INVALID}let s=undefined;const a=new i.ParseStatus;for(const t of this._def.checks){if(t.kind===\"int\"){if(!o.util.isInteger(e.data)){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_type,expected:\"integer\",received:\"float\",message:t.message});a.dirty()}}else if(t.kind===\"min\"){const n=t.inclusive?e.datat.value:e.data>=t.value;if(n){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.too_big,maximum:t.value,type:\"number\",inclusive:t.inclusive,exact:false,message:t.message});a.dirty()}}else if(t.kind===\"multipleOf\"){if(floatSafeRemainder(e.data,t.value)!==0){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.not_multiple_of,multipleOf:t.value,message:t.message});a.dirty()}}else if(t.kind===\"finite\"){if(!Number.isFinite(e.data)){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.not_finite,message:t.message});a.dirty()}}else{o.util.assertNever(t)}}return{status:a.value,value:e.data}}gte(e,t){return this.setLimit(\"min\",e,true,n.errorUtil.toString(t))}gt(e,t){return this.setLimit(\"min\",e,false,n.errorUtil.toString(t))}lte(e,t){return this.setLimit(\"max\",e,true,n.errorUtil.toString(t))}lt(e,t){return this.setLimit(\"max\",e,false,n.errorUtil.toString(t))}setLimit(e,t,s,r){return new ZodNumber({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:n.errorUtil.toString(r)}]})}_addCheck(e){return new ZodNumber({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:\"int\",message:n.errorUtil.toString(e)})}positive(e){return this._addCheck({kind:\"min\",value:0,inclusive:false,message:n.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:\"max\",value:0,inclusive:false,message:n.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:\"max\",value:0,inclusive:true,message:n.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:\"min\",value:0,inclusive:true,message:n.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:\"multipleOf\",value:e,message:n.errorUtil.toString(t)})}finite(e){return this._addCheck({kind:\"finite\",message:n.errorUtil.toString(e)})}safe(e){return this._addCheck({kind:\"min\",inclusive:true,value:Number.MIN_SAFE_INTEGER,message:n.errorUtil.toString(e)})._addCheck({kind:\"max\",inclusive:true,value:Number.MAX_SAFE_INTEGER,message:n.errorUtil.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks){if(t.kind===\"min\"){if(e===null||t.value>e)e=t.value}}return e}get maxValue(){let e=null;for(const t of this._def.checks){if(t.kind===\"max\"){if(e===null||t.valuee.kind===\"int\"||e.kind===\"multipleOf\"&&o.util.isInteger(e.value)))}get isFinite(){let e=null;let t=null;for(const s of this._def.checks){if(s.kind===\"finite\"||s.kind===\"int\"||s.kind===\"multipleOf\"){return true}else if(s.kind===\"min\"){if(t===null||s.value>t)t=s.value}else if(s.kind===\"max\"){if(e===null||s.valuenew ZodNumber({checks:[],typeName:k.ZodNumber,coerce:e?.coerce||false,...processCreateParams(e)});class ZodBigInt extends ZodType{constructor(){super(...arguments);this.min=this.gte;this.max=this.lte}_parse(e){if(this._def.coerce){try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}}const t=this._getType(e);if(t!==o.ZodParsedType.bigint){return this._getInvalidInput(e)}let s=undefined;const a=new i.ParseStatus;for(const t of this._def.checks){if(t.kind===\"min\"){const n=t.inclusive?e.datat.value:e.data>=t.value;if(n){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.too_big,type:\"bigint\",maximum:t.value,inclusive:t.inclusive,message:t.message});a.dirty()}}else if(t.kind===\"multipleOf\"){if(e.data%t.value!==BigInt(0)){s=this._getOrReturnCtx(e,s);(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.not_multiple_of,multipleOf:t.value,message:t.message});a.dirty()}}else{o.util.assertNever(t)}}return{status:a.value,value:e.data}}_getInvalidInput(e){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.bigint,received:t.parsedType});return i.INVALID}gte(e,t){return this.setLimit(\"min\",e,true,n.errorUtil.toString(t))}gt(e,t){return this.setLimit(\"min\",e,false,n.errorUtil.toString(t))}lte(e,t){return this.setLimit(\"max\",e,true,n.errorUtil.toString(t))}lt(e,t){return this.setLimit(\"max\",e,false,n.errorUtil.toString(t))}setLimit(e,t,s,r){return new ZodBigInt({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:n.errorUtil.toString(r)}]})}_addCheck(e){return new ZodBigInt({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:\"min\",value:BigInt(0),inclusive:false,message:n.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:\"max\",value:BigInt(0),inclusive:false,message:n.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:\"max\",value:BigInt(0),inclusive:true,message:n.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:\"min\",value:BigInt(0),inclusive:true,message:n.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:\"multipleOf\",value:e,message:n.errorUtil.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks){if(t.kind===\"min\"){if(e===null||t.value>e)e=t.value}}return e}get maxValue(){let e=null;for(const t of this._def.checks){if(t.kind===\"max\"){if(e===null||t.valuenew ZodBigInt({checks:[],typeName:k.ZodBigInt,coerce:e?.coerce??false,...processCreateParams(e)});class ZodBoolean extends ZodType{_parse(e){if(this._def.coerce){e.data=Boolean(e.data)}const t=this._getType(e);if(t!==o.ZodParsedType.boolean){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.boolean,received:t.parsedType});return i.INVALID}return(0,i.OK)(e.data)}}t.ZodBoolean=ZodBoolean;ZodBoolean.create=e=>new ZodBoolean({typeName:k.ZodBoolean,coerce:e?.coerce||false,...processCreateParams(e)});class ZodDate extends ZodType{_parse(e){if(this._def.coerce){e.data=new Date(e.data)}const t=this._getType(e);if(t!==o.ZodParsedType.date){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.date,received:t.parsedType});return i.INVALID}if(Number.isNaN(e.data.getTime())){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_date});return i.INVALID}const s=new i.ParseStatus;let a=undefined;for(const t of this._def.checks){if(t.kind===\"min\"){if(e.data.getTime()t.value){a=this._getOrReturnCtx(e,a);(0,i.addIssueToContext)(a,{code:r.ZodIssueCode.too_big,message:t.message,inclusive:true,exact:false,maximum:t.value,type:\"date\"});s.dirty()}}else{o.util.assertNever(t)}}return{status:s.value,value:new Date(e.data.getTime())}}_addCheck(e){return new ZodDate({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:\"min\",value:e.getTime(),message:n.errorUtil.toString(t)})}max(e,t){return this._addCheck({kind:\"max\",value:e.getTime(),message:n.errorUtil.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks){if(t.kind===\"min\"){if(e===null||t.value>e)e=t.value}}return e!=null?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks){if(t.kind===\"max\"){if(e===null||t.valuenew ZodDate({checks:[],coerce:e?.coerce||false,typeName:k.ZodDate,...processCreateParams(e)});class ZodSymbol extends ZodType{_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.symbol){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.symbol,received:t.parsedType});return i.INVALID}return(0,i.OK)(e.data)}}t.ZodSymbol=ZodSymbol;ZodSymbol.create=e=>new ZodSymbol({typeName:k.ZodSymbol,...processCreateParams(e)});class ZodUndefined extends ZodType{_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.undefined,received:t.parsedType});return i.INVALID}return(0,i.OK)(e.data)}}t.ZodUndefined=ZodUndefined;ZodUndefined.create=e=>new ZodUndefined({typeName:k.ZodUndefined,...processCreateParams(e)});class ZodNull extends ZodType{_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.null){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.null,received:t.parsedType});return i.INVALID}return(0,i.OK)(e.data)}}t.ZodNull=ZodNull;ZodNull.create=e=>new ZodNull({typeName:k.ZodNull,...processCreateParams(e)});class ZodAny extends ZodType{constructor(){super(...arguments);this._any=true}_parse(e){return(0,i.OK)(e.data)}}t.ZodAny=ZodAny;ZodAny.create=e=>new ZodAny({typeName:k.ZodAny,...processCreateParams(e)});class ZodUnknown extends ZodType{constructor(){super(...arguments);this._unknown=true}_parse(e){return(0,i.OK)(e.data)}}t.ZodUnknown=ZodUnknown;ZodUnknown.create=e=>new ZodUnknown({typeName:k.ZodUnknown,...processCreateParams(e)});class ZodNever extends ZodType{_parse(e){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.never,received:t.parsedType});return i.INVALID}}t.ZodNever=ZodNever;ZodNever.create=e=>new ZodNever({typeName:k.ZodNever,...processCreateParams(e)});class ZodVoid extends ZodType{_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.void,received:t.parsedType});return i.INVALID}return(0,i.OK)(e.data)}}t.ZodVoid=ZodVoid;ZodVoid.create=e=>new ZodVoid({typeName:k.ZodVoid,...processCreateParams(e)});class ZodArray extends ZodType{_parse(e){const{ctx:t,status:s}=this._processInputParams(e);const a=this._def;if(t.parsedType!==o.ZodParsedType.array){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.array,received:t.parsedType});return i.INVALID}if(a.exactLength!==null){const e=t.data.length>a.exactLength.value;const n=t.data.lengtha.maxLength.value){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.too_big,maximum:a.maxLength.value,type:\"array\",inclusive:true,exact:false,message:a.maxLength.message});s.dirty()}}if(t.common.async){return Promise.all([...t.data].map(((e,s)=>a.type._parseAsync(new ParseInputLazyPath(t,e,t.path,s))))).then((e=>i.ParseStatus.mergeArray(s,e)))}const n=[...t.data].map(((e,s)=>a.type._parseSync(new ParseInputLazyPath(t,e,t.path,s))));return i.ParseStatus.mergeArray(s,n)}get element(){return this._def.type}min(e,t){return new ZodArray({...this._def,minLength:{value:e,message:n.errorUtil.toString(t)}})}max(e,t){return new ZodArray({...this._def,maxLength:{value:e,message:n.errorUtil.toString(t)}})}length(e,t){return new ZodArray({...this._def,exactLength:{value:e,message:n.errorUtil.toString(t)}})}nonempty(e){return this.min(1,e)}}t.ZodArray=ZodArray;ZodArray.create=(e,t)=>new ZodArray({type:e,minLength:null,maxLength:null,exactLength:null,typeName:k.ZodArray,...processCreateParams(t)});function deepPartialify(e){if(e instanceof ZodObject){const t={};for(const s in e.shape){const r=e.shape[s];t[s]=ZodOptional.create(deepPartialify(r))}return new ZodObject({...e._def,shape:()=>t})}else if(e instanceof ZodArray){return new ZodArray({...e._def,type:deepPartialify(e.element)})}else if(e instanceof ZodOptional){return ZodOptional.create(deepPartialify(e.unwrap()))}else if(e instanceof ZodNullable){return ZodNullable.create(deepPartialify(e.unwrap()))}else if(e instanceof ZodTuple){return ZodTuple.create(e.items.map((e=>deepPartialify(e))))}else{return e}}class ZodObject extends ZodType{constructor(){super(...arguments);this._cached=null;this.nonstrict=this.passthrough;this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape();const t=o.util.objectKeys(e);this._cached={shape:e,keys:t};return this._cached}_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.object){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.object,received:t.parsedType});return i.INVALID}const{status:s,ctx:a}=this._processInputParams(e);const{shape:n,keys:d}=this._getCached();const u=[];if(!(this._def.catchall instanceof ZodNever&&this._def.unknownKeys===\"strip\")){for(const e in a.data){if(!d.includes(e)){u.push(e)}}}const c=[];for(const e of d){const t=n[e];const s=a.data[e];c.push({key:{status:\"valid\",value:e},value:t._parse(new ParseInputLazyPath(a,s,a.path,e)),alwaysSet:e in a.data})}if(this._def.catchall instanceof ZodNever){const e=this._def.unknownKeys;if(e===\"passthrough\"){for(const e of u){c.push({key:{status:\"valid\",value:e},value:{status:\"valid\",value:a.data[e]}})}}else if(e===\"strict\"){if(u.length>0){(0,i.addIssueToContext)(a,{code:r.ZodIssueCode.unrecognized_keys,keys:u});s.dirty()}}else if(e===\"strip\"){}else{throw new Error(`Internal ZodObject error: invalid unknownKeys value.`)}}else{const e=this._def.catchall;for(const t of u){const s=a.data[t];c.push({key:{status:\"valid\",value:t},value:e._parse(new ParseInputLazyPath(a,s,a.path,t)),alwaysSet:t in a.data})}}if(a.common.async){return Promise.resolve().then((async()=>{const e=[];for(const t of c){const s=await t.key;const r=await t.value;e.push({key:s,value:r,alwaysSet:t.alwaysSet})}return e})).then((e=>i.ParseStatus.mergeObjectSync(s,e)))}else{return i.ParseStatus.mergeObjectSync(s,c)}}get shape(){return this._def.shape()}strict(e){n.errorUtil.errToObj;return new ZodObject({...this._def,unknownKeys:\"strict\",...e!==undefined?{errorMap:(t,s)=>{const r=this._def.errorMap?.(t,s).message??s.defaultError;if(t.code===\"unrecognized_keys\")return{message:n.errorUtil.errToObj(e).message??r};return{message:r}}}:{}})}strip(){return new ZodObject({...this._def,unknownKeys:\"strip\"})}passthrough(){return new ZodObject({...this._def,unknownKeys:\"passthrough\"})}extend(e){return new ZodObject({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){const t=new ZodObject({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:k.ZodObject});return t}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new ZodObject({...this._def,catchall:e})}pick(e){const t={};for(const s of o.util.objectKeys(e)){if(e[s]&&this.shape[s]){t[s]=this.shape[s]}}return new ZodObject({...this._def,shape:()=>t})}omit(e){const t={};for(const s of o.util.objectKeys(this.shape)){if(!e[s]){t[s]=this.shape[s]}}return new ZodObject({...this._def,shape:()=>t})}deepPartial(){return deepPartialify(this)}partial(e){const t={};for(const s of o.util.objectKeys(this.shape)){const r=this.shape[s];if(e&&!e[s]){t[s]=r}else{t[s]=r.optional()}}return new ZodObject({...this._def,shape:()=>t})}required(e){const t={};for(const s of o.util.objectKeys(this.shape)){if(e&&!e[s]){t[s]=this.shape[s]}else{const e=this.shape[s];let r=e;while(r instanceof ZodOptional){r=r._def.innerType}t[s]=r}}return new ZodObject({...this._def,shape:()=>t})}keyof(){return createZodEnum(o.util.objectKeys(this.shape))}}t.ZodObject=ZodObject;ZodObject.create=(e,t)=>new ZodObject({shape:()=>e,unknownKeys:\"strip\",catchall:ZodNever.create(),typeName:k.ZodObject,...processCreateParams(t)});ZodObject.strictCreate=(e,t)=>new ZodObject({shape:()=>e,unknownKeys:\"strict\",catchall:ZodNever.create(),typeName:k.ZodObject,...processCreateParams(t)});ZodObject.lazycreate=(e,t)=>new ZodObject({shape:e,unknownKeys:\"strip\",catchall:ZodNever.create(),typeName:k.ZodObject,...processCreateParams(t)});class ZodUnion extends ZodType{_parse(e){const{ctx:t}=this._processInputParams(e);const s=this._def.options;function handleResults(e){for(const t of e){if(t.result.status===\"valid\"){return t.result}}for(const s of e){if(s.result.status===\"dirty\"){t.common.issues.push(...s.ctx.common.issues);return s.result}}const s=e.map((e=>new r.ZodError(e.ctx.common.issues)));(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_union,unionErrors:s});return i.INVALID}if(t.common.async){return Promise.all(s.map((async e=>{const s={...t,common:{...t.common,issues:[]},parent:null};return{result:await e._parseAsync({data:t.data,path:t.path,parent:s}),ctx:s}}))).then(handleResults)}else{let e=undefined;const a=[];for(const r of s){const s={...t,common:{...t.common,issues:[]},parent:null};const n=r._parseSync({data:t.data,path:t.path,parent:s});if(n.status===\"valid\"){return n}else if(n.status===\"dirty\"&&!e){e={result:n,ctx:s}}if(s.common.issues.length){a.push(s.common.issues)}}if(e){t.common.issues.push(...e.ctx.common.issues);return e.result}const n=a.map((e=>new r.ZodError(e)));(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_union,unionErrors:n});return i.INVALID}}get options(){return this._def.options}}t.ZodUnion=ZodUnion;ZodUnion.create=(e,t)=>new ZodUnion({options:e,typeName:k.ZodUnion,...processCreateParams(t)});const getDiscriminator=e=>{if(e instanceof ZodLazy){return getDiscriminator(e.schema)}else if(e instanceof ZodEffects){return getDiscriminator(e.innerType())}else if(e instanceof ZodLiteral){return[e.value]}else if(e instanceof ZodEnum){return e.options}else if(e instanceof ZodNativeEnum){return o.util.objectValues(e.enum)}else if(e instanceof ZodDefault){return getDiscriminator(e._def.innerType)}else if(e instanceof ZodUndefined){return[undefined]}else if(e instanceof ZodNull){return[null]}else if(e instanceof ZodOptional){return[undefined,...getDiscriminator(e.unwrap())]}else if(e instanceof ZodNullable){return[null,...getDiscriminator(e.unwrap())]}else if(e instanceof ZodBranded){return getDiscriminator(e.unwrap())}else if(e instanceof ZodReadonly){return getDiscriminator(e.unwrap())}else if(e instanceof ZodCatch){return getDiscriminator(e._def.innerType)}else{return[]}};class ZodDiscriminatedUnion extends ZodType{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==o.ZodParsedType.object){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.object,received:t.parsedType});return i.INVALID}const s=this.discriminator;const a=t.data[s];const n=this.optionsMap.get(a);if(!n){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[s]});return i.INVALID}if(t.common.async){return n._parseAsync({data:t.data,path:t.path,parent:t})}else{return n._parseSync({data:t.data,path:t.path,parent:t})}}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,s){const r=new Map;for(const s of t){const t=getDiscriminator(s.shape[e]);if(!t.length){throw new Error(`A discriminator value for key \\`${e}\\` could not be extracted from all schema options`)}for(const a of t){if(r.has(a)){throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`)}r.set(a,s)}}return new ZodDiscriminatedUnion({typeName:k.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:r,...processCreateParams(s)})}}t.ZodDiscriminatedUnion=ZodDiscriminatedUnion;function mergeValues(e,t){const s=(0,o.getParsedType)(e);const r=(0,o.getParsedType)(t);if(e===t){return{valid:true,data:e}}else if(s===o.ZodParsedType.object&&r===o.ZodParsedType.object){const s=o.util.objectKeys(t);const r=o.util.objectKeys(e).filter((e=>s.indexOf(e)!==-1));const a={...e,...t};for(const s of r){const r=mergeValues(e[s],t[s]);if(!r.valid){return{valid:false}}a[s]=r.data}return{valid:true,data:a}}else if(s===o.ZodParsedType.array&&r===o.ZodParsedType.array){if(e.length!==t.length){return{valid:false}}const s=[];for(let r=0;r{if((0,i.isAborted)(e)||(0,i.isAborted)(a)){return i.INVALID}const n=mergeValues(e.value,a.value);if(!n.valid){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_intersection_types});return i.INVALID}if((0,i.isDirty)(e)||(0,i.isDirty)(a)){t.dirty()}return{status:t.value,value:n.data}};if(s.common.async){return Promise.all([this._def.left._parseAsync({data:s.data,path:s.path,parent:s}),this._def.right._parseAsync({data:s.data,path:s.path,parent:s})]).then((([e,t])=>handleParsed(e,t)))}else{return handleParsed(this._def.left._parseSync({data:s.data,path:s.path,parent:s}),this._def.right._parseSync({data:s.data,path:s.path,parent:s}))}}}t.ZodIntersection=ZodIntersection;ZodIntersection.create=(e,t,s)=>new ZodIntersection({left:e,right:t,typeName:k.ZodIntersection,...processCreateParams(s)});class ZodTuple extends ZodType{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==o.ZodParsedType.array){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.array,received:s.parsedType});return i.INVALID}if(s.data.lengththis._def.items.length){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:true,exact:false,type:\"array\"});t.dirty()}const n=[...s.data].map(((e,t)=>{const r=this._def.items[t]||this._def.rest;if(!r)return null;return r._parse(new ParseInputLazyPath(s,e,s.path,t))})).filter((e=>!!e));if(s.common.async){return Promise.all(n).then((e=>i.ParseStatus.mergeArray(t,e)))}else{return i.ParseStatus.mergeArray(t,n)}}get items(){return this._def.items}rest(e){return new ZodTuple({...this._def,rest:e})}}t.ZodTuple=ZodTuple;ZodTuple.create=(e,t)=>{if(!Array.isArray(e)){throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\")}return new ZodTuple({items:e,typeName:k.ZodTuple,rest:null,...processCreateParams(t)})};class ZodRecord extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==o.ZodParsedType.object){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.object,received:s.parsedType});return i.INVALID}const a=[];const n=this._def.keyType;const d=this._def.valueType;for(const e in s.data){a.push({key:n._parse(new ParseInputLazyPath(s,e,s.path,e)),value:d._parse(new ParseInputLazyPath(s,s.data[e],s.path,e)),alwaysSet:e in s.data})}if(s.common.async){return i.ParseStatus.mergeObjectAsync(t,a)}else{return i.ParseStatus.mergeObjectSync(t,a)}}get element(){return this._def.valueType}static create(e,t,s){if(t instanceof ZodType){return new ZodRecord({keyType:e,valueType:t,typeName:k.ZodRecord,...processCreateParams(s)})}return new ZodRecord({keyType:ZodString.create(),valueType:e,typeName:k.ZodRecord,...processCreateParams(t)})}}t.ZodRecord=ZodRecord;class ZodMap extends ZodType{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==o.ZodParsedType.map){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.map,received:s.parsedType});return i.INVALID}const a=this._def.keyType;const n=this._def.valueType;const d=[...s.data.entries()].map((([e,t],r)=>({key:a._parse(new ParseInputLazyPath(s,e,s.path,[r,\"key\"])),value:n._parse(new ParseInputLazyPath(s,t,s.path,[r,\"value\"]))})));if(s.common.async){const e=new Map;return Promise.resolve().then((async()=>{for(const s of d){const r=await s.key;const a=await s.value;if(r.status===\"aborted\"||a.status===\"aborted\"){return i.INVALID}if(r.status===\"dirty\"||a.status===\"dirty\"){t.dirty()}e.set(r.value,a.value)}return{status:t.value,value:e}}))}else{const e=new Map;for(const s of d){const r=s.key;const a=s.value;if(r.status===\"aborted\"||a.status===\"aborted\"){return i.INVALID}if(r.status===\"dirty\"||a.status===\"dirty\"){t.dirty()}e.set(r.value,a.value)}return{status:t.value,value:e}}}}t.ZodMap=ZodMap;ZodMap.create=(e,t,s)=>new ZodMap({valueType:t,keyType:e,typeName:k.ZodMap,...processCreateParams(s)});class ZodSet extends ZodType{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==o.ZodParsedType.set){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.set,received:s.parsedType});return i.INVALID}const a=this._def;if(a.minSize!==null){if(s.data.sizea.maxSize.value){(0,i.addIssueToContext)(s,{code:r.ZodIssueCode.too_big,maximum:a.maxSize.value,type:\"set\",inclusive:true,exact:false,message:a.maxSize.message});t.dirty()}}const n=this._def.valueType;function finalizeSet(e){const s=new Set;for(const r of e){if(r.status===\"aborted\")return i.INVALID;if(r.status===\"dirty\")t.dirty();s.add(r.value)}return{status:t.value,value:s}}const d=[...s.data.values()].map(((e,t)=>n._parse(new ParseInputLazyPath(s,e,s.path,t))));if(s.common.async){return Promise.all(d).then((e=>finalizeSet(e)))}else{return finalizeSet(d)}}min(e,t){return new ZodSet({...this._def,minSize:{value:e,message:n.errorUtil.toString(t)}})}max(e,t){return new ZodSet({...this._def,maxSize:{value:e,message:n.errorUtil.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}t.ZodSet=ZodSet;ZodSet.create=(e,t)=>new ZodSet({valueType:e,minSize:null,maxSize:null,typeName:k.ZodSet,...processCreateParams(t)});class ZodFunction extends ZodType{constructor(){super(...arguments);this.validate=this.implement}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==o.ZodParsedType.function){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.function,received:t.parsedType});return i.INVALID}function makeArgsIssue(e,s){return(0,i.makeIssue)({data:e,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,(0,a.getErrorMap)(),a.defaultErrorMap].filter((e=>!!e)),issueData:{code:r.ZodIssueCode.invalid_arguments,argumentsError:s}})}function makeReturnsIssue(e,s){return(0,i.makeIssue)({data:e,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,(0,a.getErrorMap)(),a.defaultErrorMap].filter((e=>!!e)),issueData:{code:r.ZodIssueCode.invalid_return_type,returnTypeError:s}})}const s={errorMap:t.common.contextualErrorMap};const n=t.data;if(this._def.returns instanceof ZodPromise){const e=this;return(0,i.OK)((async function(...t){const a=new r.ZodError([]);const i=await e._def.args.parseAsync(t,s).catch((e=>{a.addIssue(makeArgsIssue(t,e));throw a}));const o=await Reflect.apply(n,this,i);const d=await e._def.returns._def.type.parseAsync(o,s).catch((e=>{a.addIssue(makeReturnsIssue(o,e));throw a}));return d}))}else{const e=this;return(0,i.OK)((function(...t){const a=e._def.args.safeParse(t,s);if(!a.success){throw new r.ZodError([makeArgsIssue(t,a.error)])}const i=Reflect.apply(n,this,a.data);const o=e._def.returns.safeParse(i,s);if(!o.success){throw new r.ZodError([makeReturnsIssue(i,o.error)])}return o.data}))}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new ZodFunction({...this._def,args:ZodTuple.create(e).rest(ZodUnknown.create())})}returns(e){return new ZodFunction({...this._def,returns:e})}implement(e){const t=this.parse(e);return t}strictImplement(e){const t=this.parse(e);return t}static create(e,t,s){return new ZodFunction({args:e?e:ZodTuple.create([]).rest(ZodUnknown.create()),returns:t||ZodUnknown.create(),typeName:k.ZodFunction,...processCreateParams(s)})}}t.ZodFunction=ZodFunction;class ZodLazy extends ZodType{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);const s=this._def.getter();return s._parse({data:t.data,path:t.path,parent:t})}}t.ZodLazy=ZodLazy;ZodLazy.create=(e,t)=>new ZodLazy({getter:e,typeName:k.ZodLazy,...processCreateParams(t)});class ZodLiteral extends ZodType{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{received:t.data,code:r.ZodIssueCode.invalid_literal,expected:this._def.value});return i.INVALID}return{status:\"valid\",value:e.data}}get value(){return this._def.value}}t.ZodLiteral=ZodLiteral;ZodLiteral.create=(e,t)=>new ZodLiteral({value:e,typeName:k.ZodLiteral,...processCreateParams(t)});function createZodEnum(e,t){return new ZodEnum({values:e,typeName:k.ZodEnum,...processCreateParams(t)})}class ZodEnum extends ZodType{_parse(e){if(typeof e.data!==\"string\"){const t=this._getOrReturnCtx(e);const s=this._def.values;(0,i.addIssueToContext)(t,{expected:o.util.joinValues(s),received:t.parsedType,code:r.ZodIssueCode.invalid_type});return i.INVALID}if(!this._cache){this._cache=new Set(this._def.values)}if(!this._cache.has(e.data)){const t=this._getOrReturnCtx(e);const s=this._def.values;(0,i.addIssueToContext)(t,{received:t.data,code:r.ZodIssueCode.invalid_enum_value,options:s});return i.INVALID}return(0,i.OK)(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values){e[t]=t}return e}get Values(){const e={};for(const t of this._def.values){e[t]=t}return e}get Enum(){const e={};for(const t of this._def.values){e[t]=t}return e}extract(e,t=this._def){return ZodEnum.create(e,{...this._def,...t})}exclude(e,t=this._def){return ZodEnum.create(this.options.filter((t=>!e.includes(t))),{...this._def,...t})}}t.ZodEnum=ZodEnum;ZodEnum.create=createZodEnum;class ZodNativeEnum extends ZodType{_parse(e){const t=o.util.getValidEnumValues(this._def.values);const s=this._getOrReturnCtx(e);if(s.parsedType!==o.ZodParsedType.string&&s.parsedType!==o.ZodParsedType.number){const e=o.util.objectValues(t);(0,i.addIssueToContext)(s,{expected:o.util.joinValues(e),received:s.parsedType,code:r.ZodIssueCode.invalid_type});return i.INVALID}if(!this._cache){this._cache=new Set(o.util.getValidEnumValues(this._def.values))}if(!this._cache.has(e.data)){const e=o.util.objectValues(t);(0,i.addIssueToContext)(s,{received:s.data,code:r.ZodIssueCode.invalid_enum_value,options:e});return i.INVALID}return(0,i.OK)(e.data)}get enum(){return this._def.values}}t.ZodNativeEnum=ZodNativeEnum;ZodNativeEnum.create=(e,t)=>new ZodNativeEnum({values:e,typeName:k.ZodNativeEnum,...processCreateParams(t)});class ZodPromise extends ZodType{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==o.ZodParsedType.promise&&t.common.async===false){(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.promise,received:t.parsedType});return i.INVALID}const s=t.parsedType===o.ZodParsedType.promise?t.data:Promise.resolve(t.data);return(0,i.OK)(s.then((e=>this._def.type.parseAsync(e,{path:t.path,errorMap:t.common.contextualErrorMap}))))}}t.ZodPromise=ZodPromise;ZodPromise.create=(e,t)=>new ZodPromise({type:e,typeName:k.ZodPromise,...processCreateParams(t)});class ZodEffects extends ZodType{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===k.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:s}=this._processInputParams(e);const r=this._def.effect||null;const a={addIssue:e=>{(0,i.addIssueToContext)(s,e);if(e.fatal){t.abort()}else{t.dirty()}},get path(){return s.path}};a.addIssue=a.addIssue.bind(a);if(r.type===\"preprocess\"){const e=r.transform(s.data,a);if(s.common.async){return Promise.resolve(e).then((async e=>{if(t.value===\"aborted\")return i.INVALID;const r=await this._def.schema._parseAsync({data:e,path:s.path,parent:s});if(r.status===\"aborted\")return i.INVALID;if(r.status===\"dirty\")return(0,i.DIRTY)(r.value);if(t.value===\"dirty\")return(0,i.DIRTY)(r.value);return r}))}else{if(t.value===\"aborted\")return i.INVALID;const r=this._def.schema._parseSync({data:e,path:s.path,parent:s});if(r.status===\"aborted\")return i.INVALID;if(r.status===\"dirty\")return(0,i.DIRTY)(r.value);if(t.value===\"dirty\")return(0,i.DIRTY)(r.value);return r}}if(r.type===\"refinement\"){const executeRefinement=e=>{const t=r.refinement(e,a);if(s.common.async){return Promise.resolve(t)}if(t instanceof Promise){throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\")}return e};if(s.common.async===false){const e=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});if(e.status===\"aborted\")return i.INVALID;if(e.status===\"dirty\")t.dirty();executeRefinement(e.value);return{status:t.value,value:e.value}}else{return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then((e=>{if(e.status===\"aborted\")return i.INVALID;if(e.status===\"dirty\")t.dirty();return executeRefinement(e.value).then((()=>({status:t.value,value:e.value})))}))}}if(r.type===\"transform\"){if(s.common.async===false){const e=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});if(!(0,i.isValid)(e))return i.INVALID;const n=r.transform(e.value,a);if(n instanceof Promise){throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`)}return{status:t.value,value:n}}else{return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then((e=>{if(!(0,i.isValid)(e))return i.INVALID;return Promise.resolve(r.transform(e.value,a)).then((e=>({status:t.value,value:e})))}))}}o.util.assertNever(r)}}t.ZodEffects=ZodEffects;t.ZodTransformer=ZodEffects;ZodEffects.create=(e,t,s)=>new ZodEffects({schema:e,typeName:k.ZodEffects,effect:t,...processCreateParams(s)});ZodEffects.createWithPreprocess=(e,t,s)=>new ZodEffects({schema:t,effect:{type:\"preprocess\",transform:e},typeName:k.ZodEffects,...processCreateParams(s)});class ZodOptional extends ZodType{_parse(e){const t=this._getType(e);if(t===o.ZodParsedType.undefined){return(0,i.OK)(undefined)}return this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}t.ZodOptional=ZodOptional;ZodOptional.create=(e,t)=>new ZodOptional({innerType:e,typeName:k.ZodOptional,...processCreateParams(t)});class ZodNullable extends ZodType{_parse(e){const t=this._getType(e);if(t===o.ZodParsedType.null){return(0,i.OK)(null)}return this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}t.ZodNullable=ZodNullable;ZodNullable.create=(e,t)=>new ZodNullable({innerType:e,typeName:k.ZodNullable,...processCreateParams(t)});class ZodDefault extends ZodType{_parse(e){const{ctx:t}=this._processInputParams(e);let s=t.data;if(t.parsedType===o.ZodParsedType.undefined){s=this._def.defaultValue()}return this._def.innerType._parse({data:s,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}t.ZodDefault=ZodDefault;ZodDefault.create=(e,t)=>new ZodDefault({innerType:e,typeName:k.ZodDefault,defaultValue:typeof t.default===\"function\"?t.default:()=>t.default,...processCreateParams(t)});class ZodCatch extends ZodType{_parse(e){const{ctx:t}=this._processInputParams(e);const s={...t,common:{...t.common,issues:[]}};const a=this._def.innerType._parse({data:s.data,path:s.path,parent:{...s}});if((0,i.isAsync)(a)){return a.then((e=>({status:\"valid\",value:e.status===\"valid\"?e.value:this._def.catchValue({get error(){return new r.ZodError(s.common.issues)},input:s.data})})))}else{return{status:\"valid\",value:a.status===\"valid\"?a.value:this._def.catchValue({get error(){return new r.ZodError(s.common.issues)},input:s.data})}}}removeCatch(){return this._def.innerType}}t.ZodCatch=ZodCatch;ZodCatch.create=(e,t)=>new ZodCatch({innerType:e,typeName:k.ZodCatch,catchValue:typeof t.catch===\"function\"?t.catch:()=>t.catch,...processCreateParams(t)});class ZodNaN extends ZodType{_parse(e){const t=this._getType(e);if(t!==o.ZodParsedType.nan){const t=this._getOrReturnCtx(e);(0,i.addIssueToContext)(t,{code:r.ZodIssueCode.invalid_type,expected:o.ZodParsedType.nan,received:t.parsedType});return i.INVALID}return{status:\"valid\",value:e.data}}}t.ZodNaN=ZodNaN;ZodNaN.create=e=>new ZodNaN({typeName:k.ZodNaN,...processCreateParams(e)});t.BRAND=Symbol(\"zod_brand\");class ZodBranded extends ZodType{_parse(e){const{ctx:t}=this._processInputParams(e);const s=t.data;return this._def.type._parse({data:s,path:t.path,parent:t})}unwrap(){return this._def.type}}t.ZodBranded=ZodBranded;class ZodPipeline extends ZodType{_parse(e){const{status:t,ctx:s}=this._processInputParams(e);if(s.common.async){const handleAsync=async()=>{const e=await this._def.in._parseAsync({data:s.data,path:s.path,parent:s});if(e.status===\"aborted\")return i.INVALID;if(e.status===\"dirty\"){t.dirty();return(0,i.DIRTY)(e.value)}else{return this._def.out._parseAsync({data:e.value,path:s.path,parent:s})}};return handleAsync()}else{const e=this._def.in._parseSync({data:s.data,path:s.path,parent:s});if(e.status===\"aborted\")return i.INVALID;if(e.status===\"dirty\"){t.dirty();return{status:\"dirty\",value:e.value}}else{return this._def.out._parseSync({data:e.value,path:s.path,parent:s})}}}static create(e,t){return new ZodPipeline({in:e,out:t,typeName:k.ZodPipeline})}}t.ZodPipeline=ZodPipeline;class ZodReadonly extends ZodType{_parse(e){const t=this._def.innerType._parse(e);const freeze=e=>{if((0,i.isValid)(e)){e.value=Object.freeze(e.value)}return e};return(0,i.isAsync)(t)?t.then((e=>freeze(e))):freeze(t)}unwrap(){return this._def.innerType}}t.ZodReadonly=ZodReadonly;ZodReadonly.create=(e,t)=>new ZodReadonly({innerType:e,typeName:k.ZodReadonly,...processCreateParams(t)});function cleanParams(e,t){const s=typeof e===\"function\"?e(t):typeof e===\"string\"?{message:e}:e;const r=typeof s===\"string\"?{message:s}:s;return r}function custom(e,t={},s){if(e)return ZodAny.create().superRefine(((r,a)=>{const n=e(r);if(n instanceof Promise){return n.then((e=>{if(!e){const e=cleanParams(t,r);const n=e.fatal??s??true;a.addIssue({code:\"custom\",...e,fatal:n})}}))}if(!n){const e=cleanParams(t,r);const n=e.fatal??s??true;a.addIssue({code:\"custom\",...e,fatal:n})}return}));return ZodAny.create()}t.late={object:ZodObject.lazycreate};var k;(function(e){e[\"ZodString\"]=\"ZodString\";e[\"ZodNumber\"]=\"ZodNumber\";e[\"ZodNaN\"]=\"ZodNaN\";e[\"ZodBigInt\"]=\"ZodBigInt\";e[\"ZodBoolean\"]=\"ZodBoolean\";e[\"ZodDate\"]=\"ZodDate\";e[\"ZodSymbol\"]=\"ZodSymbol\";e[\"ZodUndefined\"]=\"ZodUndefined\";e[\"ZodNull\"]=\"ZodNull\";e[\"ZodAny\"]=\"ZodAny\";e[\"ZodUnknown\"]=\"ZodUnknown\";e[\"ZodNever\"]=\"ZodNever\";e[\"ZodVoid\"]=\"ZodVoid\";e[\"ZodArray\"]=\"ZodArray\";e[\"ZodObject\"]=\"ZodObject\";e[\"ZodUnion\"]=\"ZodUnion\";e[\"ZodDiscriminatedUnion\"]=\"ZodDiscriminatedUnion\";e[\"ZodIntersection\"]=\"ZodIntersection\";e[\"ZodTuple\"]=\"ZodTuple\";e[\"ZodRecord\"]=\"ZodRecord\";e[\"ZodMap\"]=\"ZodMap\";e[\"ZodSet\"]=\"ZodSet\";e[\"ZodFunction\"]=\"ZodFunction\";e[\"ZodLazy\"]=\"ZodLazy\";e[\"ZodLiteral\"]=\"ZodLiteral\";e[\"ZodEnum\"]=\"ZodEnum\";e[\"ZodEffects\"]=\"ZodEffects\";e[\"ZodNativeEnum\"]=\"ZodNativeEnum\";e[\"ZodOptional\"]=\"ZodOptional\";e[\"ZodNullable\"]=\"ZodNullable\";e[\"ZodDefault\"]=\"ZodDefault\";e[\"ZodCatch\"]=\"ZodCatch\";e[\"ZodPromise\"]=\"ZodPromise\";e[\"ZodBranded\"]=\"ZodBranded\";e[\"ZodPipeline\"]=\"ZodPipeline\";e[\"ZodReadonly\"]=\"ZodReadonly\"})(k||(t.ZodFirstPartyTypeKind=k={}));class Class{constructor(...e){}}const instanceOfType=(e,t={message:`Input not instance of ${e.name}`})=>custom((t=>t instanceof e),t);t[\"instanceof\"]=instanceOfType;const P=ZodString.create;t.string=P;const w=ZodNumber.create;t.number=w;const N=ZodNaN.create;t.nan=N;const O=ZodBigInt.create;t.bigint=O;const A=ZodBoolean.create;t.boolean=A;const S=ZodDate.create;t.date=S;const j=ZodSymbol.create;t.symbol=j;const E=ZodUndefined.create;t.undefined=E;const D=ZodNull.create;t[\"null\"]=D;const L=ZodAny.create;t.any=L;const U=ZodUnknown.create;t.unknown=U;const R=ZodNever.create;t.never=R;const V=ZodVoid.create;t[\"void\"]=V;const M=ZodArray.create;t.array=M;const $=ZodObject.create;t.object=$;const z=ZodObject.strictCreate;t.strictObject=z;const F=ZodUnion.create;t.union=F;const B=ZodDiscriminatedUnion.create;t.discriminatedUnion=B;const K=ZodIntersection.create;t.intersection=K;const q=ZodTuple.create;t.tuple=q;const W=ZodRecord.create;t.record=W;const Y=ZodMap.create;t.map=Y;const J=ZodSet.create;t.set=J;const H=ZodFunction.create;t[\"function\"]=H;const G=ZodLazy.create;t.lazy=G;const X=ZodLiteral.create;t.literal=X;const Q=ZodEnum.create;t[\"enum\"]=Q;const ee=ZodNativeEnum.create;t.nativeEnum=ee;const te=ZodPromise.create;t.promise=te;const se=ZodEffects.create;t.effect=se;t.transformer=se;const re=ZodOptional.create;t.optional=re;const ae=ZodNullable.create;t.nullable=ae;const ne=ZodEffects.createWithPreprocess;t.preprocess=ne;const ie=ZodPipeline.create;t.pipeline=ie;const ostring=()=>P().optional();t.ostring=ostring;const onumber=()=>w().optional();t.onumber=onumber;const oboolean=()=>A().optional();t.oboolean=oboolean;t.coerce={string:e=>ZodString.create({...e,coerce:true}),number:e=>ZodNumber.create({...e,coerce:true}),boolean:e=>ZodBoolean.create({...e,coerce:true}),bigint:e=>ZodBigInt.create({...e,coerce:true}),date:e=>ZodDate.create({...e,coerce:true})};t.NEVER=i.INVALID}};var t={};function __nccwpck_require__(s){var r=t[s];if(r!==undefined){return r.exports}var a=t[s]={exports:{}};var n=true;try{e[s].call(a.exports,a,a.exports,__nccwpck_require__);n=false}finally{if(n)delete t[s]}return a.exports}if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var s=__nccwpck_require__(629);module.exports=s})();"],"names":[],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 5044, "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/dist/compiled/zod-validation-error/index.js"],"sourcesContent":["(()=>{\"use strict\";var r={452:(r,e,o)=>{var t=Object.create;var s=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var a=Object.getPrototypeOf;var u=Object.prototype.hasOwnProperty;var __export=(r,e)=>{for(var o in e)s(r,o,{get:e[o],enumerable:true})};var __copyProps=(r,e,o,t)=>{if(e&&typeof e===\"object\"||typeof e===\"function\"){for(let a of i(e))if(!u.call(r,a)&&a!==o)s(r,a,{get:()=>e[a],enumerable:!(t=n(e,a))||t.enumerable})}return r};var __toESM=(r,e,o)=>(o=r!=null?t(a(r)):{},__copyProps(e||!r||!r.__esModule?s(o,\"default\",{value:r,enumerable:true}):o,r));var __toCommonJS=r=>__copyProps(s({},\"__esModule\",{value:true}),r);var d={};__export(d,{ValidationError:()=>c,createMessageBuilder:()=>createMessageBuilder,errorMap:()=>errorMap,fromError:()=>fromError,fromZodError:()=>fromZodError,fromZodIssue:()=>fromZodIssue,isValidationError:()=>isValidationError,isValidationErrorLike:()=>isValidationErrorLike,isZodErrorLike:()=>isZodErrorLike,toValidationError:()=>toValidationError});r.exports=__toCommonJS(d);function isZodErrorLike(r){return r instanceof Error&&r.name===\"ZodError\"&&\"issues\"in r&&Array.isArray(r.issues)}var c=class extends Error{name;details;constructor(r,e){super(r,e);this.name=\"ZodValidationError\";this.details=getIssuesFromErrorOptions(e)}toString(){return this.message}};function getIssuesFromErrorOptions(r){if(r){const e=r.cause;if(isZodErrorLike(e)){return e.issues}}return[]}function isValidationError(r){return r instanceof c}function isValidationErrorLike(r){return r instanceof Error&&r.name===\"ZodValidationError\"}var f=__toESM(o(788));var p=__toESM(o(788));function isNonEmptyArray(r){return r.length!==0}var l=/[$_\\p{ID_Start}][$\\u200c\\u200d\\p{ID_Continue}]*/u;function joinPath(r){if(r.length===1){return r[0].toString()}return r.reduce(((r,e)=>{if(typeof e===\"number\"){return r+\"[\"+e.toString()+\"]\"}if(e.includes('\"')){return r+'[\"'+escapeQuotes(e)+'\"]'}if(!l.test(e)){return r+'[\"'+e+'\"]'}const o=r.length===0?\"\":\".\";return r+o+e}),\"\")}function escapeQuotes(r){return r.replace(/\"/g,'\\\\\"')}var m=\"; \";var g=99;var E=\"Validation error\";var _=\": \";var v=\", or \";function createMessageBuilder(r={}){const{issueSeparator:e=m,unionSeparator:o=v,prefixSeparator:t=_,prefix:s=E,includePath:n=true,maxIssuesInMessage:i=g}=r;return r=>{const a=r.slice(0,i).map((r=>getMessageFromZodIssue({issue:r,issueSeparator:e,unionSeparator:o,includePath:n}))).join(e);return prefixMessage(a,s,t)}}function getMessageFromZodIssue(r){const{issue:e,issueSeparator:o,unionSeparator:t,includePath:s}=r;if(e.code===p.ZodIssueCode.invalid_union){return e.unionErrors.reduce(((r,e)=>{const n=e.issues.map((r=>getMessageFromZodIssue({issue:r,issueSeparator:o,unionSeparator:t,includePath:s}))).join(o);if(!r.includes(n)){r.push(n)}return r}),[]).join(t)}if(e.code===p.ZodIssueCode.invalid_arguments){return[e.message,...e.argumentsError.issues.map((r=>getMessageFromZodIssue({issue:r,issueSeparator:o,unionSeparator:t,includePath:s})))].join(o)}if(e.code===p.ZodIssueCode.invalid_return_type){return[e.message,...e.returnTypeError.issues.map((r=>getMessageFromZodIssue({issue:r,issueSeparator:o,unionSeparator:t,includePath:s})))].join(o)}if(s&&isNonEmptyArray(e.path)){if(e.path.length===1){const r=e.path[0];if(typeof r===\"number\"){return`${e.message} at index ${r}`}}return`${e.message} at \"${joinPath(e.path)}\"`}return e.message}function prefixMessage(r,e,o){if(e!==null){if(r.length>0){return[e,r].join(o)}return e}if(r.length>0){return r}return E}function fromZodIssue(r,e={}){const o=createMessageBuilderFromOptions(e);const t=o([r]);return new c(t,{cause:new f.ZodError([r])})}function createMessageBuilderFromOptions(r){if(\"messageBuilder\"in r){return r.messageBuilder}return createMessageBuilder(r)}var errorMap=(r,e)=>{const o=fromZodIssue({...r,message:r.message??e.defaultError});return{message:o.message}};function fromZodError(r,e={}){if(!isZodErrorLike(r)){throw new TypeError(`Invalid zodError param; expected instance of ZodError. Did you mean to use the \"${fromError.name}\" method instead?`)}return fromZodErrorWithoutRuntimeCheck(r,e)}function fromZodErrorWithoutRuntimeCheck(r,e={}){const o=r.errors;let t;if(isNonEmptyArray(o)){const r=createMessageBuilderFromOptions2(e);t=r(o)}else{t=r.message}return new c(t,{cause:r})}function createMessageBuilderFromOptions2(r){if(\"messageBuilder\"in r){return r.messageBuilder}return createMessageBuilder(r)}var toValidationError=(r={})=>e=>{if(isZodErrorLike(e)){return fromZodErrorWithoutRuntimeCheck(e,r)}if(e instanceof Error){return new c(e.message,{cause:e})}return new c(\"Unknown error\")};function fromError(r,e={}){return toValidationError(e)(r)}0&&0},788:r=>{r.exports=require(\"next/dist/compiled/zod\")}};var e={};function __nccwpck_require__(o){var t=e[o];if(t!==undefined){return t.exports}var s=e[o]={exports:{}};var n=true;try{r[o](s,s.exports,__nccwpck_require__);n=false}finally{if(n)delete e[o]}return s.exports}if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var o=__nccwpck_require__(452);module.exports=o})();"],"names":[],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 5325, "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/shared/lib/zod.ts"],"sourcesContent":["import type { ZodError } from 'next/dist/compiled/zod'\nimport { ZodParsedType, util, type ZodIssue } from 'next/dist/compiled/zod'\nimport { fromZodError } from 'next/dist/compiled/zod-validation-error'\nimport * as Log from '../../build/output/log'\n\nfunction processZodErrorMessage(issue: ZodIssue) {\n let message = issue.message\n\n let path: string\n\n if (issue.path.length > 0) {\n if (issue.path.length === 1) {\n const identifier = issue.path[0]\n if (typeof identifier === 'number') {\n // The first identifier inside path is a number\n path = `index ${identifier}`\n } else {\n path = `\"${identifier}\"`\n }\n } else {\n // joined path to be shown in the error message\n path = `\"${issue.path.reduce((acc, cur) => {\n if (typeof cur === 'number') {\n // array index\n return `${acc}[${cur}]`\n }\n if (cur.includes('\"')) {\n // escape quotes\n return `${acc}[\"${cur.replaceAll('\"', '\\\\\"')}\"]`\n }\n // dot notation\n const separator = acc.length === 0 ? '' : '.'\n return acc + separator + cur\n }, '')}\"`\n }\n } else {\n path = ''\n }\n\n if (\n issue.code === 'invalid_type' &&\n issue.received === ZodParsedType.undefined\n ) {\n // Missing key in object.\n return `${path} is missing, expected ${issue.expected}`\n }\n\n if (issue.code === 'invalid_enum_value') {\n // Remove \"Invalid enum value\" prefix from zod default error message\n return `Expected ${util.joinValues(issue.options)}, received '${\n issue.received\n }' at ${path}`\n }\n\n return message + (path ? ` at ${path}` : '')\n}\n\nexport function normalizeZodErrors(error: ZodError) {\n return error.issues.flatMap((issue) => {\n const issues = [{ issue, message: processZodErrorMessage(issue) }]\n if ('unionErrors' in issue) {\n for (const unionError of issue.unionErrors) {\n issues.push(...normalizeZodErrors(unionError))\n }\n }\n\n return issues\n })\n}\n\nexport function formatZodError(prefix: string, error: ZodError) {\n return new Error(fromZodError(error, { prefix: prefix }).toString())\n}\n\nexport function reportZodError(prefix: string, error: ZodError) {\n Log.error(formatZodError(prefix, error).message)\n}\n"],"names":["ZodParsedType","util","fromZodError","Log","processZodErrorMessage","issue","message","path","length","identifier","reduce","acc","cur","includes","replaceAll","separator","code","received","undefined","expected","joinValues","options","normalizeZodErrors","error","issues","flatMap","unionError","unionErrors","push","formatZodError","prefix","Error","toString","reportZodError"],"mappings":";;;;;;;;AACA,SAASA,aAAa,EAAEC,IAAI,QAAuB,yBAAwB;AAC3E,SAASC,YAAY,QAAQ,0CAAyC;AACtE,YAAYC,SAAS,yBAAwB;;;;AAE7C,SAASC,uBAAuBC,KAAe;IAC7C,IAAIC,UAAUD,MAAMC,OAAO;IAE3B,IAAIC;IAEJ,IAAIF,MAAME,IAAI,CAACC,MAAM,GAAG,GAAG;QACzB,IAAIH,MAAME,IAAI,CAACC,MAAM,KAAK,GAAG;YAC3B,MAAMC,aAAaJ,MAAME,IAAI,CAAC,EAAE;YAChC,IAAI,OAAOE,eAAe,UAAU;gBAClC,+CAA+C;gBAC/CF,OAAO,CAAC,MAAM,EAAEE,YAAY;YAC9B,OAAO;gBACLF,OAAO,CAAC,CAAC,EAAEE,WAAW,CAAC,CAAC;YAC1B;QACF,OAAO;YACL,+CAA+C;YAC/CF,OAAO,CAAC,CAAC,EAAEF,MAAME,IAAI,CAACG,MAAM,CAAS,CAACC,KAAKC;gBACzC,IAAI,OAAOA,QAAQ,UAAU;oBAC3B,cAAc;oBACd,OAAO,GAAGD,IAAI,CAAC,EAAEC,IAAI,CAAC,CAAC;gBACzB;gBACA,IAAIA,IAAIC,QAAQ,CAAC,MAAM;oBACrB,gBAAgB;oBAChB,OAAO,GAAGF,IAAI,EAAE,EAAEC,IAAIE,UAAU,CAAC,KAAK,OAAO,EAAE,CAAC;gBAClD;gBACA,eAAe;gBACf,MAAMC,YAAYJ,IAAIH,MAAM,KAAK,IAAI,KAAK;gBAC1C,OAAOG,MAAMI,YAAYH;YAC3B,GAAG,IAAI,CAAC,CAAC;QACX;IACF,OAAO;QACLL,OAAO;IACT;IAEA,IACEF,MAAMW,IAAI,KAAK,kBACfX,MAAMY,QAAQ,KAAKjB,gWAAAA,CAAckB,SAAS,EAC1C;QACA,yBAAyB;QACzB,OAAO,GAAGX,KAAK,sBAAsB,EAAEF,MAAMc,QAAQ,EAAE;IACzD;IAEA,IAAId,MAAMW,IAAI,KAAK,sBAAsB;QACvC,oEAAoE;QACpE,OAAO,CAAC,SAAS,EAAEf,uVAAAA,CAAKmB,UAAU,CAACf,MAAMgB,OAAO,EAAE,YAAY,EAC5DhB,MAAMY,QAAQ,CACf,KAAK,EAAEV,MAAM;IAChB;IAEA,OAAOD,UAAWC,CAAAA,OAAO,CAAC,IAAI,EAAEA,MAAM,GAAG,EAAC;AAC5C;AAEO,SAASe,mBAAmBC,KAAe;IAChD,OAAOA,MAAMC,MAAM,CAACC,OAAO,CAAC,CAACpB;QAC3B,MAAMmB,SAAS;YAAC;gBAAEnB;gBAAOC,SAASF,uBAAuBC;YAAO;SAAE;QAClE,IAAI,iBAAiBA,OAAO;YAC1B,KAAK,MAAMqB,cAAcrB,MAAMsB,WAAW,CAAE;gBAC1CH,OAAOI,IAAI,IAAIN,mBAAmBI;YACpC;QACF;QAEA,OAAOF;IACT;AACF;AAEO,SAASK,eAAeC,MAAc,EAAEP,KAAe;IAC5D,OAAO,OAAA,cAA6D,CAA7D,IAAIQ,UAAM7B,qXAAAA,EAAaqB,OAAO;QAAEO,QAAQA;IAAO,GAAGE,QAAQ,KAA1D,qBAAA;eAAA;oBAAA;sBAAA;IAA4D;AACrE;AAEO,SAASC,eAAeH,MAAc,EAAEP,KAAe;IAC5DpB,IAAIoB,wVAAK,CAACM,eAAeC,QAAQP,OAAOjB,OAAO;AACjD","ignoreList":[0]}}, + {"offset": {"line": 5412, "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/build/segment-config/app/app-segment-config.ts"],"sourcesContent":["import { z } from 'next/dist/compiled/zod'\nimport { formatZodError } from '../../../shared/lib/zod'\n\nconst CookieSchema = z\n .object({\n name: z.string(),\n value: z.string(),\n httpOnly: z.boolean().optional(),\n path: z.string().optional(),\n })\n .strict()\n\nconst RuntimeSampleSchema = z\n .object({\n cookies: z.array(CookieSchema).optional(),\n headers: z.array(z.tuple([z.string(), z.string()])).optional(),\n params: z.record(z.union([z.string(), z.array(z.string())])).optional(),\n searchParams: z\n .record(z.union([z.string(), z.array(z.string()), z.undefined()]))\n .optional(),\n })\n .strict()\n\nconst StaticPrefetchSchema = z\n .object({\n mode: z.literal('static'),\n from: z.array(z.string()).optional(),\n expectUnableToVerify: z.boolean().optional(),\n })\n .strict()\n\nconst RuntimePrefetchSchema = z\n .object({\n mode: z.literal('runtime'),\n samples: z.array(RuntimeSampleSchema).min(1),\n from: z.array(z.string()).optional(),\n expectUnableToVerify: z.boolean().optional(),\n })\n .strict()\n\nconst PrefetchSchema = z.discriminatedUnion('mode', [\n StaticPrefetchSchema,\n RuntimePrefetchSchema,\n])\n\nexport type Prefetch = StaticPrefetch | RuntimePrefetch\nexport type PrefetchForTypeCheckInternal = __GenericPrefetch | Prefetch\n// the __GenericPrefetch type is used to avoid type widening issues with\n// our choice to make exports the medium for programming a Next.js application\n// With exports the type is controlled by the module and all we can do is assert on it\n// from a consumer. However with string literals in objects these are by default typed widely\n// and thus cannot match the discriminated union type. If we figure out a better way we should\n// delete the __GenericPrefetch member.\ninterface __GenericPrefetch {\n mode: string\n samples?: Array\n from?: string[]\n expectUnableToVerify?: boolean\n}\ninterface StaticPrefetch {\n mode: 'static'\n from?: string[]\n expectUnableToVerify?: boolean\n}\ninterface RuntimePrefetch {\n mode: 'runtime'\n samples: Array\n from?: string[]\n expectUnableToVerify?: boolean\n}\ntype WideRuntimeSample = {\n cookies?: RuntimeSample['cookies']\n headers?: Array\n params?: RuntimeSample['params']\n searchParams?: RuntimeSample['searchParams']\n}\ntype RuntimeSample = {\n cookies?: Array<{\n name: string\n value: string\n httpOnly?: boolean\n path?: string\n }>\n headers?: Array<[string, string]>\n params?: { [key: string]: string | string[] }\n searchParams?: { [key: string]: string | string[] | undefined }\n}\n\n/**\n * The schema for configuration for a page.\n */\nconst AppSegmentConfigSchema = z.object({\n /**\n * The number of seconds to revalidate the page or false to disable revalidation.\n */\n revalidate: z\n .union([z.number().int().nonnegative(), z.literal(false)])\n .optional(),\n\n /**\n * Whether the page supports dynamic parameters.\n */\n dynamicParams: z.boolean().optional(),\n\n /**\n * The dynamic behavior of the page.\n */\n dynamic: z\n .enum(['auto', 'error', 'force-static', 'force-dynamic'])\n .optional(),\n\n /**\n * The caching behavior of the page.\n */\n fetchCache: z\n .enum([\n 'auto',\n 'default-cache',\n 'only-cache',\n 'force-cache',\n 'force-no-store',\n 'default-no-store',\n 'only-no-store',\n ])\n .optional(),\n\n /**\n * How this segment should be prefetched.\n */\n unstable_prefetch: PrefetchSchema.optional(),\n\n /**\n * The preferred region for the page.\n */\n preferredRegion: z.union([z.string(), z.array(z.string())]).optional(),\n\n /**\n * The runtime to use for the page.\n */\n runtime: z.enum(['edge', 'nodejs']).optional(),\n\n /**\n * The maximum duration for the page in seconds.\n */\n maxDuration: z.number().int().nonnegative().optional(),\n})\n\n/**\n * Parse the app segment config.\n * @param data - The data to parse.\n * @param route - The route of the app.\n * @returns The parsed app segment config.\n */\nexport function parseAppSegmentConfig(\n data: unknown,\n route: string\n): AppSegmentConfig {\n const parsed = AppSegmentConfigSchema.safeParse(data, {\n errorMap: (issue, ctx) => {\n if (issue.path.length === 1) {\n switch (issue.path[0]) {\n case 'revalidate': {\n return {\n message: `Invalid revalidate value ${JSON.stringify(\n ctx.data\n )} on \"${route}\", must be a non-negative number or false`,\n }\n }\n case 'unstable_prefetch': {\n return {\n // @TODO replace this link with a link to the docs when they are written\n message: `Invalid unstable_prefetch value ${JSON.stringify(ctx.data)} on \"${route}\", must be an object with a mode of \"static\" or \"runtime\". Read more at https://nextjs.org/docs/messages/invalid-prefetch-configuration`,\n }\n }\n default:\n }\n }\n\n return { message: ctx.defaultError }\n },\n })\n\n if (!parsed.success) {\n throw formatZodError(\n `Invalid segment configuration options detected for \"${route}\". Read more at https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config`,\n parsed.error\n )\n }\n\n return parsed.data\n}\n\n/**\n * The configuration for a page.\n */\nexport type AppSegmentConfig = {\n /**\n * The revalidation period for the page in seconds, or false to disable ISR.\n */\n revalidate?: number | false\n\n /**\n * Whether the page supports dynamic parameters.\n */\n dynamicParams?: boolean\n\n /**\n * The dynamic behavior of the page.\n */\n dynamic?: 'auto' | 'error' | 'force-static' | 'force-dynamic'\n\n /**\n * The caching behavior of the page.\n */\n fetchCache?:\n | 'auto'\n | 'default-cache'\n | 'default-no-store'\n | 'force-cache'\n | 'force-no-store'\n | 'only-cache'\n | 'only-no-store'\n\n /**\n * How this segment should be prefetched.\n */\n unstable_prefetch?: Prefetch\n\n /**\n * The preferred region for the page.\n */\n preferredRegion?: string | string[]\n\n /**\n * The runtime to use for the page.\n */\n runtime?: 'edge' | 'nodejs'\n\n /**\n * The maximum duration for the page in seconds.\n */\n maxDuration?: number\n}\n\n/**\n * The keys of the configuration for a page.\n *\n * @internal - required to exclude zod types from the build\n */\nexport const AppSegmentConfigSchemaKeys = AppSegmentConfigSchema.keyof().options\n"],"names":["z","formatZodError","CookieSchema","object","name","string","value","httpOnly","boolean","optional","path","strict","RuntimeSampleSchema","cookies","array","headers","tuple","params","record","union","searchParams","undefined","StaticPrefetchSchema","mode","literal","from","expectUnableToVerify","RuntimePrefetchSchema","samples","min","PrefetchSchema","discriminatedUnion","AppSegmentConfigSchema","revalidate","number","int","nonnegative","dynamicParams","dynamic","enum","fetchCache","unstable_prefetch","preferredRegion","runtime","maxDuration","parseAppSegmentConfig","data","route","parsed","safeParse","errorMap","issue","ctx","length","message","JSON","stringify","defaultError","success","error","AppSegmentConfigSchemaKeys","keyof","options"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 5545, "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/checks.ts"],"sourcesContent":["import type { AppRouteRouteModule } from './app-route/module'\nimport type { AppPageRouteModule } from './app-page/module'\nimport type { PagesRouteModule } from './pages/module'\nimport type { PagesAPIRouteModule } from './pages-api/module'\n\nimport type { RouteModule } from './route-module'\n\nimport { RouteKind } from '../route-kind'\n\nexport function isAppRouteRouteModule(\n routeModule: RouteModule\n): routeModule is AppRouteRouteModule {\n return routeModule.definition.kind === RouteKind.APP_ROUTE\n}\n\nexport function isAppPageRouteModule(\n routeModule: RouteModule\n): routeModule is AppPageRouteModule {\n return routeModule.definition.kind === RouteKind.APP_PAGE\n}\n\nexport function isPagesRouteModule(\n routeModule: RouteModule\n): routeModule is PagesRouteModule {\n return routeModule.definition.kind === RouteKind.PAGES\n}\n\nexport function isPagesAPIRouteModule(\n routeModule: RouteModule\n): routeModule is PagesAPIRouteModule {\n return routeModule.definition.kind === RouteKind.PAGES_API\n}\n"],"names":["RouteKind","isAppRouteRouteModule","routeModule","definition","kind","APP_ROUTE","isAppPageRouteModule","APP_PAGE","isPagesRouteModule","PAGES","isPagesAPIRouteModule","PAGES_API"],"mappings":";;;;;;;;;;AAOA,SAASA,SAAS,QAAQ,gBAAe;;AAElC,SAASC,sBACdC,WAAwB;IAExB,OAAOA,YAAYC,UAAU,CAACC,IAAI,KAAKJ,iWAAAA,CAAUK,SAAS;AAC5D;AAEO,SAASC,qBACdJ,WAAwB;IAExB,OAAOA,YAAYC,UAAU,CAACC,IAAI,KAAKJ,iWAAAA,CAAUO,QAAQ;AAC3D;AAEO,SAASC,mBACdN,WAAwB;IAExB,OAAOA,YAAYC,UAAU,CAACC,IAAI,KAAKJ,iWAAAA,CAAUS,KAAK;AACxD;AAEO,SAASC,sBACdR,WAAwB;IAExB,OAAOA,YAAYC,UAAU,CAACC,IAAI,KAAKJ,iWAAAA,CAAUW,SAAS;AAC5D","ignoreList":[0]}}, + {"offset": {"line": 5573, "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/shared/lib/page-path/ensure-leading-slash.ts"],"sourcesContent":["/**\n * For a given page path, this function ensures that there is a leading slash.\n * If there is not a leading slash, one is added, otherwise it is noop.\n */\nexport function ensureLeadingSlash(path: string) {\n return path.startsWith('/') ? path : `/${path}`\n}\n"],"names":["ensureLeadingSlash","path","startsWith"],"mappings":"AAAA;;;CAGC,GACD;;;;AAAO,SAASA,mBAAmBC,IAAY;IAC7C,OAAOA,KAAKC,UAAU,CAAC,OAAOD,OAAO,CAAC,CAAC,EAAEA,MAAM;AACjD","ignoreList":[0]}}, + {"offset": {"line": 5587, "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/shared/lib/router/utils/app-paths.ts"],"sourcesContent":["import { ensureLeadingSlash } from '../../page-path/ensure-leading-slash'\nimport { isGroupSegment } from '../../segment'\n\n/**\n * Normalizes an app route so it represents the actual request path. Essentially\n * performing the following transformations:\n *\n * - `/(dashboard)/user/[id]/page` to `/user/[id]`\n * - `/(dashboard)/account/page` to `/account`\n * - `/user/[id]/page` to `/user/[id]`\n * - `/account/page` to `/account`\n * - `/page` to `/`\n * - `/(dashboard)/user/[id]/route` to `/user/[id]`\n * - `/(dashboard)/account/route` to `/account`\n * - `/user/[id]/route` to `/user/[id]`\n * - `/account/route` to `/account`\n * - `/route` to `/`\n * - `/` to `/`\n *\n * @param route the app route to normalize\n * @returns the normalized pathname\n */\nexport function normalizeAppPath(route: string) {\n return ensureLeadingSlash(\n route.split('/').reduce((pathname, segment, index, segments) => {\n // Empty segments are ignored.\n if (!segment) {\n return pathname\n }\n\n // Groups are ignored.\n if (isGroupSegment(segment)) {\n return pathname\n }\n\n // Parallel segments are ignored.\n if (segment[0] === '@') {\n return pathname\n }\n\n // The last segment (if it's a leaf) should be ignored.\n if (\n (segment === 'page' || segment === 'route') &&\n index === segments.length - 1\n ) {\n return pathname\n }\n\n return `${pathname}/${segment}`\n }, '')\n )\n}\n\n/**\n * Strips the `.rsc` extension if it's in the pathname.\n * Since this function is used on full urls it checks `?` for searchParams handling.\n */\nexport function normalizeRscURL(url: string) {\n return url.replace(\n /\\.rsc($|\\?)/,\n // $1 ensures `?` is preserved\n '$1'\n )\n}\n"],"names":["ensureLeadingSlash","isGroupSegment","normalizeAppPath","route","split","reduce","pathname","segment","index","segments","length","normalizeRscURL","url","replace"],"mappings":";;;;;;AAAA,SAASA,kBAAkB,QAAQ,uCAAsC;AACzE,SAASC,cAAc,QAAQ,gBAAe;;;AAqBvC,SAASC,iBAAiBC,KAAa;IAC5C,WAAOH,8YAAAA,EACLG,MAAMC,KAAK,CAAC,KAAKC,MAAM,CAAC,CAACC,UAAUC,SAASC,OAAOC;QACjD,8BAA8B;QAC9B,IAAI,CAACF,SAAS;YACZ,OAAOD;QACT;QAEA,sBAAsB;QACtB,QAAIL,uWAAAA,EAAeM,UAAU;YAC3B,OAAOD;QACT;QAEA,iCAAiC;QACjC,IAAIC,OAAO,CAAC,EAAE,KAAK,KAAK;YACtB,OAAOD;QACT;QAEA,uDAAuD;QACvD,IACGC,CAAAA,YAAY,UAAUA,YAAY,OAAM,KACzCC,UAAUC,SAASC,MAAM,GAAG,GAC5B;YACA,OAAOJ;QACT;QAEA,OAAO,GAAGA,SAAS,CAAC,EAAEC,SAAS;IACjC,GAAG;AAEP;AAMO,SAASI,gBAAgBC,GAAW;IACzC,OAAOA,IAAIC,OAAO,CAChB,eACA,AACA,8BAD8B;AAGlC","ignoreList":[0]}}, + {"offset": {"line": 5625, "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/shared/lib/router/utils/interception-routes.ts"],"sourcesContent":["import { normalizeAppPath } from './app-paths'\n\n// order matters here, the first match will be used\nexport const INTERCEPTION_ROUTE_MARKERS = [\n '(..)(..)',\n '(.)',\n '(..)',\n '(...)',\n] as const\n\nexport function isInterceptionRouteAppPath(path: string): boolean {\n // TODO-APP: add more serious validation\n return (\n path\n .split('/')\n .find((segment) =>\n INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n ) !== undefined\n )\n}\n\ntype InterceptionRouteInformation = {\n /**\n * The intercepting route. This is the route that is being intercepted or the\n * route that the user was coming from. This is matched by the Next-Url\n * header.\n */\n interceptingRoute: string\n\n /**\n * The intercepted route. This is the route that is being intercepted or the\n * route that the user is going to. This is matched by the request pathname.\n */\n interceptedRoute: string\n}\n\nexport function extractInterceptionRouteInformation(\n path: string\n): InterceptionRouteInformation {\n let interceptingRoute: string | undefined\n let marker: (typeof INTERCEPTION_ROUTE_MARKERS)[number] | undefined\n let interceptedRoute: string | undefined\n\n for (const segment of path.split('/')) {\n marker = INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n if (marker) {\n ;[interceptingRoute, interceptedRoute] = path.split(marker, 2)\n break\n }\n }\n\n if (!interceptingRoute || !marker || !interceptedRoute) {\n throw new Error(\n `Invalid interception route: ${path}. Must be in the format //(..|...|..)(..)/`\n )\n }\n\n interceptingRoute = normalizeAppPath(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed\n\n switch (marker) {\n case '(.)':\n // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route\n if (interceptingRoute === '/') {\n interceptedRoute = `/${interceptedRoute}`\n } else {\n interceptedRoute = interceptingRoute + '/' + interceptedRoute\n }\n break\n case '(..)':\n // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route\n if (interceptingRoute === '/') {\n throw new Error(\n `Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`\n )\n }\n interceptedRoute = interceptingRoute\n .split('/')\n .slice(0, -1)\n .concat(interceptedRoute)\n .join('/')\n break\n case '(...)':\n // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route\n interceptedRoute = '/' + interceptedRoute\n break\n case '(..)(..)':\n // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route\n\n const splitInterceptingRoute = interceptingRoute.split('/')\n if (splitInterceptingRoute.length <= 2) {\n throw new Error(\n `Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`\n )\n }\n\n interceptedRoute = splitInterceptingRoute\n .slice(0, -2)\n .concat(interceptedRoute)\n .join('/')\n break\n default:\n throw new Error('Invariant: unexpected marker')\n }\n\n return { interceptingRoute, interceptedRoute }\n}\n"],"names":["normalizeAppPath","INTERCEPTION_ROUTE_MARKERS","isInterceptionRouteAppPath","path","split","find","segment","m","startsWith","undefined","extractInterceptionRouteInformation","interceptingRoute","marker","interceptedRoute","Error","slice","concat","join","splitInterceptingRoute","length"],"mappings":";;;;;;;;AAAA,SAASA,gBAAgB,QAAQ,cAAa;;AAGvC,MAAMC,6BAA6B;IACxC;IACA;IACA;IACA;CACD,CAAS;AAEH,SAASC,2BAA2BC,IAAY;IACrD,wCAAwC;IACxC,OACEA,KACGC,KAAK,CAAC,KACNC,IAAI,CAAC,CAACC,UACLL,2BAA2BI,IAAI,CAAC,CAACE,IAAMD,QAAQE,UAAU,CAACD,SACtDE;AAEZ;AAiBO,SAASC,oCACdP,IAAY;IAEZ,IAAIQ;IACJ,IAAIC;IACJ,IAAIC;IAEJ,KAAK,MAAMP,WAAWH,KAAKC,KAAK,CAAC,KAAM;QACrCQ,SAASX,2BAA2BI,IAAI,CAAC,CAACE,IAAMD,QAAQE,UAAU,CAACD;QACnE,IAAIK,QAAQ;;YACT,CAACD,mBAAmBE,iBAAiB,GAAGV,KAAKC,KAAK,CAACQ,QAAQ;YAC5D;QACF;IACF;IAEA,IAAI,CAACD,qBAAqB,CAACC,UAAU,CAACC,kBAAkB;QACtD,MAAM,OAAA,cAEL,CAFK,IAAIC,MACR,CAAC,4BAA4B,EAAEX,KAAK,iFAAiF,CAAC,GADlH,qBAAA;mBAAA;wBAAA;0BAAA;QAEN;IACF;IAEAQ,wBAAoBX,iYAAAA,EAAiBW,mBAAmB,iDAAiD;;IAEzG,OAAQC;QACN,KAAK;YACH,oIAAoI;YACpI,IAAID,sBAAsB,KAAK;gBAC7BE,mBAAmB,CAAC,CAAC,EAAEA,kBAAkB;YAC3C,OAAO;gBACLA,mBAAmBF,oBAAoB,MAAME;YAC/C;YACA;QACF,KAAK;YACH,uHAAuH;YACvH,IAAIF,sBAAsB,KAAK;gBAC7B,MAAM,OAAA,cAEL,CAFK,IAAIG,MACR,CAAC,4BAA4B,EAAEX,KAAK,4DAA4D,CAAC,GAD7F,qBAAA;2BAAA;gCAAA;kCAAA;gBAEN;YACF;YACAU,mBAAmBF,kBAChBP,KAAK,CAAC,KACNW,KAAK,CAAC,GAAG,CAAC,GACVC,MAAM,CAACH,kBACPI,IAAI,CAAC;YACR;QACF,KAAK;YACH,kIAAkI;YAClIJ,mBAAmB,MAAMA;YACzB;QACF,KAAK;YACH,iIAAiI;YAEjI,MAAMK,yBAAyBP,kBAAkBP,KAAK,CAAC;YACvD,IAAIc,uBAAuBC,MAAM,IAAI,GAAG;gBACtC,MAAM,OAAA,cAEL,CAFK,IAAIL,MACR,CAAC,4BAA4B,EAAEX,KAAK,+DAA+D,CAAC,GADhG,qBAAA;2BAAA;gCAAA;kCAAA;gBAEN;YACF;YAEAU,mBAAmBK,uBAChBH,KAAK,CAAC,GAAG,CAAC,GACVC,MAAM,CAACH,kBACPI,IAAI,CAAC;YACR;QACF;YACE,MAAM,OAAA,cAAyC,CAAzC,IAAIH,MAAM,iCAAV,qBAAA;uBAAA;4BAAA;8BAAA;YAAwC;IAClD;IAEA,OAAO;QAAEH;QAAmBE;IAAiB;AAC/C","ignoreList":[0]}}, + {"offset": {"line": 5718, "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/shared/lib/router/utils/get-segment-param.tsx"],"sourcesContent":["import { INTERCEPTION_ROUTE_MARKERS } from './interception-routes'\nimport type { DynamicParamTypes } from '../../app-router-types'\n\n/**\n * Parse dynamic route segment to type of parameter\n */\nexport function getSegmentParam(segment: string): {\n param: string\n type: DynamicParamTypes\n} | null {\n const interceptionMarker = INTERCEPTION_ROUTE_MARKERS.find((marker) =>\n segment.startsWith(marker)\n )\n\n // if an interception marker is part of the path segment, we need to jump ahead\n // to the relevant portion for param parsing\n if (interceptionMarker) {\n segment = segment.slice(interceptionMarker.length)\n }\n\n if (segment.startsWith('[[...') && segment.endsWith(']]')) {\n return {\n // TODO-APP: Optional catchall does not currently work with parallel routes,\n // so for now aren't handling a potential interception marker.\n type: 'optional-catchall',\n param: segment.slice(5, -2),\n }\n }\n\n if (segment.startsWith('[...') && segment.endsWith(']')) {\n return {\n type: interceptionMarker\n ? `catchall-intercepted-${interceptionMarker}`\n : 'catchall',\n param: segment.slice(4, -1),\n }\n }\n\n if (segment.startsWith('[') && segment.endsWith(']')) {\n return {\n type: interceptionMarker\n ? `dynamic-intercepted-${interceptionMarker}`\n : 'dynamic',\n param: segment.slice(1, -1),\n }\n }\n\n return null\n}\n\nexport function isCatchAll(\n type: DynamicParamTypes\n): type is\n | 'catchall'\n | 'catchall-intercepted-(..)(..)'\n | 'catchall-intercepted-(.)'\n | 'catchall-intercepted-(..)'\n | 'catchall-intercepted-(...)'\n | 'optional-catchall' {\n return (\n type === 'catchall' ||\n type === 'catchall-intercepted-(..)(..)' ||\n type === 'catchall-intercepted-(.)' ||\n type === 'catchall-intercepted-(..)' ||\n type === 'catchall-intercepted-(...)' ||\n type === 'optional-catchall'\n )\n}\n\nexport function getParamProperties(paramType: DynamicParamTypes): {\n repeat: boolean\n optional: boolean\n} {\n let repeat = false\n let optional = false\n\n switch (paramType) {\n case 'catchall':\n case 'catchall-intercepted-(..)(..)':\n case 'catchall-intercepted-(.)':\n case 'catchall-intercepted-(..)':\n case 'catchall-intercepted-(...)':\n repeat = true\n break\n case 'optional-catchall':\n repeat = true\n optional = true\n break\n case 'dynamic':\n case 'dynamic-intercepted-(..)(..)':\n case 'dynamic-intercepted-(.)':\n case 'dynamic-intercepted-(..)':\n case 'dynamic-intercepted-(...)':\n break\n default:\n paramType satisfies never\n }\n\n return { repeat, optional }\n}\n"],"names":["INTERCEPTION_ROUTE_MARKERS","getSegmentParam","segment","interceptionMarker","find","marker","startsWith","slice","length","endsWith","type","param","isCatchAll","getParamProperties","paramType","repeat","optional"],"mappings":";;;;;;;;AAAA,SAASA,0BAA0B,QAAQ,wBAAuB;;AAM3D,SAASC,gBAAgBC,OAAe;IAI7C,MAAMC,qBAAqBH,qZAAAA,CAA2BI,IAAI,CAAC,CAACC,SAC1DH,QAAQI,UAAU,CAACD;IAGrB,+EAA+E;IAC/E,4CAA4C;IAC5C,IAAIF,oBAAoB;QACtBD,UAAUA,QAAQK,KAAK,CAACJ,mBAAmBK,MAAM;IACnD;IAEA,IAAIN,QAAQI,UAAU,CAAC,YAAYJ,QAAQO,QAAQ,CAAC,OAAO;QACzD,OAAO;YACL,4EAA4E;YAC5E,8DAA8D;YAC9DC,MAAM;YACNC,OAAOT,QAAQK,KAAK,CAAC,GAAG,CAAC;QAC3B;IACF;IAEA,IAAIL,QAAQI,UAAU,CAAC,WAAWJ,QAAQO,QAAQ,CAAC,MAAM;QACvD,OAAO;YACLC,MAAMP,qBACF,CAAC,qBAAqB,EAAEA,oBAAoB,GAC5C;YACJQ,OAAOT,QAAQK,KAAK,CAAC,GAAG,CAAC;QAC3B;IACF;IAEA,IAAIL,QAAQI,UAAU,CAAC,QAAQJ,QAAQO,QAAQ,CAAC,MAAM;QACpD,OAAO;YACLC,MAAMP,qBACF,CAAC,oBAAoB,EAAEA,oBAAoB,GAC3C;YACJQ,OAAOT,QAAQK,KAAK,CAAC,GAAG,CAAC;QAC3B;IACF;IAEA,OAAO;AACT;AAEO,SAASK,WACdF,IAAuB;IAQvB,OACEA,SAAS,cACTA,SAAS,mCACTA,SAAS,8BACTA,SAAS,+BACTA,SAAS,gCACTA,SAAS;AAEb;AAEO,SAASG,mBAAmBC,SAA4B;IAI7D,IAAIC,SAAS;IACb,IAAIC,WAAW;IAEf,OAAQF;QACN,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACHC,SAAS;YACT;QACF,KAAK;YACHA,SAAS;YACTC,WAAW;YACX;QACF,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;YACH;QACF;YACEF;IACJ;IAEA,OAAO;QAAEC;QAAQC;IAAS;AAC5B","ignoreList":[0]}}, + {"offset": {"line": 5793, "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/build/static-paths/utils.ts"],"sourcesContent":["import type { DynamicParamTypes } from '../../shared/lib/app-router-types'\nimport type { FallbackRouteParam } from './types'\n\n/**\n * Encodes a parameter value using the provided encoder.\n *\n * @param value - The value to encode.\n * @param encoder - The encoder to use.\n * @returns The encoded value.\n */\nexport function encodeParam(\n value: string | string[],\n encoder: (value: string) => string\n) {\n let replaceValue: string\n if (Array.isArray(value)) {\n replaceValue = value.map(encoder).join('/')\n } else {\n replaceValue = encoder(value)\n }\n\n return replaceValue\n}\n\n/**\n * Normalizes a pathname to a consistent format.\n *\n * @param pathname - The pathname to normalize.\n * @returns The normalized pathname.\n */\nexport function normalizePathname(pathname: string) {\n return pathname.replace(/\\\\/g, '/').replace(/(?!^)\\/$/, '')\n}\n\n/**\n * Creates a fallback route param.\n *\n * @param paramName - The name of the param.\n * @param isParallelRouteParam - Whether this is a parallel route param or\n * descends from a parallel route param.\n * @returns The fallback route param.\n */\nexport function createFallbackRouteParam(\n paramName: string,\n paramType: DynamicParamTypes,\n isParallelRouteParam: boolean\n): FallbackRouteParam {\n return { paramName, paramType, isParallelRouteParam }\n}\n"],"names":["encodeParam","value","encoder","replaceValue","Array","isArray","map","join","normalizePathname","pathname","replace","createFallbackRouteParam","paramName","paramType","isParallelRouteParam"],"mappings":"AAGA;;;;;;CAMC,GACD;;;;;;;;AAAO,SAASA,YACdC,KAAwB,EACxBC,OAAkC;IAElC,IAAIC;IACJ,IAAIC,MAAMC,OAAO,CAACJ,QAAQ;QACxBE,eAAeF,MAAMK,GAAG,CAACJ,SAASK,IAAI,CAAC;IACzC,OAAO;QACLJ,eAAeD,QAAQD;IACzB;IAEA,OAAOE;AACT;AAQO,SAASK,kBAAkBC,QAAgB;IAChD,OAAOA,SAASC,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,YAAY;AAC1D;AAUO,SAASC,yBACdC,SAAiB,EACjBC,SAA4B,EAC5BC,oBAA6B;IAE7B,OAAO;QAAEF;QAAWC;QAAWC;IAAqB;AACtD","ignoreList":[0]}}, + {"offset": {"line": 5830, "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/build/segment-config/app/app-segments.ts"],"sourcesContent":["import type { Params } from '../../../server/request/params'\nimport type { AppPageRouteModule } from '../../../server/route-modules/app-page/module.compiled'\nimport type { AppRouteRouteModule } from '../../../server/route-modules/app-route/module.compiled'\nimport {\n type AppSegmentConfig,\n parseAppSegmentConfig,\n} from './app-segment-config'\n\nimport { InvariantError } from '../../../shared/lib/invariant-error'\nimport {\n isAppRouteRouteModule,\n isAppPageRouteModule,\n} from '../../../server/route-modules/checks'\nimport { isClientReference } from '../../../lib/client-and-server-references'\nimport { getSegmentParam } from '../../../shared/lib/router/utils/get-segment-param'\nimport {\n getLayoutOrPageModule,\n type LoaderTree,\n} from '../../../server/lib/app-dir-module'\nimport { PAGE_SEGMENT_KEY } from '../../../shared/lib/segment'\nimport type { FallbackRouteParam } from '../../static-paths/types'\nimport { createFallbackRouteParam } from '../../static-paths/utils'\nimport type { DynamicParamTypes } from '../../../shared/lib/app-router-types'\n\ntype GenerateStaticParams = (options: { params?: Params }) => Promise\n\n/**\n * Parses the app config and attaches it to the segment.\n */\nfunction attach(segment: AppSegment, userland: unknown, route: string) {\n // If the userland is not an object, then we can't do anything with it.\n if (typeof userland !== 'object' || userland === null) {\n return\n }\n\n // Try to parse the application configuration.\n const config = parseAppSegmentConfig(userland, route)\n\n // If there was any keys on the config, then attach it to the segment.\n if (Object.keys(config).length > 0) {\n segment.config = config\n }\n\n if (\n 'generateStaticParams' in userland &&\n typeof userland.generateStaticParams === 'function'\n ) {\n segment.generateStaticParams =\n userland.generateStaticParams as GenerateStaticParams\n\n // Validate that `generateStaticParams` makes sense in this context.\n if (segment.config?.runtime === 'edge') {\n throw new Error(\n 'Edge runtime is not supported with `generateStaticParams`.'\n )\n }\n }\n}\n\nexport type AppSegment = {\n name: string\n paramName: string | undefined\n paramType: DynamicParamTypes | undefined\n filePath: string | undefined\n config: AppSegmentConfig | undefined\n isDynamicSegment: boolean\n generateStaticParams: GenerateStaticParams | undefined\n\n /**\n * Whether this segment is a parallel route segment or descends from a\n * parallel route segment.\n */\n isParallelRouteSegment: boolean | undefined\n}\n\n/**\n * Walks the loader tree and collects the generate parameters for each segment.\n *\n * @param routeModule the app page route module\n * @returns the segments for the app page route module\n */\nasync function collectAppPageSegments(routeModule: AppPageRouteModule) {\n // We keep track of unique segments, since with parallel routes, it's possible\n // to see the same segment multiple times.\n const uniqueSegments = new Map()\n\n // Queue will store tuples of [loaderTree, currentSegments, isParallelRouteSegment]\n type QueueItem = [\n loaderTree: LoaderTree,\n currentSegments: AppSegment[],\n isParallelRouteSegment: boolean,\n ]\n const queue: QueueItem[] = [[routeModule.userland.loaderTree, [], false]]\n\n while (queue.length > 0) {\n const [loaderTree, currentSegments, isParallelRouteSegment] = queue.shift()!\n const [name, parallelRoutes] = loaderTree\n\n // Process current node\n const { mod: userland, filePath } = await getLayoutOrPageModule(loaderTree)\n const isClientComponent = userland && isClientReference(userland)\n\n const { param: paramName, type: paramType } = getSegmentParam(name) ?? {}\n\n const segment: AppSegment = {\n name,\n paramName,\n paramType,\n filePath,\n config: undefined,\n isDynamicSegment: !!paramName,\n generateStaticParams: undefined,\n isParallelRouteSegment,\n }\n\n // Only server components can have app segment configurations\n if (!isClientComponent) {\n attach(segment, userland, routeModule.definition.pathname)\n }\n\n // Create a unique key for the segment\n const segmentKey = getSegmentKey(segment)\n if (!uniqueSegments.has(segmentKey)) {\n uniqueSegments.set(segmentKey, segment)\n }\n\n const updatedSegments = [...currentSegments, segment]\n\n // If this is a page segment, we've reached a leaf node\n if (name === PAGE_SEGMENT_KEY) {\n // Add all segments in the current path, preferring non-parallel segments\n updatedSegments.forEach((seg) => {\n const key = getSegmentKey(seg)\n if (!uniqueSegments.has(key)) {\n uniqueSegments.set(key, seg)\n }\n })\n }\n\n // Add all parallel routes to the queue\n for (const parallelRouteKey in parallelRoutes) {\n const parallelRoute = parallelRoutes[parallelRouteKey]\n queue.push([\n parallelRoute,\n updatedSegments,\n // A parallel route segment is one that descends from a segment that is\n // not children or descends from a parallel route segment.\n isParallelRouteSegment || parallelRouteKey !== 'children',\n ])\n }\n }\n\n return Array.from(uniqueSegments.values())\n}\n\nfunction getSegmentKey(segment: AppSegment) {\n return `${segment.name}-${segment.filePath ?? ''}-${segment.paramName ?? ''}-${segment.isParallelRouteSegment ? 'pr' : 'np'}`\n}\n\n/**\n * Collects the segments for a given app route module.\n *\n * @param routeModule the app route module\n * @returns the segments for the app route module\n */\nfunction collectAppRouteSegments(\n routeModule: AppRouteRouteModule\n): AppSegment[] {\n // Get the pathname parts, slice off the first element (which is empty).\n const parts = routeModule.definition.pathname.split('/').slice(1)\n if (parts.length === 0) {\n throw new InvariantError('Expected at least one segment')\n }\n\n // Generate all the segments.\n const segments: AppSegment[] = parts.map((name) => {\n const { param: paramName, type: paramType } = getSegmentParam(name) ?? {}\n\n return {\n name,\n paramName,\n paramType,\n filePath: undefined,\n isDynamicSegment: !!paramName,\n config: undefined,\n generateStaticParams: undefined,\n isParallelRouteSegment: undefined,\n } satisfies AppSegment\n })\n\n // We know we have at least one, we verified this above. We should get the\n // last segment which represents the root route module.\n const segment = segments[segments.length - 1]\n\n segment.filePath = routeModule.definition.filename\n\n // Extract the segment config from the userland module.\n attach(segment, routeModule.userland, routeModule.definition.pathname)\n\n return segments\n}\n\n/**\n * Collects the segments for a given route module.\n *\n * @param components the loaded components\n * @returns the segments for the route module\n */\nexport function collectSegments(\n routeModule: AppRouteRouteModule | AppPageRouteModule\n): Promise | AppSegment[] {\n if (isAppRouteRouteModule(routeModule)) {\n return collectAppRouteSegments(routeModule)\n }\n\n if (isAppPageRouteModule(routeModule)) {\n return collectAppPageSegments(routeModule)\n }\n\n throw new InvariantError(\n 'Expected a route module to be one of app route or page'\n )\n}\n\n/**\n * Collects the fallback route params for a given app page route module. This is\n * a variant of the `collectSegments` function that only collects the fallback\n * route params without importing anything.\n *\n * @param routeModule the app page route module\n * @returns the fallback route params for the app page route module\n */\nexport function collectFallbackRouteParams(\n routeModule: AppPageRouteModule\n): readonly FallbackRouteParam[] {\n const uniqueSegments = new Map()\n\n // Queue will store tuples of [loaderTree, isParallelRouteSegment]\n type QueueItem = [loaderTree: LoaderTree, isParallelRouteSegment: boolean]\n const queue: QueueItem[] = [[routeModule.userland.loaderTree, false]]\n\n while (queue.length > 0) {\n const [loaderTree, isParallelRouteSegment] = queue.shift()!\n const [name, parallelRoutes] = loaderTree\n\n // Handle this segment (if it's a dynamic segment param).\n const segmentParam = getSegmentParam(name)\n if (segmentParam) {\n const key = `${name}-${segmentParam.param}-${isParallelRouteSegment ? 'pr' : 'np'}`\n if (!uniqueSegments.has(key)) {\n uniqueSegments.set(\n key,\n createFallbackRouteParam(\n segmentParam.param,\n segmentParam.type,\n isParallelRouteSegment\n )\n )\n }\n }\n\n // Add all of this segment's parallel routes to the queue.\n for (const parallelRouteKey in parallelRoutes) {\n const parallelRoute = parallelRoutes[parallelRouteKey]\n queue.push([\n parallelRoute,\n // A parallel route segment is one that descends from a segment that is\n // not children or descends from a parallel route segment.\n isParallelRouteSegment || parallelRouteKey !== 'children',\n ])\n }\n }\n\n return Array.from(uniqueSegments.values())\n}\n"],"names":["parseAppSegmentConfig","InvariantError","isAppRouteRouteModule","isAppPageRouteModule","isClientReference","getSegmentParam","getLayoutOrPageModule","PAGE_SEGMENT_KEY","createFallbackRouteParam","attach","segment","userland","route","config","Object","keys","length","generateStaticParams","runtime","Error","collectAppPageSegments","routeModule","uniqueSegments","Map","queue","loaderTree","currentSegments","isParallelRouteSegment","shift","name","parallelRoutes","mod","filePath","isClientComponent","param","paramName","type","paramType","undefined","isDynamicSegment","definition","pathname","segmentKey","getSegmentKey","has","set","updatedSegments","forEach","seg","key","parallelRouteKey","parallelRoute","push","Array","from","values","collectAppRouteSegments","parts","split","slice","segments","map","filename","collectSegments","collectFallbackRouteParams","segmentParam"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 6037, "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/shared/lib/utils.ts"],"sourcesContent":["import type { HtmlProps } from './html-context.shared-runtime'\nimport type { ComponentType, JSX } from 'react'\nimport type { DomainLocale } from '../../server/config'\nimport type { Env } from '@next/env'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextRouter } from './router/router'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { PreviewData } from '../../types'\nimport type { COMPILER_NAMES } from './constants'\nimport type fs from 'fs'\n\nexport type NextComponentType<\n Context extends BaseContext = NextPageContext,\n InitialProps = {},\n Props = {},\n> = ComponentType & {\n /**\n * Used for initial page load data population. Data returned from `getInitialProps` is serialized when server rendered.\n * Make sure to return plain `Object` without using `Date`, `Map`, `Set`.\n * @param context Context of `page`\n */\n getInitialProps?(context: Context): InitialProps | Promise\n}\n\nexport type DocumentType = NextComponentType<\n DocumentContext,\n DocumentInitialProps,\n DocumentProps\n>\n\nexport type AppType

= NextComponentType<\n AppContextType,\n P,\n AppPropsType\n>\n\nexport type AppTreeType = ComponentType<\n AppInitialProps & { [name: string]: any }\n>\n\n/**\n * Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team.\n * https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting\n */\nexport const WEB_VITALS = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'] as const\nexport type NextWebVitalsMetric = {\n id: string\n startTime: number\n value: number\n attribution?: { [key: string]: unknown }\n} & (\n | {\n label: 'web-vital'\n name: (typeof WEB_VITALS)[number]\n }\n | {\n label: 'custom'\n name:\n | 'Next.js-hydration'\n | 'Next.js-route-change-to-render'\n | 'Next.js-render'\n }\n)\n\nexport type Enhancer = (Component: C) => C\n\nexport type ComponentsEnhancer =\n | {\n enhanceApp?: Enhancer\n enhanceComponent?: Enhancer\n }\n | Enhancer\n\nexport type RenderPageResult = {\n html: string\n head?: Array\n}\n\nexport type RenderPage = (\n options?: ComponentsEnhancer\n) => DocumentInitialProps | Promise\n\nexport type BaseContext = {\n res?: ServerResponse\n [k: string]: any\n}\n\nexport type NEXT_DATA = {\n props: Record\n page: string\n query: ParsedUrlQuery\n buildId: string\n assetPrefix?: string\n nextExport?: boolean\n autoExport?: boolean\n isFallback?: boolean\n isExperimentalCompile?: boolean\n dynamicIds?: (string | number)[]\n err?: Error & {\n statusCode?: number\n source?: typeof COMPILER_NAMES.server | typeof COMPILER_NAMES.edgeServer\n }\n gsp?: boolean\n gssp?: boolean\n customServer?: boolean\n gip?: boolean\n appGip?: boolean\n locale?: string\n locales?: readonly string[]\n defaultLocale?: string\n domainLocales?: readonly DomainLocale[]\n scriptLoader?: any[]\n isPreview?: boolean\n notFoundSrcPage?: string\n}\n\n/**\n * `Next` context\n */\nexport interface NextPageContext {\n /**\n * Error object if encountered during rendering\n */\n err?: (Error & { statusCode?: number }) | null\n /**\n * `HTTP` request object.\n */\n req?: IncomingMessage\n /**\n * `HTTP` response object.\n */\n res?: ServerResponse\n /**\n * Path section of `URL`.\n */\n pathname: string\n /**\n * Query string section of `URL` parsed as an object.\n */\n query: ParsedUrlQuery\n /**\n * `String` of the actual path including query.\n */\n asPath?: string\n /**\n * The currently active locale\n */\n locale?: string\n /**\n * All configured locales\n */\n locales?: readonly string[]\n /**\n * The configured default locale\n */\n defaultLocale?: string\n /**\n * `Component` the tree of the App to use if needing to render separately\n */\n AppTree: AppTreeType\n}\n\nexport type AppContextType = {\n Component: NextComponentType\n AppTree: AppTreeType\n ctx: NextPageContext\n router: Router\n}\n\nexport type AppInitialProps = {\n pageProps: PageProps\n}\n\nexport type AppPropsType<\n Router extends NextRouter = NextRouter,\n PageProps = {},\n> = AppInitialProps & {\n Component: NextComponentType\n router: Router\n __N_SSG?: boolean\n __N_SSP?: boolean\n}\n\nexport type DocumentContext = NextPageContext & {\n renderPage: RenderPage\n defaultGetInitialProps(\n ctx: DocumentContext,\n options?: { nonce?: string }\n ): Promise\n}\n\nexport type DocumentInitialProps = RenderPageResult & {\n styles?: React.ReactElement[] | Iterable | JSX.Element\n}\n\nexport type DocumentProps = DocumentInitialProps & HtmlProps\n\n/**\n * Next `API` route request\n */\nexport interface NextApiRequest extends IncomingMessage {\n /**\n * Object of `query` values from url\n */\n query: Partial<{\n [key: string]: string | string[]\n }>\n /**\n * Object of `cookies` from header\n */\n cookies: Partial<{\n [key: string]: string\n }>\n\n body: any\n\n env: Env\n\n draftMode?: boolean\n\n preview?: boolean\n /**\n * Preview data set on the request, if any\n * */\n previewData?: PreviewData\n}\n\n/**\n * Send body of response\n */\ntype Send = (body: T) => void\n\n/**\n * Next `API` route response\n */\nexport type NextApiResponse = ServerResponse & {\n /**\n * Send data `any` data in response\n */\n send: Send\n /**\n * Send data `json` data in response\n */\n json: Send\n status: (statusCode: number) => NextApiResponse\n redirect(url: string): NextApiResponse\n redirect(status: number, url: string): NextApiResponse\n\n /**\n * Set draft mode\n */\n setDraftMode: (options: { enable: boolean }) => NextApiResponse\n\n /**\n * Set preview data for Next.js' prerender mode\n */\n setPreviewData: (\n data: object | string,\n options?: {\n /**\n * Specifies the number (in seconds) for the preview session to last for.\n * The given number will be converted to an integer by rounding down.\n * By default, no maximum age is set and the preview session finishes\n * when the client shuts down (browser is closed).\n */\n maxAge?: number\n /**\n * Specifies the path for the preview session to work under. By default,\n * the path is considered the \"default path\", i.e., any pages under \"/\".\n */\n path?: string\n }\n ) => NextApiResponse\n\n /**\n * Clear preview data for Next.js' prerender mode\n */\n clearPreviewData: (options?: { path?: string }) => NextApiResponse\n\n /**\n * Revalidate a specific page and regenerate it using On-Demand Incremental\n * Static Regeneration.\n * The path should be an actual path, not a rewritten path. E.g. for\n * \"/blog/[slug]\" this should be \"/blog/post-1\".\n * @link https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation-with-revalidatepath\n */\n revalidate: (\n urlPath: string,\n opts?: {\n unstable_onlyGenerated?: boolean\n }\n ) => Promise\n}\n\n/**\n * Next `API` route handler\n */\nexport type NextApiHandler = (\n req: NextApiRequest,\n res: NextApiResponse\n) => unknown | Promise\n\n/**\n * Utils\n */\nexport function execOnce ReturnType>(\n fn: T\n): T {\n let used = false\n let result: ReturnType\n\n return ((...args: any[]) => {\n if (!used) {\n used = true\n result = fn(...args)\n }\n return result\n }) as T\n}\n\n// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1\n// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\nconst ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/\nexport const isAbsoluteUrl = (url: string) => ABSOLUTE_URL_REGEX.test(url)\n\nexport function getLocationOrigin() {\n const { protocol, hostname, port } = window.location\n return `${protocol}//${hostname}${port ? ':' + port : ''}`\n}\n\nexport function getURL() {\n const { href } = window.location\n const origin = getLocationOrigin()\n return href.substring(origin.length)\n}\n\nexport function getDisplayName

(Component: ComponentType

) {\n return typeof Component === 'string'\n ? Component\n : Component.displayName || Component.name || 'Unknown'\n}\n\nexport function isResSent(res: ServerResponse) {\n return res.finished || res.headersSent\n}\n\nexport function normalizeRepeatedSlashes(url: string) {\n const urlParts = url.split('?')\n const urlNoQuery = urlParts[0]\n\n return (\n urlNoQuery\n // first we replace any non-encoded backslashes with forward\n // then normalize repeated forward slashes\n .replace(/\\\\/g, '/')\n .replace(/\\/\\/+/g, '/') +\n (urlParts[1] ? `?${urlParts.slice(1).join('?')}` : '')\n )\n}\n\nexport async function loadGetInitialProps<\n C extends BaseContext,\n IP = {},\n P = {},\n>(App: NextComponentType, ctx: C): Promise {\n if (process.env.NODE_ENV !== 'production') {\n if (App.prototype?.getInitialProps) {\n const message = `\"${getDisplayName(\n App\n )}.getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`\n throw new Error(message)\n }\n }\n // when called from _app `ctx` is nested in `ctx`\n const res = ctx.res || (ctx.ctx && ctx.ctx.res)\n\n if (!App.getInitialProps) {\n if (ctx.ctx && ctx.Component) {\n // @ts-ignore pageProps default\n return {\n pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx),\n }\n }\n return {} as IP\n }\n\n const props = await App.getInitialProps(ctx)\n\n if (res && isResSent(res)) {\n return props\n }\n\n if (!props) {\n const message = `\"${getDisplayName(\n App\n )}.getInitialProps()\" should resolve to an object. But found \"${props}\" instead.`\n throw new Error(message)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (Object.keys(props).length === 0 && !ctx.ctx) {\n console.warn(\n `${getDisplayName(\n App\n )} returned an empty object from \\`getInitialProps\\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`\n )\n }\n }\n\n return props\n}\n\nexport const SP = typeof performance !== 'undefined'\nexport const ST =\n SP &&\n (['mark', 'measure', 'getEntriesByName'] as const).every(\n (method) => typeof performance[method] === 'function'\n )\n\nexport class DecodeError extends Error {}\nexport class NormalizeError extends Error {}\nexport class PageNotFoundError extends Error {\n code: string\n\n constructor(page: string) {\n super()\n this.code = 'ENOENT'\n this.name = 'PageNotFoundError'\n this.message = `Cannot find module for page: ${page}`\n }\n}\n\nexport class MissingStaticPage extends Error {\n constructor(page: string, message: string) {\n super()\n this.message = `Failed to load static file for page: ${page} ${message}`\n }\n}\n\nexport class MiddlewareNotFoundError extends Error {\n code: string\n constructor() {\n super()\n this.code = 'ENOENT'\n this.message = `Cannot find the middleware module`\n }\n}\n\nexport interface CacheFs {\n existsSync: typeof fs.existsSync\n readFile: typeof fs.promises.readFile\n readFileSync: typeof fs.readFileSync\n writeFile(f: string, d: any): Promise\n mkdir(dir: string): Promise\n stat(f: string): Promise<{ mtime: Date }>\n}\n\nexport function stringifyError(error: Error) {\n return JSON.stringify({ message: error.message, stack: error.stack })\n}\n"],"names":["WEB_VITALS","execOnce","fn","used","result","args","ABSOLUTE_URL_REGEX","isAbsoluteUrl","url","test","getLocationOrigin","protocol","hostname","port","window","location","getURL","href","origin","substring","length","getDisplayName","Component","displayName","name","isResSent","res","finished","headersSent","normalizeRepeatedSlashes","urlParts","split","urlNoQuery","replace","slice","join","loadGetInitialProps","App","ctx","process","env","NODE_ENV","prototype","getInitialProps","message","Error","pageProps","props","Object","keys","console","warn","SP","performance","ST","every","method","DecodeError","NormalizeError","PageNotFoundError","constructor","page","code","MissingStaticPage","MiddlewareNotFoundError","stringifyError","error","JSON","stringify","stack"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 6202, "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/dist/compiled/path-to-regexp/index.js"],"sourcesContent":["(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var n=e;Object.defineProperty(n,\"__esModule\",{value:true});n.pathToRegexp=n.tokensToRegexp=n.regexpToFunction=n.match=n.tokensToFunction=n.compile=n.parse=void 0;function lexer(e){var n=[];var r=0;while(r=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122||o===95){a+=e[i++];continue}break}if(!a)throw new TypeError(\"Missing parameter name at \".concat(r));n.push({type:\"NAME\",index:r,value:a});r=i;continue}if(t===\"(\"){var c=1;var f=\"\";var i=r+1;if(e[i]===\"?\"){throw new TypeError('Pattern cannot start with \"?\" at '.concat(i))}while(i-1)return true}return false};var safePattern=function(e){var n=c[c.length-1];var r=e||(n&&typeof n===\"string\"?n:\"\");if(n&&!r){throw new TypeError('Must have text between two parameters, missing text after \"'.concat(n.name,'\"'))}if(!r||isSafe(r))return\"[^\".concat(escapeString(o),\"]+?\");return\"(?:(?!\".concat(escapeString(r),\")[^\").concat(escapeString(o),\"])+?\")};while(u)?(?!\\?)/g;var t=0;var a=r.exec(e.source);while(a){n.push({name:a[1]||t++,prefix:\"\",suffix:\"\",modifier:\"\",pattern:\"\"});a=r.exec(e.source)}return e}function arrayToRegexp(e,n,r){var t=e.map((function(e){return pathToRegexp(e,n,r).source}));return new RegExp(\"(?:\".concat(t.join(\"|\"),\")\"),flags(r))}function stringToRegexp(e,n,r){return tokensToRegexp(parse(e,r),n,r)}function tokensToRegexp(e,n,r){if(r===void 0){r={}}var t=r.strict,a=t===void 0?false:t,i=r.start,o=i===void 0?true:i,c=r.end,f=c===void 0?true:c,u=r.encode,p=u===void 0?function(e){return e}:u,v=r.delimiter,s=v===void 0?\"/#?\":v,d=r.endsWith,g=d===void 0?\"\":d;var x=\"[\".concat(escapeString(g),\"]|$\");var h=\"[\".concat(escapeString(s),\"]\");var l=o?\"^\":\"\";for(var m=0,T=e;m-1:A===undefined;if(!a){l+=\"(?:\".concat(h,\"(?=\").concat(x,\"))?\")}if(!_){l+=\"(?=\".concat(h,\"|\").concat(x,\")\")}}return new RegExp(l,flags(r))}n.tokensToRegexp=tokensToRegexp;function pathToRegexp(e,n,r){if(e instanceof RegExp)return regexpToRegexp(e,n);if(Array.isArray(e))return arrayToRegexp(e,n,r);return stringToRegexp(e,n,r)}n.pathToRegexp=pathToRegexp})();module.exports=e})();"],"names":[],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 6613, "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/lib/route-pattern-normalizer.ts"],"sourcesContent":["import type { Token } from 'next/dist/compiled/path-to-regexp'\n\n/**\n * Route pattern normalization utilities for path-to-regexp compatibility.\n *\n * path-to-regexp 6.3.0+ introduced stricter validation that rejects certain\n * patterns commonly used in Next.js interception routes. This module provides\n * normalization functions to make Next.js route patterns compatible with the\n * updated library while preserving all functionality.\n */\n\n/**\n * Internal separator used to normalize adjacent parameter patterns.\n * This unique marker is inserted between adjacent parameters and stripped out\n * during parameter extraction to avoid conflicts with real URL content.\n */\nexport const PARAM_SEPARATOR = '_NEXTSEP_'\n\n/**\n * Detects if a route pattern needs normalization for path-to-regexp compatibility.\n */\nexport function hasAdjacentParameterIssues(route: string): boolean {\n if (typeof route !== 'string') return false\n\n // Check for interception route markers followed immediately by parameters\n // Pattern: /(.):param, /(..):param, /(...):param, /(.)(.):param etc.\n // These patterns cause \"Must have text between two parameters\" errors\n if (/\\/\\(\\.{1,3}\\):[^/\\s]+/.test(route)) {\n return true\n }\n\n // Check for basic adjacent parameters without separators\n // Pattern: :param1:param2 (but not :param* or other URL patterns)\n if (/:[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*/.test(route)) {\n return true\n }\n\n return false\n}\n\n/**\n * Normalizes route patterns that have adjacent parameters without text between them.\n * Inserts a unique separator that can be safely stripped out later.\n */\nexport function normalizeAdjacentParameters(route: string): string {\n let normalized = route\n\n // Handle interception route patterns: (.):param -> (.)_NEXTSEP_:param\n normalized = normalized.replace(\n /(\\([^)]*\\)):([^/\\s]+)/g,\n `$1${PARAM_SEPARATOR}:$2`\n )\n\n // Handle other adjacent parameter patterns: :param1:param2 -> :param1_NEXTSEP_:param2\n normalized = normalized.replace(/:([^:/\\s)]+)(?=:)/g, `:$1${PARAM_SEPARATOR}`)\n\n return normalized\n}\n\n/**\n * Normalizes tokens that have repeating modifiers (* or +) but empty prefix and suffix.\n *\n * path-to-regexp 6.3.0+ introduced validation that throws:\n * \"Can not repeat without prefix/suffix\"\n *\n * This occurs when a token has modifier: '*' or '+' with both prefix: '' and suffix: ''\n */\nexport function normalizeTokensForRegexp(tokens: Token[]): Token[] {\n return tokens.map((token) => {\n // Token union type: Token = string | TokenObject\n // Literal path segments are strings, parameters/wildcards are objects\n if (\n typeof token === 'object' &&\n token !== null &&\n // Not all token objects have 'modifier' property (e.g., simple text tokens)\n 'modifier' in token &&\n // Only repeating modifiers (* or +) cause the validation error\n // Other modifiers like '?' (optional) are fine\n (token.modifier === '*' || token.modifier === '+') &&\n // Token objects can have different shapes depending on route pattern\n 'prefix' in token &&\n 'suffix' in token &&\n // Both prefix and suffix must be empty strings\n // This is what causes the validation error in path-to-regexp\n token.prefix === '' &&\n token.suffix === ''\n ) {\n // Add minimal prefix to satisfy path-to-regexp validation\n // We use '/' as it's the most common path delimiter and won't break route matching\n // The prefix gets used in regex generation but doesn't affect parameter extraction\n return {\n ...token,\n prefix: '/',\n }\n }\n return token\n })\n}\n\n/**\n * Strips normalization separators from compiled pathname.\n * This removes separators that were inserted by normalizeAdjacentParameters\n * to satisfy path-to-regexp validation.\n *\n * Only removes separators in the specific contexts where they were inserted:\n * - After interception route markers: (.)_NEXTSEP_ -> (.)\n *\n * This targeted approach ensures we don't accidentally remove the separator\n * from legitimate user content.\n */\nexport function stripNormalizedSeparators(pathname: string): string {\n // Remove separator after interception route markers\n // Pattern: (.)_NEXTSEP_ -> (.), (..)_NEXTSEP_ -> (..), etc.\n // The separator appears after the closing paren of interception markers\n return pathname.replace(new RegExp(`\\\\)${PARAM_SEPARATOR}`, 'g'), ')')\n}\n\n/**\n * Strips normalization separators from extracted route parameters.\n * Used by both server and client code to clean up parameters after route matching.\n */\nexport function stripParameterSeparators(\n params: Record\n): Record {\n const cleaned: Record = {}\n\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === 'string') {\n // Remove the separator if it appears at the start of parameter values\n cleaned[key] = value.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n } else if (Array.isArray(value)) {\n // Handle array parameters (from repeated route segments)\n cleaned[key] = value.map((item) =>\n typeof item === 'string'\n ? item.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n : item\n )\n } else {\n cleaned[key] = value\n }\n }\n\n return cleaned\n}\n"],"names":["PARAM_SEPARATOR","hasAdjacentParameterIssues","route","test","normalizeAdjacentParameters","normalized","replace","normalizeTokensForRegexp","tokens","map","token","modifier","prefix","suffix","stripNormalizedSeparators","pathname","RegExp","stripParameterSeparators","params","cleaned","key","value","Object","entries","Array","isArray","item"],"mappings":"AAEA;;;;;;;CAOC,GAED;;;;CAIC,GACD;;;;;;;;;;;;;;AAAO,MAAMA,kBAAkB,YAAW;AAKnC,SAASC,2BAA2BC,KAAa;IACtD,IAAI,OAAOA,UAAU,UAAU,OAAO;IAEtC,0EAA0E;IAC1E,qEAAqE;IACrE,sEAAsE;IACtE,IAAI,wBAAwBC,IAAI,CAACD,QAAQ;QACvC,OAAO;IACT;IAEA,yDAAyD;IACzD,kEAAkE;IAClE,IAAI,iDAAiDC,IAAI,CAACD,QAAQ;QAChE,OAAO;IACT;IAEA,OAAO;AACT;AAMO,SAASE,4BAA4BF,KAAa;IACvD,IAAIG,aAAaH;IAEjB,sEAAsE;IACtEG,aAAaA,WAAWC,OAAO,CAC7B,0BACA,CAAC,EAAE,EAAEN,gBAAgB,GAAG,CAAC;IAG3B,sFAAsF;IACtFK,aAAaA,WAAWC,OAAO,CAAC,sBAAsB,CAAC,GAAG,EAAEN,iBAAiB;IAE7E,OAAOK;AACT;AAUO,SAASE,yBAAyBC,MAAe;IACtD,OAAOA,OAAOC,GAAG,CAAC,CAACC;QACjB,iDAAiD;QACjD,sEAAsE;QACtE,IACE,OAAOA,UAAU,YACjBA,UAAU,QACV,4EAA4E;QAC5E,cAAcA,SACd,+DAA+D;QAC/D,+CAA+C;QAC9CA,CAAAA,MAAMC,QAAQ,KAAK,OAAOD,MAAMC,QAAQ,KAAK,GAAE,KAChD,qEAAqE;QACrE,YAAYD,SACZ,YAAYA,SACZ,+CAA+C;QAC/C,6DAA6D;QAC7DA,MAAME,MAAM,KAAK,MACjBF,MAAMG,MAAM,KAAK,IACjB;YACA,0DAA0D;YAC1D,mFAAmF;YACnF,mFAAmF;YACnF,OAAO;gBACL,GAAGH,KAAK;gBACRE,QAAQ;YACV;QACF;QACA,OAAOF;IACT;AACF;AAaO,SAASI,0BAA0BC,QAAgB;IACxD,oDAAoD;IACpD,4DAA4D;IAC5D,wEAAwE;IACxE,OAAOA,SAAST,OAAO,CAAC,IAAIU,OAAO,CAAC,GAAG,EAAEhB,iBAAiB,EAAE,MAAM;AACpE;AAMO,SAASiB,yBACdC,MAA2B;IAE3B,MAAMC,UAA+B,CAAC;IAEtC,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACL,QAAS;QACjD,IAAI,OAAOG,UAAU,UAAU;YAC7B,sEAAsE;YACtEF,OAAO,CAACC,IAAI,GAAGC,MAAMf,OAAO,CAAC,IAAIU,OAAO,CAAC,CAAC,EAAEhB,iBAAiB,GAAG;QAClE,OAAO,IAAIwB,MAAMC,OAAO,CAACJ,QAAQ;YAC/B,yDAAyD;YACzDF,OAAO,CAACC,IAAI,GAAGC,MAAMZ,GAAG,CAAC,CAACiB,OACxB,OAAOA,SAAS,WACZA,KAAKpB,OAAO,CAAC,IAAIU,OAAO,CAAC,CAAC,EAAEhB,iBAAiB,GAAG,MAChD0B;QAER,OAAO;YACLP,OAAO,CAACC,IAAI,GAAGC;QACjB;IACF;IAEA,OAAOF;AACT","ignoreList":[0]}}, + {"offset": {"line": 6709, "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/shared/lib/router/utils/route-match-utils.ts"],"sourcesContent":["/**\n * Client-safe utilities for route matching that don't import server-side\n * utilities to avoid bundling issues with Turbopack\n */\n\nimport type {\n Key,\n TokensToRegexpOptions,\n ParseOptions,\n TokensToFunctionOptions,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n pathToRegexp,\n compile,\n regexpToFunction,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n hasAdjacentParameterIssues,\n normalizeAdjacentParameters,\n stripParameterSeparators,\n stripNormalizedSeparators,\n} from '../../../../lib/route-pattern-normalizer'\n\n/**\n * Client-safe wrapper around pathToRegexp that handles path-to-regexp 6.3.0+ validation errors.\n * This includes both \"Can not repeat without prefix/suffix\" and \"Must have text between parameters\" errors.\n */\nexport function safePathToRegexp(\n route: string | RegExp | Array,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions\n): RegExp {\n if (typeof route !== 'string') {\n return pathToRegexp(route, keys, options)\n }\n\n // Check if normalization is needed and cache the result\n const needsNormalization = hasAdjacentParameterIssues(route)\n const routeToUse = needsNormalization\n ? normalizeAdjacentParameters(route)\n : route\n\n try {\n return pathToRegexp(routeToUse, keys, options)\n } catch (error) {\n // Only try normalization if we haven't already normalized\n if (!needsNormalization) {\n try {\n const normalizedRoute = normalizeAdjacentParameters(route)\n return pathToRegexp(normalizedRoute, keys, options)\n } catch (retryError) {\n // If that doesn't work, fall back to original error\n throw error\n }\n }\n throw error\n }\n}\n\n/**\n * Client-safe wrapper around compile that handles path-to-regexp 6.3.0+ validation errors.\n * No server-side error reporting to avoid bundling issues.\n * When normalization is applied, the returned compiler function automatically strips\n * the internal separator from the output URL.\n */\nexport function safeCompile(\n route: string,\n options?: TokensToFunctionOptions & ParseOptions\n) {\n // Check if normalization is needed and cache the result\n const needsNormalization = hasAdjacentParameterIssues(route)\n const routeToUse = needsNormalization\n ? normalizeAdjacentParameters(route)\n : route\n\n try {\n const compiler = compile(routeToUse, options)\n\n // If we normalized the route, wrap the compiler to strip separators from output\n // The normalization inserts _NEXTSEP_ as a literal string in the pattern to satisfy\n // path-to-regexp validation, but we don't want it in the final compiled URL\n if (needsNormalization) {\n return (params: any) => {\n return stripNormalizedSeparators(compiler(params))\n }\n }\n\n return compiler\n } catch (error) {\n // Only try normalization if we haven't already normalized\n if (!needsNormalization) {\n try {\n const normalizedRoute = normalizeAdjacentParameters(route)\n const compiler = compile(normalizedRoute, options)\n\n // Wrap the compiler to strip separators from output\n return (params: any) => {\n return stripNormalizedSeparators(compiler(params))\n }\n } catch (retryError) {\n // If that doesn't work, fall back to original error\n throw error\n }\n }\n throw error\n }\n}\n\n/**\n * Client-safe wrapper around regexpToFunction that automatically cleans parameters.\n */\nexport function safeRegexpToFunction<\n T extends Record = Record,\n>(regexp: RegExp, keys?: Key[]): (pathname: string) => { params: T } | false {\n const originalMatcher = regexpToFunction(regexp, keys || [])\n\n return (pathname: string) => {\n const result = originalMatcher(pathname)\n if (!result) return false\n\n // Clean parameters before returning\n return {\n ...result,\n params: stripParameterSeparators(result.params as any) as T,\n }\n }\n}\n\n/**\n * Safe wrapper for route matcher functions that automatically cleans parameters.\n * This is client-safe and doesn't import path-to-regexp.\n */\nexport function safeRouteMatcher>(\n matcherFn: (pathname: string) => false | T\n): (pathname: string) => false | T {\n return (pathname: string) => {\n const result = matcherFn(pathname)\n if (!result) return false\n\n // Clean parameters before returning\n return stripParameterSeparators(result) as T\n }\n}\n"],"names":["pathToRegexp","compile","regexpToFunction","hasAdjacentParameterIssues","normalizeAdjacentParameters","stripParameterSeparators","stripNormalizedSeparators","safePathToRegexp","route","keys","options","needsNormalization","routeToUse","error","normalizedRoute","retryError","safeCompile","compiler","params","safeRegexpToFunction","regexp","originalMatcher","pathname","result","safeRouteMatcher","matcherFn"],"mappings":"AAAA;;;CAGC;;;;;;;;;;AAQD,SACEA,YAAY,EACZC,OAAO,EACPC,gBAAgB,QACX,oCAAmC;AAC1C,SACEC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,wBAAwB,EACxBC,yBAAyB,QACpB,2CAA0C;;;AAM1C,SAASC,iBACdC,KAA+C,EAC/CC,IAAY,EACZC,OAA8C;IAE9C,IAAI,OAAOF,UAAU,UAAU;QAC7B,WAAOR,+WAAAA,EAAaQ,OAAOC,MAAMC;IACnC;IAEA,wDAAwD;IACxD,MAAMC,yBAAqBR,gYAAAA,EAA2BK;IACtD,MAAMI,aAAaD,yBACfP,iYAAAA,EAA4BI,SAC5BA;IAEJ,IAAI;QACF,WAAOR,+WAAAA,EAAaY,YAAYH,MAAMC;IACxC,EAAE,OAAOG,OAAO;QACd,0DAA0D;QAC1D,IAAI,CAACF,oBAAoB;YACvB,IAAI;gBACF,MAAMG,sBAAkBV,iYAAAA,EAA4BI;gBACpD,WAAOR,+WAAAA,EAAac,iBAAiBL,MAAMC;YAC7C,EAAE,OAAOK,YAAY;gBACnB,oDAAoD;gBACpD,MAAMF;YACR;QACF;QACA,MAAMA;IACR;AACF;AAQO,SAASG,YACdR,KAAa,EACbE,OAAgD;IAEhD,wDAAwD;IACxD,MAAMC,yBAAqBR,gYAAAA,EAA2BK;IACtD,MAAMI,aAAaD,yBACfP,iYAAAA,EAA4BI,SAC5BA;IAEJ,IAAI;QACF,MAAMS,eAAWhB,0WAAAA,EAAQW,YAAYF;QAErC,gFAAgF;QAChF,oFAAoF;QACpF,4EAA4E;QAC5E,IAAIC,oBAAoB;YACtB,OAAO,CAACO;gBACN,WAAOZ,+XAAAA,EAA0BW,SAASC;YAC5C;QACF;QAEA,OAAOD;IACT,EAAE,OAAOJ,OAAO;QACd,0DAA0D;QAC1D,IAAI,CAACF,oBAAoB;YACvB,IAAI;gBACF,MAAMG,sBAAkBV,iYAAAA,EAA4BI;gBACpD,MAAMS,eAAWhB,0WAAAA,EAAQa,iBAAiBJ;gBAE1C,oDAAoD;gBACpD,OAAO,CAACQ;oBACN,WAAOZ,+XAAAA,EAA0BW,SAASC;gBAC5C;YACF,EAAE,OAAOH,YAAY;gBACnB,oDAAoD;gBACpD,MAAMF;YACR;QACF;QACA,MAAMA;IACR;AACF;AAKO,SAASM,qBAEdC,MAAc,EAAEX,IAAY;IAC5B,MAAMY,sBAAkBnB,mXAAAA,EAAoBkB,QAAQX,QAAQ,EAAE;IAE9D,OAAO,CAACa;QACN,MAAMC,SAASF,gBAAgBC;QAC/B,IAAI,CAACC,QAAQ,OAAO;QAEpB,oCAAoC;QACpC,OAAO;YACL,GAAGA,MAAM;YACTL,YAAQb,8XAAAA,EAAyBkB,OAAOL,MAAM;QAChD;IACF;AACF;AAMO,SAASM,iBACdC,SAA0C;IAE1C,OAAO,CAACH;QACN,MAAMC,SAASE,UAAUH;QACzB,IAAI,CAACC,QAAQ,OAAO;QAEpB,oCAAoC;QACpC,WAAOlB,8XAAAA,EAAyBkB;IAClC;AACF","ignoreList":[0]}}, + {"offset": {"line": 6806, "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/shared/lib/router/utils/route-matcher.ts"],"sourcesContent":["import type { Group } from './route-regex'\nimport { DecodeError } from '../../utils'\nimport type { Params } from '../../../../server/request/params'\nimport { safeRouteMatcher } from './route-match-utils'\n\nexport interface RouteMatchFn {\n (pathname: string): false | Params\n}\n\ntype RouteMatcherOptions = {\n // We only use the exec method of the RegExp object. This helps us avoid using\n // type assertions that the passed in properties are of the correct type.\n re: Pick\n groups: Record\n}\n\nexport function getRouteMatcher({\n re,\n groups,\n}: RouteMatcherOptions): RouteMatchFn {\n const rawMatcher = (pathname: string) => {\n const routeMatch = re.exec(pathname)\n if (!routeMatch) return false\n\n const decode = (param: string) => {\n try {\n return decodeURIComponent(param)\n } catch {\n throw new DecodeError('failed to decode param')\n }\n }\n\n const params: Params = {}\n for (const [key, group] of Object.entries(groups)) {\n const match = routeMatch[group.pos]\n if (match !== undefined) {\n if (group.repeat) {\n params[key] = match.split('/').map((entry) => decode(entry))\n } else {\n params[key] = decode(match)\n }\n }\n }\n\n return params\n }\n\n // Wrap with safe matcher to handle parameter cleaning\n return safeRouteMatcher(rawMatcher)\n}\n"],"names":["DecodeError","safeRouteMatcher","getRouteMatcher","re","groups","rawMatcher","pathname","routeMatch","exec","decode","param","decodeURIComponent","params","key","group","Object","entries","match","pos","undefined","repeat","split","map","entry"],"mappings":";;;;AACA,SAASA,WAAW,QAAQ,cAAa;AAEzC,SAASC,gBAAgB,QAAQ,sBAAqB;;;AAa/C,SAASC,gBAAgB,EAC9BC,EAAE,EACFC,MAAM,EACc;IACpB,MAAMC,aAAa,CAACC;QAClB,MAAMC,aAAaJ,GAAGK,IAAI,CAACF;QAC3B,IAAI,CAACC,YAAY,OAAO;QAExB,MAAME,SAAS,CAACC;YACd,IAAI;gBACF,OAAOC,mBAAmBD;YAC5B,EAAE,OAAM;gBACN,MAAM,OAAA,cAAyC,CAAzC,IAAIV,kWAAAA,CAAY,2BAAhB,qBAAA;2BAAA;gCAAA;kCAAA;gBAAwC;YAChD;QACF;QAEA,MAAMY,SAAiB,CAAC;QACxB,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACZ,QAAS;YACjD,MAAMa,QAAQV,UAAU,CAACO,MAAMI,GAAG,CAAC;YACnC,IAAID,UAAUE,WAAW;gBACvB,IAAIL,MAAMM,MAAM,EAAE;oBAChBR,MAAM,CAACC,IAAI,GAAGI,MAAMI,KAAK,CAAC,KAAKC,GAAG,CAAC,CAACC,QAAUd,OAAOc;gBACvD,OAAO;oBACLX,MAAM,CAACC,IAAI,GAAGJ,OAAOQ;gBACvB;YACF;QACF;QAEA,OAAOL;IACT;IAEA,sDAAsD;IACtD,WAAOX,4YAAAA,EAAiBI;AAC1B","ignoreList":[0]}}, + {"offset": {"line": 6849, "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/shared/lib/escape-regexp.ts"],"sourcesContent":["// regexp is based on https://github.com/sindresorhus/escape-string-regexp\nconst reHasRegExp = /[|\\\\{}()[\\]^$+*?.-]/\nconst reReplaceRegExp = /[|\\\\{}()[\\]^$+*?.-]/g\n\nexport function escapeStringRegexp(str: string) {\n // see also: https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/escapeRegExp.js#L23\n if (reHasRegExp.test(str)) {\n return str.replace(reReplaceRegExp, '\\\\$&')\n }\n return str\n}\n"],"names":["reHasRegExp","reReplaceRegExp","escapeStringRegexp","str","test","replace"],"mappings":"AAAA,0EAA0E;;;;;AAC1E,MAAMA,cAAc;AACpB,MAAMC,kBAAkB;AAEjB,SAASC,mBAAmBC,GAAW;IAC5C,+GAA+G;IAC/G,IAAIH,YAAYI,IAAI,CAACD,MAAM;QACzB,OAAOA,IAAIE,OAAO,CAACJ,iBAAiB;IACtC;IACA,OAAOE;AACT","ignoreList":[0]}}, + {"offset": {"line": 6867, "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/shared/lib/router/utils/parse-loader-tree.ts"],"sourcesContent":["import { DEFAULT_SEGMENT_KEY } from '../../segment'\nimport type { LoaderTree } from '../../../../server/lib/app-dir-module'\n\nexport function parseLoaderTree(tree: LoaderTree) {\n const [segment, parallelRoutes, modules] = tree\n const { layout, template } = modules\n let { page } = modules\n // a __DEFAULT__ segment means that this route didn't match any of the\n // segments in the route, so we should use the default page\n page = segment === DEFAULT_SEGMENT_KEY ? modules.defaultPage : page\n\n const conventionPath = layout?.[1] || template?.[1] || page?.[1]\n\n return {\n page,\n segment,\n modules,\n /* it can be either layout / template / page */\n conventionPath,\n parallelRoutes,\n }\n}\n"],"names":["DEFAULT_SEGMENT_KEY","parseLoaderTree","tree","segment","parallelRoutes","modules","layout","template","page","defaultPage","conventionPath"],"mappings":";;;;AAAA,SAASA,mBAAmB,QAAQ,gBAAe;;AAG5C,SAASC,gBAAgBC,IAAgB;IAC9C,MAAM,CAACC,SAASC,gBAAgBC,QAAQ,GAAGH;IAC3C,MAAM,EAAEI,MAAM,EAAEC,QAAQ,EAAE,GAAGF;IAC7B,IAAI,EAAEG,IAAI,EAAE,GAAGH;IACf,sEAAsE;IACtE,2DAA2D;IAC3DG,OAAOL,YAAYH,4WAAAA,GAAsBK,QAAQI,WAAW,GAAGD;IAE/D,MAAME,iBAAiBJ,QAAQ,CAAC,EAAE,IAAIC,UAAU,CAAC,EAAE,IAAIC,MAAM,CAAC,EAAE;IAEhE,OAAO;QACLA;QACAL;QACAE;QACA,6CAA6C,GAC7CK;QACAN;IACF;AACF","ignoreList":[0]}}, + {"offset": {"line": 6893, "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/shared/lib/router/utils/get-dynamic-param.ts"],"sourcesContent":["import type { DynamicParam } from '../../../../server/app-render/app-render'\nimport type { LoaderTree } from '../../../../server/lib/app-dir-module'\nimport type { OpaqueFallbackRouteParams } from '../../../../server/request/fallback-params'\nimport type { Params } from '../../../../server/request/params'\nimport type { DynamicParamTypesShort } from '../../app-router-types'\nimport { InvariantError } from '../../invariant-error'\nimport { parseLoaderTree } from './parse-loader-tree'\nimport { getSegmentParam } from './get-segment-param'\n\n/**\n * Gets the value of a param from the params object. This correctly handles the\n * case where the param is a fallback route param and encodes the resulting\n * value.\n *\n * @param interpolatedParams - The params object.\n * @param segmentKey - The key of the segment.\n * @param fallbackRouteParams - The fallback route params.\n * @returns The value of the param.\n */\nfunction getParamValue(\n interpolatedParams: Params,\n segmentKey: string,\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n) {\n let value = interpolatedParams[segmentKey]\n\n if (fallbackRouteParams?.has(segmentKey)) {\n // We know that the fallback route params has the segment key because we\n // checked that above.\n const [searchValue] = fallbackRouteParams.get(segmentKey)!\n value = searchValue\n } else if (Array.isArray(value)) {\n value = value.map((i) => encodeURIComponent(i))\n } else if (typeof value === 'string') {\n value = encodeURIComponent(value)\n }\n\n return value\n}\n\nexport function interpolateParallelRouteParams(\n loaderTree: LoaderTree,\n params: Params,\n pagePath: string,\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n) {\n const interpolated = structuredClone(params)\n\n // Stack-based traversal with depth tracking\n const stack: Array<{ tree: LoaderTree; depth: number }> = [\n { tree: loaderTree, depth: 0 },\n ]\n\n // Derive value from pagePath based on depth and parameter type\n const pathSegments = pagePath.split('/').slice(1) // Remove first empty string\n\n while (stack.length > 0) {\n const { tree, depth } = stack.pop()!\n const { segment, parallelRoutes } = parseLoaderTree(tree)\n\n // Check if current segment contains a parameter\n const segmentParam = getSegmentParam(segment)\n if (\n segmentParam &&\n !interpolated.hasOwnProperty(segmentParam.param) &&\n // If the param is in the fallback route params, we don't need to\n // interpolate it because it's already marked as being unknown.\n !fallbackRouteParams?.has(segmentParam.param)\n ) {\n switch (segmentParam.type) {\n case 'catchall':\n case 'optional-catchall':\n case 'catchall-intercepted-(..)(..)':\n case 'catchall-intercepted-(.)':\n case 'catchall-intercepted-(..)':\n case 'catchall-intercepted-(...)':\n // For catchall parameters, take all remaining segments from this depth\n const remainingSegments = pathSegments.slice(depth)\n\n // Process each segment to handle any dynamic params\n const processedSegments = remainingSegments\n .flatMap((pathSegment) => {\n const param = getSegmentParam(pathSegment)\n // If the segment matches a param, return the param value otherwise,\n // it's a static segment, so just return that. We don't use the\n // `getParamValue` function here because we don't want the values to\n // be encoded, that's handled on get by the `getDynamicParam`\n // function.\n return param ? interpolated[param.param] : pathSegment\n })\n .filter((s) => s !== undefined)\n\n if (processedSegments.length > 0) {\n interpolated[segmentParam.param] = processedSegments\n }\n break\n case 'dynamic':\n case 'dynamic-intercepted-(..)(..)':\n case 'dynamic-intercepted-(.)':\n case 'dynamic-intercepted-(..)':\n case 'dynamic-intercepted-(...)':\n // For regular dynamic parameters, take the segment at this depth\n if (depth < pathSegments.length) {\n const pathSegment = pathSegments[depth]\n const param = getSegmentParam(pathSegment)\n\n interpolated[segmentParam.param] = param\n ? interpolated[param.param]\n : pathSegment\n }\n break\n default:\n segmentParam.type satisfies never\n }\n }\n\n // Calculate next depth - increment if this is not a route group and not empty\n let nextDepth = depth\n const isRouteGroup = segment.startsWith('(') && segment.endsWith(')')\n if (!isRouteGroup && segment !== '') {\n nextDepth++\n }\n\n // Add all parallel routes to the stack for processing\n for (const route of Object.values(parallelRoutes)) {\n stack.push({ tree: route, depth: nextDepth })\n }\n }\n\n return interpolated\n}\n\n/**\n *\n * Shared logic on client and server for creating a dynamic param value.\n *\n * This code needs to be shared with the client so it can extract dynamic route\n * params from the URL without a server request.\n *\n * Because everything in this module is sent to the client, we should aim to\n * keep this code as simple as possible. The special case handling for catchall\n * and optional is, alas, unfortunate.\n */\nexport function getDynamicParam(\n interpolatedParams: Params,\n segmentKey: string,\n dynamicParamType: DynamicParamTypesShort,\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n): DynamicParam {\n let value: string | string[] | undefined = getParamValue(\n interpolatedParams,\n segmentKey,\n fallbackRouteParams\n )\n\n // handle the case where an optional catchall does not have a value,\n // e.g. `/dashboard/[[...slug]]` when requesting `/dashboard`\n if (!value || value.length === 0) {\n if (dynamicParamType === 'oc') {\n return {\n param: segmentKey,\n value: null,\n type: dynamicParamType,\n treeSegment: [segmentKey, '', dynamicParamType],\n }\n }\n\n throw new InvariantError(\n `Missing value for segment key: \"${segmentKey}\" with dynamic param type: ${dynamicParamType}`\n )\n }\n\n return {\n param: segmentKey,\n // The value that is passed to user code.\n value,\n // The value that is rendered in the router tree.\n treeSegment: [\n segmentKey,\n Array.isArray(value) ? value.join('/') : value,\n dynamicParamType,\n ],\n type: dynamicParamType,\n }\n}\n\n/**\n * Regular expression pattern used to match route parameters.\n * Matches both single parameters and parameter groups.\n * Examples:\n * - `[[...slug]]` matches parameter group with key 'slug', repeat: true, optional: true\n * - `[...slug]` matches parameter group with key 'slug', repeat: true, optional: false\n * - `[[foo]]` matches parameter with key 'foo', repeat: false, optional: true\n * - `[bar]` matches parameter with key 'bar', repeat: false, optional: false\n */\nexport const PARAMETER_PATTERN = /^([^[]*)\\[((?:\\[[^\\]]*\\])|[^\\]]+)\\](.*)$/\n\n/**\n * Parses a given parameter from a route to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n * - `[[...slug]]` -> `{ key: 'slug', repeat: true, optional: true }`\n * - `[...slug]` -> `{ key: 'slug', repeat: true, optional: false }`\n * - `[[foo]]` -> `{ key: 'foo', repeat: false, optional: true }`\n * - `[bar]` -> `{ key: 'bar', repeat: false, optional: false }`\n * - `fizz` -> `{ key: 'fizz', repeat: false, optional: false }`\n * @param param - The parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseParameter(param: string) {\n const match = param.match(PARAMETER_PATTERN)\n\n if (!match) {\n return parseMatchedParameter(param)\n }\n\n return parseMatchedParameter(match[2])\n}\n\n/**\n * Parses a matched parameter from the PARAMETER_PATTERN regex to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n * - `[...slug]` -> `{ key: 'slug', repeat: true, optional: true }`\n * - `...slug` -> `{ key: 'slug', repeat: true, optional: false }`\n * - `[foo]` -> `{ key: 'foo', repeat: false, optional: true }`\n * - `bar` -> `{ key: 'bar', repeat: false, optional: false }`\n * @param param - The matched parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseMatchedParameter(param: string) {\n const optional = param.startsWith('[') && param.endsWith(']')\n if (optional) {\n param = param.slice(1, -1)\n }\n const repeat = param.startsWith('...')\n if (repeat) {\n param = param.slice(3)\n }\n return { key: param, repeat, optional }\n}\n"],"names":["InvariantError","parseLoaderTree","getSegmentParam","getParamValue","interpolatedParams","segmentKey","fallbackRouteParams","value","has","searchValue","get","Array","isArray","map","i","encodeURIComponent","interpolateParallelRouteParams","loaderTree","params","pagePath","interpolated","structuredClone","stack","tree","depth","pathSegments","split","slice","length","pop","segment","parallelRoutes","segmentParam","hasOwnProperty","param","type","remainingSegments","processedSegments","flatMap","pathSegment","filter","s","undefined","nextDepth","isRouteGroup","startsWith","endsWith","route","Object","values","push","getDynamicParam","dynamicParamType","treeSegment","join","PARAMETER_PATTERN","parseParameter","match","parseMatchedParameter","optional","repeat","key"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 7072, "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/shared/lib/router/utils/route-regex.ts"],"sourcesContent":["import {\n NEXT_INTERCEPTION_MARKER_PREFIX,\n NEXT_QUERY_PARAM_PREFIX,\n} from '../../../../lib/constants'\nimport { INTERCEPTION_ROUTE_MARKERS } from './interception-routes'\nimport { escapeStringRegexp } from '../../escape-regexp'\nimport { removeTrailingSlash } from './remove-trailing-slash'\nimport { PARAMETER_PATTERN, parseMatchedParameter } from './get-dynamic-param'\n\nexport interface Group {\n pos: number\n repeat: boolean\n optional: boolean\n}\n\nexport interface RouteRegex {\n groups: { [groupName: string]: Group }\n re: RegExp\n}\n\nexport type RegexReference = {\n names: Record\n intercepted: Record\n}\n\ntype GetNamedRouteRegexOptions = {\n /**\n * Whether to prefix the route keys with the NEXT_INTERCEPTION_MARKER_PREFIX\n * or NEXT_QUERY_PARAM_PREFIX. This is only relevant when creating the\n * routes-manifest during the build.\n */\n prefixRouteKeys: boolean\n\n /**\n * Whether to include the suffix in the route regex. This means that when you\n * have something like `/[...slug].json` the `.json` part will be included\n * in the regex, yielding `/(.*).json` as the regex.\n */\n includeSuffix?: boolean\n\n /**\n * Whether to include the prefix in the route regex. This means that when you\n * have something like `/[...slug].json` the `/` part will be included\n * in the regex, yielding `^/(.*).json$` as the regex.\n *\n * Note that interception markers will already be included without the need\n */\n includePrefix?: boolean\n\n /**\n * Whether to exclude the optional trailing slash from the route regex.\n */\n excludeOptionalTrailingSlash?: boolean\n\n /**\n * Whether to backtrack duplicate keys. This is only relevant when creating\n * the routes-manifest during the build.\n */\n backreferenceDuplicateKeys?: boolean\n\n /**\n * If provided, this will be used as the reference for the dynamic parameter\n * keys instead of generating them in context. This is currently only used for\n * interception routes.\n */\n reference?: RegexReference\n}\n\ntype GetRouteRegexOptions = {\n /**\n * Whether to include extra parts in the route regex. This means that when you\n * have something like `/[...slug].json` the `.json` part will be included\n * in the regex, yielding `/(.*).json` as the regex.\n */\n includeSuffix?: boolean\n\n /**\n * Whether to include the prefix in the route regex. This means that when you\n * have something like `/[...slug].json` the `/` part will be included\n * in the regex, yielding `^/(.*).json$` as the regex.\n *\n * Note that interception markers will already be included without the need\n * of adding this option.\n */\n includePrefix?: boolean\n\n /**\n * Whether to exclude the optional trailing slash from the route regex.\n */\n excludeOptionalTrailingSlash?: boolean\n}\n\nfunction getParametrizedRoute(\n route: string,\n includeSuffix: boolean,\n includePrefix: boolean\n) {\n const groups: { [groupName: string]: Group } = {}\n let groupIndex = 1\n\n const segments: string[] = []\n for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n const markerMatch = INTERCEPTION_ROUTE_MARKERS.find((m) =>\n segment.startsWith(m)\n )\n const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n if (markerMatch && paramMatches && paramMatches[2]) {\n const { key, optional, repeat } = parseMatchedParameter(paramMatches[2])\n groups[key] = { pos: groupIndex++, repeat, optional }\n segments.push(`/${escapeStringRegexp(markerMatch)}([^/]+?)`)\n } else if (paramMatches && paramMatches[2]) {\n const { key, repeat, optional } = parseMatchedParameter(paramMatches[2])\n groups[key] = { pos: groupIndex++, repeat, optional }\n\n if (includePrefix && paramMatches[1]) {\n segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n }\n\n let s = repeat ? (optional ? '(?:/(.+?))?' : '/(.+?)') : '/([^/]+?)'\n\n // Remove the leading slash if includePrefix already added it.\n if (includePrefix && paramMatches[1]) {\n s = s.substring(1)\n }\n\n segments.push(s)\n } else {\n segments.push(`/${escapeStringRegexp(segment)}`)\n }\n\n // If there's a suffix, add it to the segments if it's enabled.\n if (includeSuffix && paramMatches && paramMatches[3]) {\n segments.push(escapeStringRegexp(paramMatches[3]))\n }\n }\n\n return {\n parameterizedRoute: segments.join(''),\n groups,\n }\n}\n\n/**\n * From a normalized route this function generates a regular expression and\n * a corresponding groups object intended to be used to store matching groups\n * from the regular expression.\n */\nexport function getRouteRegex(\n normalizedRoute: string,\n {\n includeSuffix = false,\n includePrefix = false,\n excludeOptionalTrailingSlash = false,\n }: GetRouteRegexOptions = {}\n): RouteRegex {\n const { parameterizedRoute, groups } = getParametrizedRoute(\n normalizedRoute,\n includeSuffix,\n includePrefix\n )\n\n let re = parameterizedRoute\n if (!excludeOptionalTrailingSlash) {\n re += '(?:/)?'\n }\n\n return {\n re: new RegExp(`^${re}$`),\n groups: groups,\n }\n}\n\n/**\n * Builds a function to generate a minimal routeKey using only a-z and minimal\n * number of characters.\n */\nfunction buildGetSafeRouteKey() {\n let i = 0\n\n return () => {\n let routeKey = ''\n let j = ++i\n while (j > 0) {\n routeKey += String.fromCharCode(97 + ((j - 1) % 26))\n j = Math.floor((j - 1) / 26)\n }\n return routeKey\n }\n}\n\nfunction getSafeKeyFromSegment({\n interceptionMarker,\n getSafeRouteKey,\n segment,\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n}: {\n interceptionMarker?: string\n getSafeRouteKey: () => string\n segment: string\n routeKeys: Record\n keyPrefix?: string\n backreferenceDuplicateKeys: boolean\n}) {\n const { key, optional, repeat } = parseMatchedParameter(segment)\n\n // replace any non-word characters since they can break\n // the named regex\n let cleanedKey = key.replace(/\\W/g, '')\n\n if (keyPrefix) {\n cleanedKey = `${keyPrefix}${cleanedKey}`\n }\n let invalidKey = false\n\n // check if the key is still invalid and fallback to using a known\n // safe key\n if (cleanedKey.length === 0 || cleanedKey.length > 30) {\n invalidKey = true\n }\n if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) {\n invalidKey = true\n }\n\n if (invalidKey) {\n cleanedKey = getSafeRouteKey()\n }\n\n const duplicateKey = cleanedKey in routeKeys\n\n if (keyPrefix) {\n routeKeys[cleanedKey] = `${keyPrefix}${key}`\n } else {\n routeKeys[cleanedKey] = key\n }\n\n // if the segment has an interception marker, make sure that's part of the regex pattern\n // this is to ensure that the route with the interception marker doesn't incorrectly match\n // the non-intercepted route (ie /app/(.)[username] should not match /app/[username])\n const interceptionPrefix = interceptionMarker\n ? escapeStringRegexp(interceptionMarker)\n : ''\n\n let pattern: string\n if (duplicateKey && backreferenceDuplicateKeys) {\n // Use a backreference to the key to ensure that the key is the same value\n // in each of the placeholders.\n pattern = `\\\\k<${cleanedKey}>`\n } else if (repeat) {\n pattern = `(?<${cleanedKey}>.+?)`\n } else {\n pattern = `(?<${cleanedKey}>[^/]+?)`\n }\n\n return {\n key,\n pattern: optional\n ? `(?:/${interceptionPrefix}${pattern})?`\n : `/${interceptionPrefix}${pattern}`,\n cleanedKey: cleanedKey,\n optional,\n repeat,\n }\n}\n\nfunction getNamedParametrizedRoute(\n route: string,\n prefixRouteKeys: boolean,\n includeSuffix: boolean,\n includePrefix: boolean,\n backreferenceDuplicateKeys: boolean,\n reference: RegexReference = { names: {}, intercepted: {} }\n) {\n const getSafeRouteKey = buildGetSafeRouteKey()\n const routeKeys: { [named: string]: string } = {}\n\n const segments: string[] = []\n const inverseParts: string[] = []\n\n // Ensure we don't mutate the original reference object.\n reference = structuredClone(reference)\n\n for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n const hasInterceptionMarker = INTERCEPTION_ROUTE_MARKERS.some((m) =>\n segment.startsWith(m)\n )\n\n const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n const interceptionMarker = hasInterceptionMarker\n ? paramMatches?.[1]\n : undefined\n\n let keyPrefix: string | undefined\n if (interceptionMarker && paramMatches?.[2]) {\n keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n reference.intercepted[paramMatches[2]] = interceptionMarker\n } else if (paramMatches?.[2] && reference.intercepted[paramMatches[2]]) {\n keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n } else {\n keyPrefix = prefixRouteKeys ? NEXT_QUERY_PARAM_PREFIX : undefined\n }\n\n if (interceptionMarker && paramMatches && paramMatches[2]) {\n // If there's an interception marker, add it to the segments.\n const { key, pattern, cleanedKey, repeat, optional } =\n getSafeKeyFromSegment({\n getSafeRouteKey,\n interceptionMarker,\n segment: paramMatches[2],\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n })\n\n segments.push(pattern)\n inverseParts.push(\n `/${paramMatches[1]}:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n )\n reference.names[key] ??= cleanedKey\n } else if (paramMatches && paramMatches[2]) {\n // If there's a prefix, add it to the segments if it's enabled.\n if (includePrefix && paramMatches[1]) {\n segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n inverseParts.push(`/${paramMatches[1]}`)\n }\n\n const { key, pattern, cleanedKey, repeat, optional } =\n getSafeKeyFromSegment({\n getSafeRouteKey,\n segment: paramMatches[2],\n routeKeys,\n keyPrefix,\n backreferenceDuplicateKeys,\n })\n\n // Remove the leading slash if includePrefix already added it.\n let s = pattern\n if (includePrefix && paramMatches[1]) {\n s = s.substring(1)\n }\n\n segments.push(s)\n inverseParts.push(\n `/:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n )\n reference.names[key] ??= cleanedKey\n } else {\n segments.push(`/${escapeStringRegexp(segment)}`)\n inverseParts.push(`/${segment}`)\n }\n\n // If there's a suffix, add it to the segments if it's enabled.\n if (includeSuffix && paramMatches && paramMatches[3]) {\n segments.push(escapeStringRegexp(paramMatches[3]))\n inverseParts.push(paramMatches[3])\n }\n }\n\n return {\n namedParameterizedRoute: segments.join(''),\n routeKeys,\n pathToRegexpPattern: inverseParts.join(''),\n reference,\n }\n}\n\n/**\n * This function extends `getRouteRegex` generating also a named regexp where\n * each group is named along with a routeKeys object that indexes the assigned\n * named group with its corresponding key. When the routeKeys need to be\n * prefixed to uniquely identify internally the \"prefixRouteKey\" arg should\n * be \"true\" currently this is only the case when creating the routes-manifest\n * during the build\n */\nexport function getNamedRouteRegex(\n normalizedRoute: string,\n options: GetNamedRouteRegexOptions\n) {\n const result = getNamedParametrizedRoute(\n normalizedRoute,\n options.prefixRouteKeys,\n options.includeSuffix ?? false,\n options.includePrefix ?? false,\n options.backreferenceDuplicateKeys ?? false,\n options.reference\n )\n\n let namedRegex = result.namedParameterizedRoute\n if (!options.excludeOptionalTrailingSlash) {\n namedRegex += '(?:/)?'\n }\n\n return {\n ...getRouteRegex(normalizedRoute, options),\n namedRegex: `^${namedRegex}$`,\n routeKeys: result.routeKeys,\n pathToRegexpPattern: result.pathToRegexpPattern,\n reference: result.reference,\n }\n}\n\n/**\n * Generates a named regexp.\n * This is intended to be using for build time only.\n */\nexport function getNamedMiddlewareRegex(\n normalizedRoute: string,\n options: {\n catchAll?: boolean\n }\n) {\n const { parameterizedRoute } = getParametrizedRoute(\n normalizedRoute,\n false,\n false\n )\n const { catchAll = true } = options\n if (parameterizedRoute === '/') {\n let catchAllRegex = catchAll ? '.*' : ''\n return {\n namedRegex: `^/${catchAllRegex}$`,\n }\n }\n\n const { namedParameterizedRoute } = getNamedParametrizedRoute(\n normalizedRoute,\n false,\n false,\n false,\n false,\n undefined\n )\n let catchAllGroupedRegex = catchAll ? '(?:(/.*)?)' : ''\n return {\n namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$`,\n }\n}\n"],"names":["NEXT_INTERCEPTION_MARKER_PREFIX","NEXT_QUERY_PARAM_PREFIX","INTERCEPTION_ROUTE_MARKERS","escapeStringRegexp","removeTrailingSlash","PARAMETER_PATTERN","parseMatchedParameter","getParametrizedRoute","route","includeSuffix","includePrefix","groups","groupIndex","segments","segment","slice","split","markerMatch","find","m","startsWith","paramMatches","match","key","optional","repeat","pos","push","s","substring","parameterizedRoute","join","getRouteRegex","normalizedRoute","excludeOptionalTrailingSlash","re","RegExp","buildGetSafeRouteKey","i","routeKey","j","String","fromCharCode","Math","floor","getSafeKeyFromSegment","interceptionMarker","getSafeRouteKey","routeKeys","keyPrefix","backreferenceDuplicateKeys","cleanedKey","replace","invalidKey","length","isNaN","parseInt","duplicateKey","interceptionPrefix","pattern","getNamedParametrizedRoute","prefixRouteKeys","reference","names","intercepted","inverseParts","structuredClone","hasInterceptionMarker","some","undefined","namedParameterizedRoute","pathToRegexpPattern","getNamedRouteRegex","options","result","namedRegex","getNamedMiddlewareRegex","catchAll","catchAllRegex","catchAllGroupedRegex"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 7317, "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/app-render/get-short-dynamic-param-type.tsx"],"sourcesContent":["import type {\n DynamicParamTypes,\n DynamicParamTypesShort,\n} from '../../shared/lib/app-router-types'\n\nexport const dynamicParamTypes: Record<\n DynamicParamTypes,\n DynamicParamTypesShort\n> = {\n catchall: 'c',\n 'catchall-intercepted-(..)(..)': 'ci(..)(..)',\n 'catchall-intercepted-(.)': 'ci(.)',\n 'catchall-intercepted-(..)': 'ci(..)',\n 'catchall-intercepted-(...)': 'ci(...)',\n 'optional-catchall': 'oc',\n dynamic: 'd',\n 'dynamic-intercepted-(..)(..)': 'di(..)(..)',\n 'dynamic-intercepted-(.)': 'di(.)',\n 'dynamic-intercepted-(..)': 'di(..)',\n 'dynamic-intercepted-(...)': 'di(...)',\n}\n"],"names":["dynamicParamTypes","catchall","dynamic"],"mappings":";;;;AAKO,MAAMA,oBAGT;IACFC,UAAU;IACV,iCAAiC;IACjC,4BAA4B;IAC5B,6BAA6B;IAC7B,8BAA8B;IAC9B,qBAAqB;IACrBC,SAAS;IACT,gCAAgC;IAChC,2BAA2B;IAC3B,4BAA4B;IAC5B,6BAA6B;AAC/B,EAAC","ignoreList":[0]}}, + {"offset": {"line": 7338, "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/request/fallback-params.ts"],"sourcesContent":["import { collectFallbackRouteParams } from '../../build/segment-config/app/app-segments'\nimport type { FallbackRouteParam } from '../../build/static-paths/types'\nimport type { DynamicParamTypesShort } from '../../shared/lib/app-router-types'\nimport { InvariantError } from '../../shared/lib/invariant-error'\nimport { getRouteMatcher } from '../../shared/lib/router/utils/route-matcher'\nimport { getRouteRegex } from '../../shared/lib/router/utils/route-regex'\nimport { dynamicParamTypes } from '../app-render/get-short-dynamic-param-type'\nimport type AppPageRouteModule from '../route-modules/app-page/module'\n\nfunction getParamKeys(page: string) {\n const pattern = getRouteRegex(page)\n const matcher = getRouteMatcher(pattern)\n\n // Get the default list of allowed params.\n return Object.keys(matcher(page))\n}\n\nexport type OpaqueFallbackRouteParamValue = [\n /**\n * The search value of the fallback route param. This is the opaque key\n * that will be used to replace the dynamic param in the postponed state.\n */\n searchValue: string,\n\n /**\n * The dynamic param type of the fallback route param. This is the type of\n * the dynamic param that will be used to replace the dynamic param in the\n * postponed state.\n */\n dynamicParamType: DynamicParamTypesShort,\n]\n\n/**\n * An opaque fallback route params object. This is used to store the fallback\n * route params in a way that is not easily accessible to the client.\n */\nexport type OpaqueFallbackRouteParams = ReadonlyMap<\n string,\n OpaqueFallbackRouteParamValue\n>\n\n/**\n * The entries of the opaque fallback route params object.\n *\n * @param key the key of the fallback route param\n * @param value the value of the fallback route param\n */\nexport type OpaqueFallbackRouteParamEntries =\n ReturnType extends MapIterator<\n [infer K, infer V]\n >\n ? ReadonlyArray<[K, V]>\n : never\n\n/**\n * Creates an opaque fallback route params object from the fallback route params.\n *\n * @param fallbackRouteParams the fallback route params\n * @returns the opaque fallback route params\n */\nexport function createOpaqueFallbackRouteParams(\n fallbackRouteParams: readonly FallbackRouteParam[]\n): OpaqueFallbackRouteParams | null {\n // If there are no fallback route params, we can return early.\n if (fallbackRouteParams.length === 0) return null\n\n // As we're creating unique keys for each of the dynamic route params, we only\n // need to generate a unique ID once per request because each of the keys will\n // be also be unique.\n const uniqueID = Math.random().toString(16).slice(2)\n\n const keys = new Map()\n\n // Generate a unique key for the fallback route param, if this key is found\n // in the static output, it represents a bug in cache components.\n for (const { paramName, paramType } of fallbackRouteParams) {\n keys.set(paramName, [\n `%%drp:${paramName}:${uniqueID}%%`,\n dynamicParamTypes[paramType],\n ])\n }\n\n return keys\n}\n\n/**\n * Gets the fallback route params for a given page. This is an expensive\n * operation because it requires parsing the loader tree to extract the fallback\n * route params.\n *\n * @param page the page\n * @param routeModule the route module\n * @returns the opaque fallback route params\n */\nexport function getFallbackRouteParams(\n page: string,\n routeModule: AppPageRouteModule\n) {\n // First, get the fallback route params based on the provided page.\n const unknownParamKeys = new Set(getParamKeys(page))\n\n // Needed when processing fallback route params for catchall routes in\n // parallel segments, derive from pathname. This is similar to\n // getDynamicParam's pagePath parsing logic.\n const pathSegments = page.split('/').filter(Boolean)\n\n const collected = collectFallbackRouteParams(routeModule)\n\n // Then, we have to get the fallback route params from the segments that are\n // associated with parallel route segments.\n const fallbackRouteParams: FallbackRouteParam[] = []\n for (const fallbackRouteParam of collected) {\n if (fallbackRouteParam.isParallelRouteParam) {\n // Try to see if we can resolve this parameter from the page that was\n // passed in.\n if (unknownParamKeys.has(fallbackRouteParam.paramName)) {\n // The parameter is known, we can skip adding it to the fallback route\n // params.\n continue\n }\n\n if (\n fallbackRouteParam.paramType === 'optional-catchall' ||\n fallbackRouteParam.paramType === 'catchall'\n ) {\n // If there are any fallback route segments then we can't use the\n // pathname to derive the value because it's not complete. We can\n // make this assumption because the routes are always resolved left\n // to right and the catchall is always the last segment, so any\n // route parameters that are unknown will always contribute to the\n // pathname and therefore the catchall param too.\n if (\n collected.some(\n (param) =>\n !param.isParallelRouteParam &&\n unknownParamKeys.has(param.paramName)\n )\n ) {\n fallbackRouteParams.push(fallbackRouteParam)\n continue\n }\n\n if (\n pathSegments.length === 0 &&\n fallbackRouteParam.paramType !== 'optional-catchall'\n ) {\n // We shouldn't be able to match a catchall segment without any path\n // segments if it's not an optional catchall.\n throw new InvariantError(\n `Unexpected empty path segments match for a pathname \"${page}\" with param \"${fallbackRouteParam.paramName}\" of type \"${fallbackRouteParam.paramType}\"`\n )\n }\n\n // The path segments are not empty, and the segments didn't contain any\n // unknown params, so we know that this particular fallback route param\n // route param is not actually unknown, and is known. We can skip adding\n // it to the fallback route params.\n } else {\n // This is some other type of route param that shouldn't get resolved\n // statically.\n throw new InvariantError(\n `Unexpected match for a pathname \"${page}\" with a param \"${fallbackRouteParam.paramName}\" of type \"${fallbackRouteParam.paramType}\"`\n )\n }\n } else if (unknownParamKeys.has(fallbackRouteParam.paramName)) {\n // As this is a non-parallel route segment, and it exists in the unknown\n // param keys, we know it's a fallback route param.\n fallbackRouteParams.push(fallbackRouteParam)\n }\n }\n\n return createOpaqueFallbackRouteParams(fallbackRouteParams)\n}\n"],"names":["collectFallbackRouteParams","InvariantError","getRouteMatcher","getRouteRegex","dynamicParamTypes","getParamKeys","page","pattern","matcher","Object","keys","createOpaqueFallbackRouteParams","fallbackRouteParams","length","uniqueID","Math","random","toString","slice","Map","paramName","paramType","set","getFallbackRouteParams","routeModule","unknownParamKeys","Set","pathSegments","split","filter","Boolean","collected","fallbackRouteParam","isParallelRouteParam","has","some","param","push"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 7441, "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/app-render/encryption-utils.ts"],"sourcesContent":["import type { ActionManifest } from '../../build/webpack/plugins/flight-client-entry-plugin'\nimport type {\n ClientReferenceManifest,\n ClientReferenceManifestForRsc,\n} from '../../build/webpack/plugins/flight-manifest-plugin'\nimport type { DeepReadonly } from '../../shared/lib/deep-readonly'\nimport { InvariantError } from '../../shared/lib/invariant-error'\nimport { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'\nimport { workAsyncStorage } from './work-async-storage.external'\n\nlet __next_loaded_action_key: CryptoKey\n\nexport function arrayBufferToString(\n buffer: ArrayBuffer | Uint8Array\n) {\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n\n // @anonrig: V8 has a limit of 65535 arguments in a function.\n // For len < 65535, this is faster.\n // https://github.com/vercel/next.js/pull/56377#pullrequestreview-1656181623\n if (len < 65535) {\n return String.fromCharCode.apply(null, bytes as unknown as number[])\n }\n\n let binary = ''\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return binary\n}\n\nexport function stringToUint8Array(binary: string) {\n const len = binary.length\n const arr = new Uint8Array(len)\n\n for (let i = 0; i < len; i++) {\n arr[i] = binary.charCodeAt(i)\n }\n\n return arr\n}\n\nexport function encrypt(\n key: CryptoKey,\n iv: Uint8Array,\n data: Uint8Array\n) {\n return crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv,\n },\n key,\n data\n )\n}\n\nexport function decrypt(\n key: CryptoKey,\n iv: Uint8Array,\n data: Uint8Array\n) {\n return crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv,\n },\n key,\n data\n )\n}\n\n// This is a global singleton that is used to encode/decode the action bound args from\n// the closure. This can't be using a AsyncLocalStorage as it might happen on the module\n// level. Since the client reference manifest won't be mutated, let's use a global singleton\n// to keep it.\nconst SERVER_ACTION_MANIFESTS_SINGLETON = Symbol.for(\n 'next.server.action-manifests'\n)\n\nexport function setReferenceManifestsSingleton({\n page,\n clientReferenceManifest,\n serverActionsManifest,\n serverModuleMap,\n}: {\n page: string\n clientReferenceManifest: DeepReadonly\n serverActionsManifest: DeepReadonly\n serverModuleMap: {\n [id: string]: {\n id: string\n chunks: string[]\n name: string\n }\n }\n}) {\n // @ts-expect-error\n const clientReferenceManifestsPerPage = globalThis[\n SERVER_ACTION_MANIFESTS_SINGLETON\n ]?.clientReferenceManifestsPerPage as\n | undefined\n | DeepReadonly>\n\n // @ts-expect-error\n globalThis[SERVER_ACTION_MANIFESTS_SINGLETON] = {\n clientReferenceManifestsPerPage: {\n ...clientReferenceManifestsPerPage,\n [normalizeAppPath(page)]: clientReferenceManifest,\n },\n serverActionsManifest,\n serverModuleMap,\n }\n}\n\nexport function getServerModuleMap() {\n const serverActionsManifestSingleton = (globalThis as any)[\n SERVER_ACTION_MANIFESTS_SINGLETON\n ] as {\n serverModuleMap: {\n [id: string]: {\n id: string\n chunks: string[]\n name: string\n }\n }\n }\n\n if (!serverActionsManifestSingleton) {\n throw new InvariantError('Missing manifest for Server Actions.')\n }\n\n return serverActionsManifestSingleton.serverModuleMap\n}\n\nexport function getClientReferenceManifestForRsc(): DeepReadonly {\n const serverActionsManifestSingleton = (globalThis as any)[\n SERVER_ACTION_MANIFESTS_SINGLETON\n ] as {\n clientReferenceManifestsPerPage: DeepReadonly<\n Record\n >\n }\n\n if (!serverActionsManifestSingleton) {\n throw new InvariantError('Missing manifest for Server Actions.')\n }\n\n const { clientReferenceManifestsPerPage } = serverActionsManifestSingleton\n const workStore = workAsyncStorage.getStore()\n\n if (!workStore) {\n // If there's no work store defined, we can assume that a client reference\n // manifest is needed during module evaluation, e.g. to create a server\n // action using a higher-order function. This might also use client\n // components which need to be serialized by Flight, and therefore client\n // references need to be resolvable. To make this work, we're returning a\n // merged manifest across all pages. This is fine as long as the module IDs\n // are not page specific, which they are not for Webpack. TODO: Fix this in\n // Turbopack.\n return mergeClientReferenceManifests(clientReferenceManifestsPerPage)\n }\n\n const clientReferenceManifest =\n clientReferenceManifestsPerPage[workStore.route]\n\n if (!clientReferenceManifest) {\n throw new InvariantError(\n `Missing Client Reference Manifest for ${workStore.route}.`\n )\n }\n\n return clientReferenceManifest\n}\n\nexport async function getActionEncryptionKey() {\n if (__next_loaded_action_key) {\n return __next_loaded_action_key\n }\n\n const serverActionsManifestSingleton = (globalThis as any)[\n SERVER_ACTION_MANIFESTS_SINGLETON\n ] as {\n serverActionsManifest: DeepReadonly\n }\n\n if (!serverActionsManifestSingleton) {\n throw new InvariantError('Missing manifest for Server Actions.')\n }\n\n const rawKey =\n process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY ||\n serverActionsManifestSingleton.serverActionsManifest.encryptionKey\n\n if (rawKey === undefined) {\n throw new InvariantError('Missing encryption key for Server Actions')\n }\n\n __next_loaded_action_key = await crypto.subtle.importKey(\n 'raw',\n stringToUint8Array(atob(rawKey)),\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n )\n\n return __next_loaded_action_key\n}\n\nfunction mergeClientReferenceManifests(\n clientReferenceManifestsPerPage: DeepReadonly<\n Record\n >\n): ClientReferenceManifestForRsc {\n const clientReferenceManifests = Object.values(\n clientReferenceManifestsPerPage as Record\n )\n\n const mergedClientReferenceManifest: ClientReferenceManifestForRsc = {\n clientModules: {},\n edgeRscModuleMapping: {},\n rscModuleMapping: {},\n }\n\n for (const clientReferenceManifest of clientReferenceManifests) {\n mergedClientReferenceManifest.clientModules = {\n ...mergedClientReferenceManifest.clientModules,\n ...clientReferenceManifest.clientModules,\n }\n mergedClientReferenceManifest.edgeRscModuleMapping = {\n ...mergedClientReferenceManifest.edgeRscModuleMapping,\n ...clientReferenceManifest.edgeRscModuleMapping,\n }\n mergedClientReferenceManifest.rscModuleMapping = {\n ...mergedClientReferenceManifest.rscModuleMapping,\n ...clientReferenceManifest.rscModuleMapping,\n }\n }\n\n return mergedClientReferenceManifest\n}\n"],"names":["InvariantError","normalizeAppPath","workAsyncStorage","__next_loaded_action_key","arrayBufferToString","buffer","bytes","Uint8Array","len","byteLength","String","fromCharCode","apply","binary","i","stringToUint8Array","length","arr","charCodeAt","encrypt","key","iv","data","crypto","subtle","name","decrypt","SERVER_ACTION_MANIFESTS_SINGLETON","Symbol","for","setReferenceManifestsSingleton","page","clientReferenceManifest","serverActionsManifest","serverModuleMap","globalThis","clientReferenceManifestsPerPage","getServerModuleMap","serverActionsManifestSingleton","getClientReferenceManifestForRsc","workStore","getStore","mergeClientReferenceManifests","route","getActionEncryptionKey","rawKey","process","env","NEXT_SERVER_ACTIONS_ENCRYPTION_KEY","encryptionKey","undefined","importKey","atob","clientReferenceManifests","Object","values","mergedClientReferenceManifest","clientModules","edgeRscModuleMapping","rscModuleMapping"],"mappings":"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","ignoreList":[0]}}, + {"offset": {"line": 7616, "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/shared/lib/router/utils/html-bots.ts"],"sourcesContent":["// This regex contains the bots that we need to do a blocking render for and can't safely stream the response\n// due to how they parse the DOM. For example, they might explicitly check for metadata in the `head` tag, so we can't stream metadata tags after the `head` was sent.\n// Note: The pattern [\\w-]+-Google captures all Google crawlers with \"-Google\" suffix (e.g., Mediapartners-Google, AdsBot-Google, Storebot-Google)\n// as well as crawlers starting with \"Google-\" (e.g., Google-PageRenderer, Google-InspectionTool)\nexport const HTML_LIMITED_BOT_UA_RE =\n /[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i\n"],"names":["HTML_LIMITED_BOT_UA_RE"],"mappings":"AAAA,6GAA6G;AAC7G,sKAAsK;AACtK,kJAAkJ;AAClJ,iGAAiG;;;;;AAC1F,MAAMA,yBACX,sTAAqT","ignoreList":[0]}}, + {"offset": {"line": 7629, "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/shared/lib/router/utils/is-bot.ts"],"sourcesContent":["import { HTML_LIMITED_BOT_UA_RE } from './html-bots'\n\n// Bot crawler that will spin up a headless browser and execute JS.\n// Only the main Googlebot search crawler executes JavaScript, not other Google crawlers.\n// x-ref: https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers\n// This regex specifically matches \"Googlebot\" but NOT \"Mediapartners-Google\", \"AdsBot-Google\", etc.\nconst HEADLESS_BROWSER_BOT_UA_RE = /Googlebot(?!-)|Googlebot$/i\n\nexport const HTML_LIMITED_BOT_UA_RE_STRING = HTML_LIMITED_BOT_UA_RE.source\n\nexport { HTML_LIMITED_BOT_UA_RE }\n\nfunction isDomBotUA(userAgent: string) {\n return HEADLESS_BROWSER_BOT_UA_RE.test(userAgent)\n}\n\nfunction isHtmlLimitedBotUA(userAgent: string) {\n return HTML_LIMITED_BOT_UA_RE.test(userAgent)\n}\n\nexport function isBot(userAgent: string): boolean {\n return isDomBotUA(userAgent) || isHtmlLimitedBotUA(userAgent)\n}\n\nexport function getBotType(userAgent: string): 'dom' | 'html' | undefined {\n if (isDomBotUA(userAgent)) {\n return 'dom'\n }\n if (isHtmlLimitedBotUA(userAgent)) {\n return 'html'\n }\n return undefined\n}\n"],"names":["HTML_LIMITED_BOT_UA_RE","HEADLESS_BROWSER_BOT_UA_RE","HTML_LIMITED_BOT_UA_RE_STRING","source","isDomBotUA","userAgent","test","isHtmlLimitedBotUA","isBot","getBotType","undefined"],"mappings":";;;;;;;;AAAA,SAASA,sBAAsB,QAAQ,cAAa;;AAEpD,mEAAmE;AACnE,yFAAyF;AACzF,4FAA4F;AAC5F,oGAAoG;AACpG,MAAMC,6BAA6B;AAE5B,MAAMC,gCAAgCF,uYAAAA,CAAuBG,MAAM,CAAA;;AAI1E,SAASC,WAAWC,SAAiB;IACnC,OAAOJ,2BAA2BK,IAAI,CAACD;AACzC;AAEA,SAASE,mBAAmBF,SAAiB;IAC3C,OAAOL,uYAAAA,CAAuBM,IAAI,CAACD;AACrC;AAEO,SAASG,MAAMH,SAAiB;IACrC,OAAOD,WAAWC,cAAcE,mBAAmBF;AACrD;AAEO,SAASI,WAAWJ,SAAiB;IAC1C,IAAID,WAAWC,YAAY;QACzB,OAAO;IACT;IACA,IAAIE,mBAAmBF,YAAY;QACjC,OAAO;IACT;IACA,OAAOK;AACT","ignoreList":[0]}}, + {"offset": {"line": 7668, "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/lib/streaming-metadata.ts"],"sourcesContent":["import {\n getBotType,\n HTML_LIMITED_BOT_UA_RE_STRING,\n} from '../../shared/lib/router/utils/is-bot'\nimport type { BaseNextRequest } from '../base-http'\n\nexport function shouldServeStreamingMetadata(\n userAgent: string,\n htmlLimitedBots: string | undefined\n): boolean {\n const blockingMetadataUARegex = new RegExp(\n htmlLimitedBots || HTML_LIMITED_BOT_UA_RE_STRING,\n 'i'\n )\n // Only block metadata for HTML-limited bots\n if (userAgent && blockingMetadataUARegex.test(userAgent)) {\n return false\n }\n return true\n}\n\n// When the request UA is a html-limited bot, we should do a dynamic render.\n// In this case, postpone state is not sent.\nexport function isHtmlBotRequest(req: {\n headers: BaseNextRequest['headers']\n}): boolean {\n const ua = req.headers['user-agent'] || ''\n const botType = getBotType(ua)\n\n return botType === 'html'\n}\n"],"names":["getBotType","HTML_LIMITED_BOT_UA_RE_STRING","shouldServeStreamingMetadata","userAgent","htmlLimitedBots","blockingMetadataUARegex","RegExp","test","isHtmlBotRequest","req","ua","headers","botType"],"mappings":";;;;;;AAAA,SACEA,UAAU,EACVC,6BAA6B,QACxB,uCAAsC;;AAGtC,SAASC,6BACdC,SAAiB,EACjBC,eAAmC;IAEnC,MAAMC,0BAA0B,IAAIC,OAClCF,mBAAmBH,2ZAAAA,EACnB;IAEF,4CAA4C;IAC5C,IAAIE,aAAaE,wBAAwBE,IAAI,CAACJ,YAAY;QACxD,OAAO;IACT;IACA,OAAO;AACT;AAIO,SAASK,iBAAiBC,GAEhC;IACC,MAAMC,KAAKD,IAAIE,OAAO,CAAC,aAAa,IAAI;IACxC,MAAMC,cAAUZ,wYAAAA,EAAWU;IAE3B,OAAOE,YAAY;AACrB","ignoreList":[0]}}, + {"offset": {"line": 7693, "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/app-render/action-utils.ts"],"sourcesContent":["import type { ActionManifest } from '../../build/webpack/plugins/flight-client-entry-plugin'\nimport { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'\nimport { pathHasPrefix } from '../../shared/lib/router/utils/path-has-prefix'\nimport { removePathPrefix } from '../../shared/lib/router/utils/remove-path-prefix'\nimport { workAsyncStorage } from './work-async-storage.external'\n\n// This function creates a Flight-acceptable server module map proxy from our\n// Server Reference Manifest similar to our client module map.\n// This is because our manifest contains a lot of internal Next.js data that\n// are relevant to the runtime, workers, etc. that React doesn't need to know.\nexport function createServerModuleMap({\n serverActionsManifest,\n}: {\n serverActionsManifest: ActionManifest\n}) {\n return new Proxy(\n {},\n {\n get: (_, id: string) => {\n const workers =\n serverActionsManifest[\n process.env.NEXT_RUNTIME === 'edge' ? 'edge' : 'node'\n ]?.[id]?.workers\n\n if (!workers) {\n return undefined\n }\n\n const workStore = workAsyncStorage.getStore()\n\n let workerEntry:\n | { moduleId: string | number; async: boolean }\n | undefined\n\n if (workStore) {\n workerEntry = workers[normalizeWorkerPageName(workStore.page)]\n } else {\n // If there's no work store defined, we can assume that a server\n // module map is needed during module evaluation, e.g. to create a\n // server action using a higher-order function. Therefore it should be\n // safe to return any entry from the manifest that matches the action\n // ID. They all refer to the same module ID, which must also exist in\n // the current page bundle. TODO: This is currently not guaranteed in\n // Turbopack, and needs to be fixed.\n workerEntry = Object.values(workers).at(0)\n }\n\n if (!workerEntry) {\n return undefined\n }\n\n const { moduleId, async } = workerEntry\n\n return { id: moduleId, name: id, chunks: [], async }\n },\n }\n )\n}\n\n/**\n * Checks if the requested action has a worker for the current page.\n * If not, it returns the first worker that has a handler for the action.\n */\nexport function selectWorkerForForwarding(\n actionId: string,\n pageName: string,\n serverActionsManifest: ActionManifest\n) {\n const workers =\n serverActionsManifest[\n process.env.NEXT_RUNTIME === 'edge' ? 'edge' : 'node'\n ][actionId]?.workers\n const workerName = normalizeWorkerPageName(pageName)\n\n // no workers, nothing to forward to\n if (!workers) return\n\n // if there is a worker for this page, no need to forward it.\n if (workers[workerName]) {\n return\n }\n\n // otherwise, grab the first worker that has a handler for this action id\n return denormalizeWorkerPageName(Object.keys(workers)[0])\n}\n\n/**\n * The flight entry loader keys actions by bundlePath.\n * bundlePath corresponds with the relative path (including 'app') to the page entrypoint.\n */\nfunction normalizeWorkerPageName(pageName: string) {\n if (pathHasPrefix(pageName, 'app')) {\n return pageName\n }\n\n return 'app' + pageName\n}\n\n/**\n * Converts a bundlePath (relative path to the entrypoint) to a routable page name\n */\nfunction denormalizeWorkerPageName(bundlePath: string) {\n return normalizeAppPath(removePathPrefix(bundlePath, 'app'))\n}\n"],"names":["normalizeAppPath","pathHasPrefix","removePathPrefix","workAsyncStorage","createServerModuleMap","serverActionsManifest","Proxy","get","_","id","workers","process","env","NEXT_RUNTIME","undefined","workStore","getStore","workerEntry","normalizeWorkerPageName","page","Object","values","at","moduleId","async","name","chunks","selectWorkerForForwarding","actionId","pageName","workerName","denormalizeWorkerPageName","keys","bundlePath"],"mappings":";;;;;;AACA,SAASA,gBAAgB,QAAQ,0CAAyC;AAC1E,SAASC,aAAa,QAAQ,gDAA+C;AAC7E,SAASC,gBAAgB,QAAQ,mDAAkD;AACnF,SAASC,gBAAgB,QAAQ,gCAA+B;;;;;AAMzD,SAASC,sBAAsB,EACpCC,qBAAqB,EAGtB;IACC,OAAO,IAAIC,MACT,CAAC,GACD;QACEC,KAAK,CAACC,GAAGC;gBAELJ,4BAAAA;YADF,MAAMK,UAAAA,CACJL,0BAAAA,qBAAqB,CACnBM,QAAQC,GAAG,CAACC,YAAY,KAAK,SAAS,0BAAS,OAChD,KAAA,OAAA,KAAA,IAAA,CAFDR,6BAAAA,uBAEG,CAACI,GAAG,KAAA,OAAA,KAAA,IAFPJ,2BAESK,OAAO;YAElB,IAAI,CAACA,SAAS;gBACZ,OAAOI;YACT;YAEA,MAAMC,YAAYZ,uRAAAA,CAAiBa,QAAQ;YAE3C,IAAIC;YAIJ,IAAIF,WAAW;gBACbE,cAAcP,OAAO,CAACQ,wBAAwBH,UAAUI,IAAI,EAAE;YAChE,OAAO;gBACL,gEAAgE;gBAChE,kEAAkE;gBAClE,sEAAsE;gBACtE,qEAAqE;gBACrE,qEAAqE;gBACrE,qEAAqE;gBACrE,oCAAoC;gBACpCF,cAAcG,OAAOC,MAAM,CAACX,SAASY,EAAE,CAAC;YAC1C;YAEA,IAAI,CAACL,aAAa;gBAChB,OAAOH;YACT;YAEA,MAAM,EAAES,QAAQ,EAAEC,KAAK,EAAE,GAAGP;YAE5B,OAAO;gBAAER,IAAIc;gBAAUE,MAAMhB;gBAAIiB,QAAQ,EAAE;gBAAEF;YAAM;QACrD;IACF;AAEJ;AAMO,SAASG,0BACdC,QAAgB,EAChBC,QAAgB,EAChBxB,qBAAqC;QAGnCA;IADF,MAAMK,UAAAA,CACJL,mCAAAA,qBAAqB,CACnBM,QAAQC,GAAG,CAACC,YAAY,KAAK,SAAS,0BAAS,OAChD,CAACe,SAAS,KAAA,OAAA,KAAA,IAFXvB,iCAEaK,OAAO;IACtB,MAAMoB,aAAaZ,wBAAwBW;IAE3C,oCAAoC;IACpC,IAAI,CAACnB,SAAS;IAEd,6DAA6D;IAC7D,IAAIA,OAAO,CAACoB,WAAW,EAAE;QACvB;IACF;IAEA,yEAAyE;IACzE,OAAOC,0BAA0BX,OAAOY,IAAI,CAACtB,QAAQ,CAAC,EAAE;AAC1D;AAEA;;;CAGC,GACD,SAASQ,wBAAwBW,QAAgB;IAC/C,QAAI5B,uYAAAA,EAAc4B,UAAU,QAAQ;QAClC,OAAOA;IACT;IAEA,OAAO,QAAQA;AACjB;AAEA;;CAEC,GACD,SAASE,0BAA0BE,UAAkB;IACnD,WAAOjC,iYAAAA,MAAiBE,6YAAAA,EAAiB+B,YAAY;AACvD","ignoreList":[0]}}, + {"offset": {"line": 7773, "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/lib/server-action-request-meta.ts"],"sourcesContent":["import type { IncomingMessage } from 'http'\nimport type { BaseNextRequest } from '../base-http'\nimport type { NextRequest } from '../web/exports'\nimport { ACTION_HEADER } from '../../client/components/app-router-headers'\n\nexport function getServerActionRequestMetadata(\n req: IncomingMessage | BaseNextRequest | NextRequest\n): {\n actionId: string | null\n isURLEncodedAction: boolean\n isMultipartAction: boolean\n isFetchAction: boolean\n isPossibleServerAction: boolean\n} {\n let actionId: string | null\n let contentType: string | null\n\n if (req.headers instanceof Headers) {\n actionId = req.headers.get(ACTION_HEADER) ?? null\n contentType = req.headers.get('content-type')\n } else {\n actionId = (req.headers[ACTION_HEADER] as string) ?? null\n contentType = req.headers['content-type'] ?? null\n }\n\n const isURLEncodedAction = Boolean(\n req.method === 'POST' && contentType === 'application/x-www-form-urlencoded'\n )\n const isMultipartAction = Boolean(\n req.method === 'POST' && contentType?.startsWith('multipart/form-data')\n )\n const isFetchAction = Boolean(\n actionId !== undefined &&\n typeof actionId === 'string' &&\n req.method === 'POST'\n )\n\n const isPossibleServerAction = Boolean(\n isFetchAction || isURLEncodedAction || isMultipartAction\n )\n\n return {\n actionId,\n isURLEncodedAction,\n isMultipartAction,\n isFetchAction,\n isPossibleServerAction,\n }\n}\n\nexport function getIsPossibleServerAction(\n req: IncomingMessage | BaseNextRequest | NextRequest\n): boolean {\n return getServerActionRequestMetadata(req).isPossibleServerAction\n}\n"],"names":["ACTION_HEADER","getServerActionRequestMetadata","req","actionId","contentType","headers","Headers","get","isURLEncodedAction","Boolean","method","isMultipartAction","startsWith","isFetchAction","undefined","isPossibleServerAction","getIsPossibleServerAction"],"mappings":";;;;;;AAGA,SAASA,aAAa,QAAQ,6CAA4C;;AAEnE,SAASC,+BACdC,GAAoD;IAQpD,IAAIC;IACJ,IAAIC;IAEJ,IAAIF,IAAIG,OAAO,YAAYC,SAAS;QAClCH,WAAWD,IAAIG,OAAO,CAACE,GAAG,CAACP,8XAAAA,KAAkB;QAC7CI,cAAcF,IAAIG,OAAO,CAACE,GAAG,CAAC;IAChC,OAAO;QACLJ,WAAYD,IAAIG,OAAO,CAACL,8XAAAA,CAAc,IAAe;QACrDI,cAAcF,IAAIG,OAAO,CAAC,eAAe,IAAI;IAC/C;IAEA,MAAMG,qBAAqBC,QACzBP,IAAIQ,MAAM,KAAK,UAAUN,gBAAgB;IAE3C,MAAMO,oBAAoBF,QACxBP,IAAIQ,MAAM,KAAK,UAAA,CAAUN,eAAAA,OAAAA,KAAAA,IAAAA,YAAaQ,UAAU,CAAC,sBAAA;IAEnD,MAAMC,gBAAgBJ,QACpBN,aAAaW,aACX,OAAOX,aAAa,YACpBD,IAAIQ,MAAM,KAAK;IAGnB,MAAMK,yBAAyBN,QAC7BI,iBAAiBL,sBAAsBG;IAGzC,OAAO;QACLR;QACAK;QACAG;QACAE;QACAE;IACF;AACF;AAEO,SAASC,0BACdd,GAAoD;IAEpD,OAAOD,+BAA+BC,KAAKa,sBAAsB;AACnE","ignoreList":[0]}}, + {"offset": {"line": 7810, "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/lib/fallback.ts"],"sourcesContent":["/**\n * Describes the different fallback modes that a given page can have.\n */\nexport const enum FallbackMode {\n /**\n * A BLOCKING_STATIC_RENDER fallback will block the request until the page is\n * generated. No fallback page will be rendered, and users will have to wait\n * to render the page.\n */\n BLOCKING_STATIC_RENDER = 'BLOCKING_STATIC_RENDER',\n\n /**\n * When set to PRERENDER, a fallback page will be sent to users in place of\n * forcing them to wait for the page to be generated. This allows the user to\n * see a rendered page earlier.\n */\n PRERENDER = 'PRERENDER',\n\n /**\n * When set to NOT_FOUND, pages that are not already prerendered will result\n * in a not found response.\n */\n NOT_FOUND = 'NOT_FOUND',\n}\n\n/**\n * The fallback value returned from the `getStaticPaths` function.\n */\nexport type GetStaticPathsFallback = boolean | 'blocking'\n\n/**\n * Parses the fallback field from the prerender manifest.\n *\n * @param fallbackField The fallback field from the prerender manifest.\n * @returns The fallback mode.\n */\nexport function parseFallbackField(\n fallbackField: string | boolean | null | undefined\n): FallbackMode | undefined {\n if (typeof fallbackField === 'string') {\n return FallbackMode.PRERENDER\n } else if (fallbackField === null) {\n return FallbackMode.BLOCKING_STATIC_RENDER\n } else if (fallbackField === false) {\n return FallbackMode.NOT_FOUND\n } else if (fallbackField === undefined) {\n return undefined\n } else {\n throw new Error(\n `Invalid fallback option: ${fallbackField}. Fallback option must be a string, null, undefined, or false.`\n )\n }\n}\n\nexport function fallbackModeToFallbackField(\n fallback: FallbackMode,\n page: string | undefined\n): string | false | null {\n switch (fallback) {\n case FallbackMode.BLOCKING_STATIC_RENDER:\n return null\n case FallbackMode.NOT_FOUND:\n return false\n case FallbackMode.PRERENDER:\n if (!page) {\n throw new Error(\n `Invariant: expected a page to be provided when fallback mode is \"${fallback}\"`\n )\n }\n\n return page\n default:\n throw new Error(`Invalid fallback mode: ${fallback}`)\n }\n}\n\n/**\n * Parses the fallback from the static paths result.\n *\n * @param result The result from the static paths function.\n * @returns The fallback mode.\n */\nexport function parseStaticPathsResult(\n result: GetStaticPathsFallback\n): FallbackMode {\n if (result === true) {\n return FallbackMode.PRERENDER\n } else if (result === 'blocking') {\n return FallbackMode.BLOCKING_STATIC_RENDER\n } else {\n return FallbackMode.NOT_FOUND\n }\n}\n"],"names":["FallbackMode","parseFallbackField","fallbackField","undefined","Error","fallbackModeToFallbackField","fallback","page","parseStaticPathsResult","result"],"mappings":"AAAA;;CAEC,GACD;;;;;;;;;;AAAO,IAAWA,eAAAA,WAAAA,GAAAA,SAAAA,YAAAA;IAChB;;;;GAIC,GAAA,YAAA,CAAA,yBAAA,GAAA;IAGD;;;;GAIC,GAAA,YAAA,CAAA,YAAA,GAAA;IAGD;;;GAGC,GAAA,YAAA,CAAA,YAAA,GAAA;WAlBeA;MAoBjB;AAaM,SAASC,mBACdC,aAAkD;IAElD,IAAI,OAAOA,kBAAkB,UAAU;QACrC,OAAA;IACF,OAAO,IAAIA,kBAAkB,MAAM;QACjC,OAAA;IACF,OAAO,IAAIA,kBAAkB,OAAO;QAClC,OAAA;IACF,OAAO,IAAIA,kBAAkBC,WAAW;QACtC,OAAOA;IACT,OAAO;QACL,MAAM,OAAA,cAEL,CAFK,IAAIC,MACR,CAAC,yBAAyB,EAAEF,cAAc,8DAA8D,CAAC,GADrG,qBAAA;mBAAA;wBAAA;0BAAA;QAEN;IACF;AACF;AAEO,SAASG,4BACdC,QAAsB,EACtBC,IAAwB;IAExB,OAAQD;QACN,KAAA;YACE,OAAO;QACT,KAAA;YACE,OAAO;QACT,KAAA;YACE,IAAI,CAACC,MAAM;gBACT,MAAM,OAAA,cAEL,CAFK,IAAIH,MACR,CAAC,iEAAiE,EAAEE,SAAS,CAAC,CAAC,GAD3E,qBAAA;2BAAA;gCAAA;kCAAA;gBAEN;YACF;YAEA,OAAOC;QACT;YACE,MAAM,OAAA,cAA+C,CAA/C,IAAIH,MAAM,CAAC,uBAAuB,EAAEE,UAAU,GAA9C,qBAAA;uBAAA;4BAAA;8BAAA;YAA8C;IACxD;AACF;AAQO,SAASE,uBACdC,MAA8B;IAE9B,IAAIA,WAAW,MAAM;QACnB,OAAA;IACF,OAAO,IAAIA,WAAW,YAAY;QAChC,OAAA;IACF,OAAO;QACL,OAAA;IACF;AACF","ignoreList":[0]}}, + {"offset": {"line": 7892, "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/lib/etag.ts"],"sourcesContent":["/**\n * FNV-1a Hash implementation\n * @author Travis Webb (tjwebb) \n *\n * Ported from https://github.com/tjwebb/fnv-plus/blob/master/index.js\n *\n * Simplified, optimized and add modified for 52 bit, which provides a larger hash space\n * and still making use of Javascript's 53-bit integer space.\n */\nexport const fnv1a52 = (str: string) => {\n const len = str.length\n let i = 0,\n t0 = 0,\n v0 = 0x2325,\n t1 = 0,\n v1 = 0x8422,\n t2 = 0,\n v2 = 0x9ce4,\n t3 = 0,\n v3 = 0xcbf2\n\n while (i < len) {\n v0 ^= str.charCodeAt(i++)\n t0 = v0 * 435\n t1 = v1 * 435\n t2 = v2 * 435\n t3 = v3 * 435\n t2 += v0 << 8\n t3 += v1 << 8\n t1 += t0 >>> 16\n v0 = t0 & 65535\n t2 += t1 >>> 16\n v1 = t1 & 65535\n v3 = (t3 + (t2 >>> 16)) & 65535\n v2 = t2 & 65535\n }\n\n return (\n (v3 & 15) * 281474976710656 +\n v2 * 4294967296 +\n v1 * 65536 +\n (v0 ^ (v3 >> 4))\n )\n}\n\nexport const generateETag = (payload: string, weak = false) => {\n const prefix = weak ? 'W/\"' : '\"'\n return (\n prefix + fnv1a52(payload).toString(36) + payload.length.toString(36) + '\"'\n )\n}\n"],"names":["fnv1a52","str","len","length","i","t0","v0","t1","v1","t2","v2","t3","v3","charCodeAt","generateETag","payload","weak","prefix","toString"],"mappings":"AAAA;;;;;;;;CAQC,GACD;;;;;;AAAO,MAAMA,UAAU,CAACC;IACtB,MAAMC,MAAMD,IAAIE,MAAM;IACtB,IAAIC,IAAI,GACNC,KAAK,GACLC,KAAK,QACLC,KAAK,GACLC,KAAK,QACLC,KAAK,GACLC,KAAK,QACLC,KAAK,GACLC,KAAK;IAEP,MAAOR,IAAIF,IAAK;QACdI,MAAML,IAAIY,UAAU,CAACT;QACrBC,KAAKC,KAAK;QACVC,KAAKC,KAAK;QACVC,KAAKC,KAAK;QACVC,KAAKC,KAAK;QACVH,MAAMH,MAAM;QACZK,MAAMH,MAAM;QACZD,MAAMF,OAAO;QACbC,KAAKD,KAAK;QACVI,MAAMF,OAAO;QACbC,KAAKD,KAAK;QACVK,KAAMD,KAAMF,CAAAA,OAAO,EAAC,IAAM;QAC1BC,KAAKD,KAAK;IACZ;IAEA,OACGG,CAAAA,KAAK,EAAC,IAAK,kBACZF,KAAK,aACLF,KAAK,QACJF,CAAAA,KAAMM,MAAM,CAAC;AAElB,EAAC;AAEM,MAAME,eAAe,CAACC,SAAiBC,OAAO,KAAK;IACxD,MAAMC,SAASD,OAAO,QAAQ;IAC9B,OACEC,SAASjB,QAAQe,SAASG,QAAQ,CAAC,MAAMH,QAAQZ,MAAM,CAACe,QAAQ,CAAC,MAAM;AAE3E,EAAC","ignoreList":[0]}}, + {"offset": {"line": 7933, "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/dist/compiled/fresh/index.js"],"sourcesContent":["(()=>{\"use strict\";var e={695:e=>{\n/*!\n * fresh\n * Copyright(c) 2012 TJ Holowaychuk\n * Copyright(c) 2016-2017 Douglas Christopher Wilson\n * MIT Licensed\n */\nvar r=/(?:^|,)\\s*?no-cache\\s*?(?:,|$)/;e.exports=fresh;function fresh(e,a){var t=e[\"if-modified-since\"];var s=e[\"if-none-match\"];if(!t&&!s){return false}var i=e[\"cache-control\"];if(i&&r.test(i)){return false}if(s&&s!==\"*\"){var f=a[\"etag\"];if(!f){return false}var n=true;var u=parseTokenList(s);for(var _=0;_ {\n if (isResSent(res)) {\n return\n }\n\n if (poweredByHeader && result.contentType === HTML_CONTENT_TYPE_HEADER) {\n res.setHeader('X-Powered-By', 'Next.js')\n }\n\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheControl && !res.getHeader('Cache-Control')) {\n res.setHeader('Cache-Control', getCacheControlHeader(cacheControl))\n }\n\n const payload = result.isDynamic ? null : result.toUnchunkedString()\n\n if (generateEtags && payload !== null) {\n const etag = generateETag(payload)\n if (sendEtagResponse(req, res, etag)) {\n return\n }\n }\n\n if (!res.getHeader('Content-Type') && result.contentType) {\n res.setHeader('Content-Type', result.contentType)\n }\n\n if (payload) {\n res.setHeader('Content-Length', Buffer.byteLength(payload))\n }\n\n if (req.method === 'HEAD') {\n res.end(null)\n return\n }\n\n if (payload !== null) {\n res.end(payload)\n return\n }\n\n // Pipe the render result to the response after we get a writer for it.\n await result.pipeToNodeResponse(res)\n}\n"],"names":["isResSent","generateETag","fresh","getCacheControlHeader","HTML_CONTENT_TYPE_HEADER","sendEtagResponse","req","res","etag","setHeader","headers","statusCode","end","sendRenderResult","result","generateEtags","poweredByHeader","cacheControl","contentType","getHeader","payload","isDynamic","toUnchunkedString","Buffer","byteLength","method","pipeToNodeResponse"],"mappings":";;;;;;AAIA,SAASA,SAAS,QAAQ,sBAAqB;AAC/C,SAASC,YAAY,QAAQ,aAAY;AACzC,OAAOC,WAAW,2BAA0B;AAC5C,SAASC,qBAAqB,QAAQ,sBAAqB;AAC3D,SAASC,wBAAwB,QAAQ,mBAAkB;;;;;;AAEpD,SAASC,iBACdC,GAAoB,EACpBC,GAAmB,EACnBC,IAAwB;IAExB,IAAIA,MAAM;QACR;;;;;KAKC,GACDD,IAAIE,SAAS,CAAC,QAAQD;IACxB;IAEA,QAAIN,2VAAAA,EAAMI,IAAII,OAAO,EAAE;QAAEF;IAAK,IAAI;QAChCD,IAAII,UAAU,GAAG;QACjBJ,IAAIK,GAAG;QACP,OAAO;IACT;IAEA,OAAO;AACT;AAEO,eAAeC,iBAAiB,EACrCP,GAAG,EACHC,GAAG,EACHO,MAAM,EACNC,aAAa,EACbC,eAAe,EACfC,YAAY,EAQb;IACC,QAAIjB,gWAAAA,EAAUO,MAAM;QAClB;IACF;IAEA,IAAIS,mBAAmBF,OAAOI,WAAW,KAAKd,yWAAAA,EAA0B;QACtEG,IAAIE,SAAS,CAAC,gBAAgB;IAChC;IAEA,2DAA2D;IAC3D,6DAA6D;IAC7D,IAAIQ,gBAAgB,CAACV,IAAIY,SAAS,CAAC,kBAAkB;QACnDZ,IAAIE,SAAS,CAAC,qBAAiBN,uXAAAA,EAAsBc;IACvD;IAEA,MAAMG,UAAUN,OAAOO,SAAS,GAAG,OAAOP,OAAOQ,iBAAiB;IAElE,IAAIP,iBAAiBK,YAAY,MAAM;QACrC,MAAMZ,WAAOP,kWAAAA,EAAamB;QAC1B,IAAIf,iBAAiBC,KAAKC,KAAKC,OAAO;YACpC;QACF;IACF;IAEA,IAAI,CAACD,IAAIY,SAAS,CAAC,mBAAmBL,OAAOI,WAAW,EAAE;QACxDX,IAAIE,SAAS,CAAC,gBAAgBK,OAAOI,WAAW;IAClD;IAEA,IAAIE,SAAS;QACXb,IAAIE,SAAS,CAAC,kBAAkBc,OAAOC,UAAU,CAACJ;IACpD;IAEA,IAAId,IAAImB,MAAM,KAAK,QAAQ;QACzBlB,IAAIK,GAAG,CAAC;QACR;IACF;IAEA,IAAIQ,YAAY,MAAM;QACpBb,IAAIK,GAAG,CAACQ;QACR;IACF;IAEA,uEAAuE;IACvE,MAAMN,OAAOY,kBAAkB,CAACnB;AAClC","ignoreList":[0]}}, + {"offset": {"line": 8151, "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/build/templates/app-page.ts"],"sourcesContent":["import type { LoaderTree } from '../../server/lib/app-dir-module'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\n\nimport {\n AppPageRouteModule,\n type AppPageRouteHandlerContext,\n} from '../../server/route-modules/app-page/module.compiled' with { 'turbopack-transition': 'next-ssr' }\n\nimport { RouteKind } from '../../server/route-kind' with { 'turbopack-transition': 'next-server-utility' }\n\nimport { getRevalidateReason } from '../../server/instrumentation/utils'\nimport { getTracer, SpanKind, type Span } from '../../server/lib/trace/tracer'\nimport { addRequestMeta, getRequestMeta } from '../../server/request-meta'\nimport { BaseServerSpan } from '../../server/lib/trace/constants'\nimport { interopDefault } from '../../server/app-render/interop-default'\nimport { stripFlightHeaders } from '../../server/app-render/strip-flight-headers'\nimport { NodeNextRequest, NodeNextResponse } from '../../server/base-http/node'\nimport { checkIsAppPPREnabled } from '../../server/lib/experimental/ppr'\nimport {\n getFallbackRouteParams,\n createOpaqueFallbackRouteParams,\n type OpaqueFallbackRouteParams,\n} from '../../server/request/fallback-params'\nimport { setReferenceManifestsSingleton } from '../../server/app-render/encryption-utils'\nimport {\n isHtmlBotRequest,\n shouldServeStreamingMetadata,\n} from '../../server/lib/streaming-metadata'\nimport { createServerModuleMap } from '../../server/app-render/action-utils'\nimport { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'\nimport { getIsPossibleServerAction } from '../../server/lib/server-action-request-meta'\nimport {\n RSC_HEADER,\n NEXT_ROUTER_PREFETCH_HEADER,\n NEXT_IS_PRERENDER_HEADER,\n NEXT_DID_POSTPONE_HEADER,\n RSC_CONTENT_TYPE_HEADER,\n} from '../../client/components/app-router-headers'\nimport { getBotType, isBot } from '../../shared/lib/router/utils/is-bot'\nimport {\n CachedRouteKind,\n IncrementalCacheKind,\n type CachedAppPageValue,\n type CachedPageValue,\n type ResponseCacheEntry,\n type ResponseGenerator,\n} from '../../server/response-cache'\nimport { FallbackMode, parseFallbackField } from '../../lib/fallback'\nimport RenderResult from '../../server/render-result'\nimport {\n CACHE_ONE_YEAR,\n HTML_CONTENT_TYPE_HEADER,\n NEXT_CACHE_TAGS_HEADER,\n} from '../../lib/constants'\nimport type { CacheControl } from '../../server/lib/cache-control'\nimport { ENCODED_TAGS } from '../../server/stream-utils/encoded-tags'\nimport { sendRenderResult } from '../../server/send-payload'\nimport { NoFallbackError } from '../../shared/lib/no-fallback-error.external'\n\n// These are injected by the loader afterwards.\n\n/**\n * The tree created in next-app-loader that holds component segments and modules\n * and I've updated it.\n */\ndeclare const tree: LoaderTree\n\n// We inject the tree and pages here so that we can use them in the route\n// module.\n// INJECT:tree\n\nimport GlobalError from 'VAR_MODULE_GLOBAL_ERROR' with { 'turbopack-transition': 'next-server-utility' }\n\nexport { GlobalError }\n\n// These are injected by the loader afterwards.\ndeclare const __next_app_require__: (id: string | number) => unknown\ndeclare const __next_app_load_chunk__: (id: string | number) => Promise\n\n// INJECT:__next_app_require__\n// INJECT:__next_app_load_chunk__\n\nexport const __next_app__ = {\n require: __next_app_require__,\n loadChunk: __next_app_load_chunk__,\n}\n\nimport * as entryBase from '../../server/app-render/entry-base' with { 'turbopack-transition': 'next-server-utility' }\nimport { RedirectStatusCode } from '../../client/components/redirect-status-code'\nimport { InvariantError } from '../../shared/lib/invariant-error'\nimport { scheduleOnNextTick } from '../../lib/scheduler'\nimport { isInterceptionRouteAppPath } from '../../shared/lib/router/utils/interception-routes'\n\nexport * from '../../server/app-render/entry-base' with { 'turbopack-transition': 'next-server-utility' }\n\n// Create and export the route module that will be consumed.\nexport const routeModule = new AppPageRouteModule({\n definition: {\n kind: RouteKind.APP_PAGE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n // The following aren't used in production.\n bundlePath: '',\n filename: '',\n appPaths: [],\n },\n userland: {\n loaderTree: tree,\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n})\n\nexport async function handler(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: {\n waitUntil: (prom: Promise) => void\n }\n) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint())\n }\n let srcPage = 'VAR_DEFINITION_PAGE'\n\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/'\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/'\n }\n const multiZoneDraftMode = process.env\n .__NEXT_MULTI_ZONE_DRAFT_MODE as any as boolean\n\n const isMinimalMode = Boolean(\n process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode')\n )\n\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode,\n })\n\n if (!prepareResult) {\n res.statusCode = 400\n res.end('Bad Request')\n ctx.waitUntil?.(Promise.resolve())\n return null\n }\n\n const {\n buildId,\n query,\n params,\n pageIsDynamic,\n buildManifest,\n nextFontManifest,\n reactLoadableManifest,\n serverActionsManifest,\n clientReferenceManifest,\n subresourceIntegrityManifest,\n prerenderManifest,\n isDraftMode,\n resolvedPathname,\n revalidateOnlyGenerated,\n routerServerContext,\n nextConfig,\n parsedUrl,\n interceptionRoutePatterns,\n } = prepareResult\n\n const normalizedSrcPage = normalizeAppPath(srcPage)\n\n let { isOnDemandRevalidate } = prepareResult\n\n // We use the resolvedPathname instead of the parsedUrl.pathname because it\n // is not rewritten as resolvedPathname is. This will ensure that the correct\n // prerender info is used instead of using the original pathname as the\n // source. If however PPR is enabled and cacheComponents is disabled, we\n // treat the pathname as dynamic. Currently, there's a bug in the PPR\n // implementation that incorrectly leaves %%drp placeholders in the output of\n // parallel routes. This is addressed with cacheComponents.\n const prerenderInfo =\n nextConfig.experimental.ppr &&\n !nextConfig.cacheComponents &&\n isInterceptionRouteAppPath(resolvedPathname)\n ? null\n : routeModule.match(resolvedPathname, prerenderManifest)\n\n const isPrerendered = !!prerenderManifest.routes[resolvedPathname]\n\n const userAgent = req.headers['user-agent'] || ''\n const botType = getBotType(userAgent)\n const isHtmlBot = isHtmlBotRequest(req)\n\n /**\n * If true, this indicates that the request being made is for an app\n * prefetch request.\n */\n const isPrefetchRSCRequest =\n getRequestMeta(req, 'isPrefetchRSCRequest') ??\n req.headers[NEXT_ROUTER_PREFETCH_HEADER] === '1' // exclude runtime prefetches, which use '2'\n\n // NOTE: Don't delete headers[RSC] yet, it still needs to be used in renderToHTML later\n\n const isRSCRequest =\n getRequestMeta(req, 'isRSCRequest') ?? Boolean(req.headers[RSC_HEADER])\n\n const isPossibleServerAction = getIsPossibleServerAction(req)\n\n /**\n * If the route being rendered is an app page, and the ppr feature has been\n * enabled, then the given route _could_ support PPR.\n */\n const couldSupportPPR: boolean = checkIsAppPPREnabled(\n nextConfig.experimental.ppr\n )\n\n // When enabled, this will allow the use of the `?__nextppronly` query to\n // enable debugging of the static shell.\n const hasDebugStaticShellQuery =\n process.env.__NEXT_EXPERIMENTAL_STATIC_SHELL_DEBUGGING === '1' &&\n typeof query.__nextppronly !== 'undefined' &&\n couldSupportPPR\n\n // When enabled, this will allow the use of the `?__nextppronly` query\n // to enable debugging of the fallback shell.\n const hasDebugFallbackShellQuery =\n hasDebugStaticShellQuery && query.__nextppronly === 'fallback'\n\n // This page supports PPR if it is marked as being `PARTIALLY_STATIC` in the\n // prerender manifest and this is an app page.\n const isRoutePPREnabled: boolean =\n couldSupportPPR &&\n ((\n prerenderManifest.routes[normalizedSrcPage] ??\n prerenderManifest.dynamicRoutes[normalizedSrcPage]\n )?.renderingMode === 'PARTIALLY_STATIC' ||\n // Ideally we'd want to check the appConfig to see if this page has PPR\n // enabled or not, but that would require plumbing the appConfig through\n // to the server during development. We assume that the page supports it\n // but only during development.\n (hasDebugStaticShellQuery &&\n (routeModule.isDev === true ||\n routerServerContext?.experimentalTestProxy === true)))\n\n const isDebugStaticShell: boolean =\n hasDebugStaticShellQuery && isRoutePPREnabled\n\n // We should enable debugging dynamic accesses when the static shell\n // debugging has been enabled and we're also in development mode.\n const isDebugDynamicAccesses =\n isDebugStaticShell && routeModule.isDev === true\n\n const isDebugFallbackShell = hasDebugFallbackShellQuery && isRoutePPREnabled\n\n // If we're in minimal mode, then try to get the postponed information from\n // the request metadata. If available, use it for resuming the postponed\n // render.\n const minimalPostponed = isRoutePPREnabled\n ? getRequestMeta(req, 'postponed')\n : undefined\n\n // If PPR is enabled, and this is a RSC request (but not a prefetch), then\n // we can use this fact to only generate the flight data for the request\n // because we can't cache the HTML (as it's also dynamic).\n let isDynamicRSCRequest =\n isRoutePPREnabled && isRSCRequest && !isPrefetchRSCRequest\n\n // During a PPR revalidation, the RSC request is not dynamic if we do not have the postponed data.\n // We only attach the postponed data during a resume. If there's no postponed data, then it must be a revalidation.\n // This is to ensure that we don't bypass the cache during a revalidation.\n if (isMinimalMode) {\n isDynamicRSCRequest = isDynamicRSCRequest && !!minimalPostponed\n }\n\n // Need to read this before it's stripped by stripFlightHeaders. We don't\n // need to transfer it to the request meta because it's only read\n // within this function; the static segment data should have already been\n // generated, so we will always either return a static response or a 404.\n const segmentPrefetchHeader = getRequestMeta(req, 'segmentPrefetchRSCRequest')\n\n // TODO: investigate existing bug with shouldServeStreamingMetadata always\n // being true for a revalidate due to modifying the base-server this.renderOpts\n // when fixing this to correct logic it causes hydration issue since we set\n // serveStreamingMetadata to true during export\n const serveStreamingMetadata =\n isHtmlBot && isRoutePPREnabled\n ? false\n : !userAgent\n ? true\n : shouldServeStreamingMetadata(userAgent, nextConfig.htmlLimitedBots)\n\n const isSSG = Boolean(\n (prerenderInfo ||\n isPrerendered ||\n prerenderManifest.routes[normalizedSrcPage]) &&\n // If this is a html bot request and PPR is enabled, then we don't want\n // to serve a static response.\n !(isHtmlBot && isRoutePPREnabled)\n )\n\n // When a page supports cacheComponents, we can support RDC for Navigations\n const supportsRDCForNavigations =\n isRoutePPREnabled && nextConfig.cacheComponents === true\n\n // In development, we always want to generate dynamic HTML.\n const supportsDynamicResponse: boolean =\n // If we're in development, we always support dynamic HTML, unless it's\n // a data request, in which case we only produce static HTML.\n routeModule.isDev === true ||\n // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isSSG ||\n // If this request has provided postponed data, it supports dynamic\n // HTML.\n typeof minimalPostponed === 'string' ||\n // If this handler supports onCacheEntryV2, then we can only support\n // dynamic responses if it's a dynamic RSC request and not in minimal mode. If it\n // doesn't support it we must fallback to the default behavior.\n (supportsRDCForNavigations && getRequestMeta(req, 'onCacheEntryV2')\n ? // In minimal mode, we'll always want to generate a static response\n // which will generate the RDC for the route. When resuming a Dynamic\n // RSC request, we'll pass the minimal postponed data to the render\n // which will trigger the `supportsDynamicResponse` to be true.\n isDynamicRSCRequest && !isMinimalMode\n : // Otherwise, we can support dynamic responses if it's a dynamic RSC request.\n isDynamicRSCRequest)\n\n // When html bots request PPR page, perform the full dynamic rendering.\n const shouldWaitOnAllReady = isHtmlBot && isRoutePPREnabled\n\n let ssgCacheKey: string | null = null\n if (\n !isDraftMode &&\n isSSG &&\n !supportsDynamicResponse &&\n !isPossibleServerAction &&\n !minimalPostponed &&\n !isDynamicRSCRequest\n ) {\n ssgCacheKey = resolvedPathname\n }\n\n // the staticPathKey differs from ssgCacheKey since\n // ssgCacheKey is null in dev since we're always in \"dynamic\"\n // mode in dev to bypass the cache, but we still need to honor\n // dynamicParams = false in dev mode\n let staticPathKey = ssgCacheKey\n if (!staticPathKey && routeModule.isDev) {\n staticPathKey = resolvedPathname\n }\n\n // If this is a request for an app path that should be statically generated\n // and we aren't in the edge runtime, strip the flight headers so it will\n // generate the static response.\n if (\n !routeModule.isDev &&\n !isDraftMode &&\n isSSG &&\n isRSCRequest &&\n !isDynamicRSCRequest\n ) {\n stripFlightHeaders(req.headers)\n }\n\n const ComponentMod = {\n ...entryBase,\n tree,\n GlobalError,\n handler,\n routeModule,\n __next_app__,\n }\n\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setReferenceManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest,\n serverModuleMap: createServerModuleMap({\n serverActionsManifest,\n }),\n })\n }\n\n const method = req.method || 'GET'\n const tracer = getTracer()\n const activeSpan = tracer.getActiveScopeSpan()\n\n const render404 = async () => {\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext?.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false)\n } else {\n res.end('This page could not be found')\n }\n return null\n }\n\n try {\n const varyHeader = routeModule.getVaryHeader(\n resolvedPathname,\n interceptionRoutePatterns\n )\n res.setHeader('Vary', varyHeader)\n const invokeRouteModule = async (\n span: Span | undefined,\n context: AppPageRouteHandlerContext\n ) => {\n const nextReq = new NodeNextRequest(req)\n const nextRes = new NodeNextResponse(res)\n\n return routeModule.render(nextReq, nextRes, context).finally(() => {\n if (!span) return\n\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false,\n })\n\n const rootSpanAttributes = tracer.getRootSpanAttributes()\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return\n }\n\n if (\n rootSpanAttributes.get('next.span_type') !==\n BaseServerSpan.handleRequest\n ) {\n console.warn(\n `Unexpected root span type '${rootSpanAttributes.get(\n 'next.span_type'\n )}'. Please report this Next.js issue https://github.com/vercel/next.js`\n )\n return\n }\n\n const route = rootSpanAttributes.get('next.route')\n if (route) {\n const name = `${method} ${route}`\n\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name,\n })\n span.updateName(name)\n } else {\n span.updateName(`${method} ${srcPage}`)\n }\n })\n }\n\n const incrementalCache = getRequestMeta(req, 'incrementalCache')\n\n const doRender = async ({\n span,\n postponed,\n fallbackRouteParams,\n forceStaticRender,\n }: {\n span?: Span\n\n /**\n * The postponed data for this render. This is only provided when resuming\n * a render that has been postponed.\n */\n postponed: string | undefined\n\n /**\n * The unknown route params for this render.\n */\n fallbackRouteParams: OpaqueFallbackRouteParams | null\n\n /**\n * When true, this indicates that the response generator is being called\n * in a context where the response must be generated statically.\n *\n * CRITICAL: This should only currently be used when revalidating due to a\n * dynamic RSC request.\n */\n forceStaticRender: boolean\n }): Promise => {\n const context: AppPageRouteHandlerContext = {\n query,\n params,\n page: normalizedSrcPage,\n sharedContext: {\n buildId,\n },\n serverComponentsHmrCache: getRequestMeta(\n req,\n 'serverComponentsHmrCache'\n ),\n fallbackRouteParams,\n renderOpts: {\n App: () => null,\n Document: () => null,\n pageConfig: {},\n ComponentMod,\n Component: interopDefault(ComponentMod),\n\n params,\n routeModule,\n page: srcPage,\n postponed,\n shouldWaitOnAllReady,\n serveStreamingMetadata,\n supportsDynamicResponse:\n typeof postponed === 'string' || supportsDynamicResponse,\n buildManifest,\n nextFontManifest,\n reactLoadableManifest,\n subresourceIntegrityManifest,\n serverActionsManifest,\n clientReferenceManifest,\n setCacheStatus: routerServerContext?.setCacheStatus,\n setIsrStatus: routerServerContext?.setIsrStatus,\n setReactDebugChannel: routerServerContext?.setReactDebugChannel,\n\n dir:\n process.env.NEXT_RUNTIME === 'nodejs'\n ? (require('path') as typeof import('path')).join(\n /* turbopackIgnore: true */\n process.cwd(),\n routeModule.relativeProjectDir\n )\n : `${process.cwd()}/${routeModule.relativeProjectDir}`,\n isDraftMode,\n botType,\n isOnDemandRevalidate,\n isPossibleServerAction,\n assetPrefix: nextConfig.assetPrefix,\n nextConfigOutput: nextConfig.output,\n crossOrigin: nextConfig.crossOrigin,\n trailingSlash: nextConfig.trailingSlash,\n images: nextConfig.images,\n previewProps: prerenderManifest.preview,\n deploymentId: nextConfig.deploymentId,\n enableTainting: nextConfig.experimental.taint,\n htmlLimitedBots: nextConfig.htmlLimitedBots,\n reactMaxHeadersLength: nextConfig.reactMaxHeadersLength,\n\n multiZoneDraftMode,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n basePath: nextConfig.basePath,\n serverActions: nextConfig.experimental.serverActions,\n\n ...(isDebugStaticShell ||\n isDebugDynamicAccesses ||\n isDebugFallbackShell\n ? {\n nextExport: true,\n supportsDynamicResponse: false,\n isStaticGeneration: true,\n isDebugDynamicAccesses: isDebugDynamicAccesses,\n }\n : {}),\n cacheComponents: Boolean(nextConfig.cacheComponents),\n experimental: {\n isRoutePPREnabled,\n expireTime: nextConfig.expireTime,\n staleTimes: nextConfig.experimental.staleTimes,\n dynamicOnHover: Boolean(nextConfig.experimental.dynamicOnHover),\n inlineCss: Boolean(nextConfig.experimental.inlineCss),\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts),\n clientTraceMetadata:\n nextConfig.experimental.clientTraceMetadata || ([] as any),\n clientParamParsingOrigins:\n nextConfig.experimental.clientParamParsingOrigins,\n },\n\n waitUntil: ctx.waitUntil,\n onClose: (cb) => {\n res.on('close', cb)\n },\n onAfterTaskError: () => {},\n\n onInstrumentationRequestError: (error, _request, errorContext) =>\n routeModule.onRequestError(\n req,\n error,\n errorContext,\n routerServerContext\n ),\n err: getRequestMeta(req, 'invokeError'),\n dev: routeModule.isDev,\n },\n }\n\n if (isDebugStaticShell || isDebugDynamicAccesses) {\n context.renderOpts.nextExport = true\n context.renderOpts.supportsDynamicResponse = false\n context.renderOpts.isDebugDynamicAccesses = isDebugDynamicAccesses\n }\n\n // When we're revalidating in the background, we should not allow dynamic\n // responses.\n if (forceStaticRender) {\n context.renderOpts.supportsDynamicResponse = false\n }\n\n const result = await invokeRouteModule(span, context)\n\n const { metadata } = result\n\n const {\n cacheControl,\n headers = {},\n // Add any fetch tags that were on the page to the response headers.\n fetchTags: cacheTags,\n fetchMetrics,\n } = metadata\n\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags\n }\n\n // Pull any fetch metrics from the render onto the request.\n ;(req as any).fetchMetrics = fetchMetrics\n\n // we don't throw static to dynamic errors in dev as isSSG\n // is a best guess in dev since we don't have the prerender pass\n // to know whether the path is actually static or not\n if (\n isSSG &&\n cacheControl?.revalidate === 0 &&\n !routeModule.isDev &&\n !isRoutePPREnabled\n ) {\n const staticBailoutInfo = metadata.staticBailoutInfo\n\n const err = new Error(\n `Page changed from static to dynamic at runtime ${resolvedPathname}${\n staticBailoutInfo?.description\n ? `, reason: ${staticBailoutInfo.description}`\n : ``\n }` +\n `\\nsee more here https://nextjs.org/docs/messages/app-static-to-dynamic-error`\n )\n\n if (staticBailoutInfo?.stack) {\n const stack = staticBailoutInfo.stack\n err.stack = err.message + stack.substring(stack.indexOf('\\n'))\n }\n\n throw err\n }\n\n return {\n value: {\n kind: CachedRouteKind.APP_PAGE,\n html: result,\n headers,\n rscData: metadata.flightData,\n postponed: metadata.postponed,\n status: metadata.statusCode,\n segmentData: metadata.segmentData,\n } satisfies CachedAppPageValue,\n cacheControl,\n } satisfies ResponseCacheEntry\n }\n\n const responseGenerator: ResponseGenerator = async ({\n hasResolved,\n previousCacheEntry: previousIncrementalCacheEntry,\n isRevalidating,\n span,\n forceStaticRender = false,\n }) => {\n const isProduction = routeModule.isDev === false\n const didRespond = hasResolved || res.writableEnded\n\n // skip on-demand revalidate if cache is not present and\n // revalidate-if-generated is set\n if (\n isOnDemandRevalidate &&\n revalidateOnlyGenerated &&\n !previousIncrementalCacheEntry &&\n !isMinimalMode\n ) {\n if (routerServerContext?.render404) {\n await routerServerContext.render404(req, res)\n } else {\n res.statusCode = 404\n res.end('This page could not be found')\n }\n return null\n }\n\n let fallbackMode: FallbackMode | undefined\n\n if (prerenderInfo) {\n fallbackMode = parseFallbackField(prerenderInfo.fallback)\n }\n\n // When serving a HTML bot request, we want to serve a blocking render and\n // not the prerendered page. This ensures that the correct content is served\n // to the bot in the head.\n if (fallbackMode === FallbackMode.PRERENDER && isBot(userAgent)) {\n if (!isRoutePPREnabled || isHtmlBot) {\n fallbackMode = FallbackMode.BLOCKING_STATIC_RENDER\n }\n }\n\n if (previousIncrementalCacheEntry?.isStale === -1) {\n isOnDemandRevalidate = true\n }\n\n // TODO: adapt for PPR\n // only allow on-demand revalidate for fallback: true/blocking\n // or for prerendered fallback: false paths\n if (\n isOnDemandRevalidate &&\n (fallbackMode !== FallbackMode.NOT_FOUND ||\n previousIncrementalCacheEntry)\n ) {\n fallbackMode = FallbackMode.BLOCKING_STATIC_RENDER\n }\n\n if (\n !isMinimalMode &&\n fallbackMode !== FallbackMode.BLOCKING_STATIC_RENDER &&\n staticPathKey &&\n !didRespond &&\n !isDraftMode &&\n pageIsDynamic &&\n (isProduction || !isPrerendered)\n ) {\n // if the page has dynamicParams: false and this pathname wasn't\n // prerendered trigger the no fallback handling\n if (\n // In development, fall through to render to handle missing\n // getStaticPaths.\n (isProduction || prerenderInfo) &&\n // When fallback isn't present, abort this render so we 404\n fallbackMode === FallbackMode.NOT_FOUND\n ) {\n if (nextConfig.experimental.adapterPath) {\n return await render404()\n }\n throw new NoFallbackError()\n }\n\n // When cacheComponents is enabled, we can use the fallback\n // response if the request is not a dynamic RSC request because the\n // RSC data when this feature flag is enabled does not contain any\n // param references. Without this feature flag enabled, the RSC data\n // contains param references, and therefore we can't use the fallback.\n if (\n isRoutePPREnabled &&\n (nextConfig.cacheComponents ? !isDynamicRSCRequest : !isRSCRequest)\n ) {\n const cacheKey =\n isProduction && typeof prerenderInfo?.fallback === 'string'\n ? prerenderInfo.fallback\n : normalizedSrcPage\n\n const fallbackRouteParams =\n // If we're in production and we have fallback route params, then we\n // can use the manifest fallback route params.\n isProduction && prerenderInfo?.fallbackRouteParams\n ? createOpaqueFallbackRouteParams(\n prerenderInfo.fallbackRouteParams\n )\n : // Otherwise, if we're debugging the fallback shell, then we\n // have to manually generate the fallback route params.\n isDebugFallbackShell\n ? getFallbackRouteParams(normalizedSrcPage, routeModule)\n : null\n\n // We use the response cache here to handle the revalidation and\n // management of the fallback shell.\n const fallbackResponse = await routeModule.handleResponse({\n cacheKey,\n req,\n nextConfig,\n routeKind: RouteKind.APP_PAGE,\n isFallback: true,\n prerenderManifest,\n isRoutePPREnabled,\n responseGenerator: async () =>\n doRender({\n span,\n // We pass `undefined` as rendering a fallback isn't resumed\n // here.\n postponed: undefined,\n fallbackRouteParams,\n forceStaticRender: false,\n }),\n waitUntil: ctx.waitUntil,\n isMinimalMode,\n })\n\n // If the fallback response was set to null, then we should return null.\n if (fallbackResponse === null) return null\n\n // Otherwise, if we did get a fallback response, we should return it.\n if (fallbackResponse) {\n // Remove the cache control from the response to prevent it from being\n // used in the surrounding cache.\n delete fallbackResponse.cacheControl\n\n return fallbackResponse\n }\n }\n }\n\n // Only requests that aren't revalidating can be resumed. If we have the\n // minimal postponed data, then we should resume the render with it.\n let postponed =\n !isOnDemandRevalidate && !isRevalidating && minimalPostponed\n ? minimalPostponed\n : undefined\n\n // If this is a dynamic RSC request, we should use the postponed data from\n // the static render (if available). This ensures that we can utilize the\n // resume data cache (RDC) from the static render to ensure that the data\n // is consistent between the static and dynamic renders.\n if (\n // Only enable RDC for Navigations if the feature is enabled.\n supportsRDCForNavigations &&\n process.env.NEXT_RUNTIME !== 'edge' &&\n !isMinimalMode &&\n incrementalCache &&\n isDynamicRSCRequest &&\n // We don't typically trigger an on-demand revalidation for dynamic RSC\n // requests, as we're typically revalidating the page in the background\n // instead. However, if the cache entry is stale, we should trigger a\n // background revalidation on dynamic RSC requests. This prevents us\n // from entering an infinite loop of revalidations.\n !forceStaticRender\n ) {\n const incrementalCacheEntry = await incrementalCache.get(\n resolvedPathname,\n {\n kind: IncrementalCacheKind.APP_PAGE,\n isRoutePPREnabled: true,\n isFallback: false,\n }\n )\n\n // If the cache entry is found, we should use the postponed data from\n // the cache.\n if (\n incrementalCacheEntry &&\n incrementalCacheEntry.value &&\n incrementalCacheEntry.value.kind === CachedRouteKind.APP_PAGE\n ) {\n // CRITICAL: we're assigning the postponed data from the cache entry\n // here as we're using the RDC to resume the render.\n postponed = incrementalCacheEntry.value.postponed\n\n // If the cache entry is stale, we should trigger a background\n // revalidation so that subsequent requests will get a fresh response.\n if (\n incrementalCacheEntry &&\n // We want to trigger this flow if the cache entry is stale and if\n // the requested revalidation flow is either foreground or\n // background.\n (incrementalCacheEntry.isStale === -1 ||\n incrementalCacheEntry.isStale === true)\n ) {\n // We want to schedule this on the next tick to ensure that the\n // render is not blocked on it.\n scheduleOnNextTick(async () => {\n const responseCache = routeModule.getResponseCache(req)\n\n try {\n await responseCache.revalidate(\n resolvedPathname,\n incrementalCache,\n isRoutePPREnabled,\n false,\n (c) =>\n responseGenerator({\n ...c,\n // CRITICAL: we need to set this to true as we're\n // revalidating in the background and typically this dynamic\n // RSC request is not treated as static.\n forceStaticRender: true,\n }),\n // CRITICAL: we need to pass null here because passing the\n // previous cache entry here (which is stale) will switch on\n // isOnDemandRevalidate and break the prerendering.\n null,\n hasResolved,\n ctx.waitUntil\n )\n } catch (err) {\n console.error(\n 'Error revalidating the page in the background',\n err\n )\n }\n })\n }\n }\n }\n\n // When we're in minimal mode, if we're trying to debug the static shell,\n // we should just return nothing instead of resuming the dynamic render.\n if (\n (isDebugStaticShell || isDebugDynamicAccesses) &&\n typeof postponed !== 'undefined'\n ) {\n return {\n cacheControl: { revalidate: 1, expire: undefined },\n value: {\n kind: CachedRouteKind.PAGES,\n html: RenderResult.EMPTY,\n pageData: {},\n headers: undefined,\n status: undefined,\n } satisfies CachedPageValue,\n }\n }\n\n const fallbackRouteParams =\n // If we're in production and we have fallback route params, then we\n // can use the manifest fallback route params if we need to render the\n // fallback shell.\n isProduction &&\n prerenderInfo?.fallbackRouteParams &&\n getRequestMeta(req, 'renderFallbackShell')\n ? createOpaqueFallbackRouteParams(prerenderInfo.fallbackRouteParams)\n : // Otherwise, if we're debugging the fallback shell, then we have to\n // manually generate the fallback route params.\n isDebugFallbackShell\n ? getFallbackRouteParams(normalizedSrcPage, routeModule)\n : null\n\n // Perform the render.\n return doRender({\n span,\n postponed,\n fallbackRouteParams,\n forceStaticRender,\n })\n }\n\n const handleResponse = async (span?: Span): Promise => {\n const cacheEntry = await routeModule.handleResponse({\n cacheKey: ssgCacheKey,\n responseGenerator: (c) =>\n responseGenerator({\n span,\n ...c,\n }),\n routeKind: RouteKind.APP_PAGE,\n isOnDemandRevalidate,\n isRoutePPREnabled,\n req,\n nextConfig,\n prerenderManifest,\n waitUntil: ctx.waitUntil,\n isMinimalMode,\n })\n\n if (isDraftMode) {\n res.setHeader(\n 'Cache-Control',\n 'private, no-cache, no-store, max-age=0, must-revalidate'\n )\n }\n\n // In dev, we should not cache pages for any reason.\n if (routeModule.isDev) {\n res.setHeader('Cache-Control', 'no-store, must-revalidate')\n }\n\n if (!cacheEntry) {\n if (ssgCacheKey) {\n // A cache entry might not be generated if a response is written\n // in `getInitialProps` or `getServerSideProps`, but those shouldn't\n // have a cache key. If we do have a cache key but we don't end up\n // with a cache entry, then either Next.js or the application has a\n // bug that needs fixing.\n throw new Error('invariant: cache entry required but not generated')\n }\n return null\n }\n\n if (cacheEntry.value?.kind !== CachedRouteKind.APP_PAGE) {\n throw new Error(\n `Invariant app-page handler received invalid cache entry ${cacheEntry.value?.kind}`\n )\n }\n\n const didPostpone = typeof cacheEntry.value.postponed === 'string'\n\n if (\n isSSG &&\n // We don't want to send a cache header for requests that contain dynamic\n // data. If this is a Dynamic RSC request or wasn't a Prefetch RSC\n // request, then we should set the cache header.\n !isDynamicRSCRequest &&\n (!didPostpone || isPrefetchRSCRequest)\n ) {\n if (!isMinimalMode) {\n // set x-nextjs-cache header to match the header\n // we set for the image-optimizer\n res.setHeader(\n 'x-nextjs-cache',\n isOnDemandRevalidate\n ? 'REVALIDATED'\n : cacheEntry.isMiss\n ? 'MISS'\n : cacheEntry.isStale\n ? 'STALE'\n : 'HIT'\n )\n }\n // Set a header used by the client router to signal the response is static\n // and should respect the `static` cache staleTime value.\n res.setHeader(NEXT_IS_PRERENDER_HEADER, '1')\n }\n const { value: cachedData } = cacheEntry\n\n // Coerce the cache control parameter from the render.\n let cacheControl: CacheControl | undefined\n\n // If this is a resume request in minimal mode it is streamed with dynamic\n // content and should not be cached.\n if (minimalPostponed) {\n cacheControl = { revalidate: 0, expire: undefined }\n }\n\n // If this is in minimal mode and this is a flight request that isn't a\n // prefetch request while PPR is enabled, it cannot be cached as it contains\n // dynamic content.\n else if (isDynamicRSCRequest) {\n cacheControl = { revalidate: 0, expire: undefined }\n } else if (!routeModule.isDev) {\n // If this is a preview mode request, we shouldn't cache it\n if (isDraftMode) {\n cacheControl = { revalidate: 0, expire: undefined }\n }\n\n // If this isn't SSG, then we should set change the header only if it is\n // not set already.\n else if (!isSSG) {\n if (!res.getHeader('Cache-Control')) {\n cacheControl = { revalidate: 0, expire: undefined }\n }\n } else if (cacheEntry.cacheControl) {\n // If the cache entry has a cache control with a revalidate value that's\n // a number, use it.\n if (typeof cacheEntry.cacheControl.revalidate === 'number') {\n if (cacheEntry.cacheControl.revalidate < 1) {\n throw new Error(\n `Invalid revalidate configuration provided: ${cacheEntry.cacheControl.revalidate} < 1`\n )\n }\n\n cacheControl = {\n revalidate: cacheEntry.cacheControl.revalidate,\n expire: cacheEntry.cacheControl?.expire ?? nextConfig.expireTime,\n }\n }\n // Otherwise if the revalidate value is false, then we should use the\n // cache time of one year.\n else {\n cacheControl = { revalidate: CACHE_ONE_YEAR, expire: undefined }\n }\n }\n }\n\n cacheEntry.cacheControl = cacheControl\n\n if (\n typeof segmentPrefetchHeader === 'string' &&\n cachedData?.kind === CachedRouteKind.APP_PAGE &&\n cachedData.segmentData\n ) {\n // This is a prefetch request issued by the client Segment Cache. These\n // should never reach the application layer (lambda). We should either\n // respond from the cache (HIT) or respond with 204 No Content (MISS).\n\n // Set a header to indicate that PPR is enabled for this route. This\n // lets the client distinguish between a regular cache miss and a cache\n // miss due to PPR being disabled. In other contexts this header is used\n // to indicate that the response contains dynamic data, but here we're\n // only using it to indicate that the feature is enabled — the segment\n // response itself contains whether the data is dynamic.\n res.setHeader(NEXT_DID_POSTPONE_HEADER, '2')\n\n // Add the cache tags header to the response if it exists and we're in\n // minimal mode while rendering a static page.\n const tags = cachedData.headers?.[NEXT_CACHE_TAGS_HEADER]\n if (isMinimalMode && isSSG && tags && typeof tags === 'string') {\n res.setHeader(NEXT_CACHE_TAGS_HEADER, tags)\n }\n\n const matchedSegment = cachedData.segmentData.get(segmentPrefetchHeader)\n if (matchedSegment !== undefined) {\n // Cache hit\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: RenderResult.fromStatic(\n matchedSegment,\n RSC_CONTENT_TYPE_HEADER\n ),\n cacheControl: cacheEntry.cacheControl,\n })\n }\n\n // Cache miss. Either a cache entry for this route has not been generated\n // (which technically should not be possible when PPR is enabled, because\n // at a minimum there should always be a fallback entry) or there's no\n // match for the requested segment. Respond with a 204 No Content. We\n // don't bother to respond with 404, because these requests are only\n // issued as part of a prefetch.\n res.statusCode = 204\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: RenderResult.EMPTY,\n cacheControl: cacheEntry.cacheControl,\n })\n }\n\n // If there's a callback for `onCacheEntry`, call it with the cache entry\n // and the revalidate options. If we support RDC for Navigations, we\n // prefer the `onCacheEntryV2` callback. Once RDC for Navigations is the\n // default, we can remove the fallback to `onCacheEntry` as\n // `onCacheEntryV2` is now fully supported.\n const onCacheEntry = supportsRDCForNavigations\n ? (getRequestMeta(req, 'onCacheEntryV2') ??\n getRequestMeta(req, 'onCacheEntry'))\n : getRequestMeta(req, 'onCacheEntry')\n if (onCacheEntry) {\n const finished = await onCacheEntry(cacheEntry, {\n url: getRequestMeta(req, 'initURL') ?? req.url,\n })\n if (finished) return null\n }\n\n if (cachedData.headers) {\n const headers = { ...cachedData.headers }\n\n if (!isMinimalMode || !isSSG) {\n delete headers[NEXT_CACHE_TAGS_HEADER]\n }\n\n for (let [key, value] of Object.entries(headers)) {\n if (typeof value === 'undefined') continue\n\n if (Array.isArray(value)) {\n for (const v of value) {\n res.appendHeader(key, v)\n }\n } else if (typeof value === 'number') {\n value = value.toString()\n res.appendHeader(key, value)\n } else {\n res.appendHeader(key, value)\n }\n }\n }\n\n // Add the cache tags header to the response if it exists and we're in\n // minimal mode while rendering a static page.\n const tags = cachedData.headers?.[NEXT_CACHE_TAGS_HEADER]\n if (isMinimalMode && isSSG && tags && typeof tags === 'string') {\n res.setHeader(NEXT_CACHE_TAGS_HEADER, tags)\n }\n\n // If the request is a data request, then we shouldn't set the status code\n // from the response because it should always be 200. This should be gated\n // behind the experimental PPR flag.\n if (cachedData.status && (!isRSCRequest || !isRoutePPREnabled)) {\n res.statusCode = cachedData.status\n }\n\n // Redirect information is encoded in RSC payload, so we don't need to use redirect status codes\n if (\n !isMinimalMode &&\n cachedData.status &&\n RedirectStatusCode[cachedData.status] &&\n isRSCRequest\n ) {\n res.statusCode = 200\n }\n\n // Mark that the request did postpone.\n if (didPostpone && !isDynamicRSCRequest) {\n res.setHeader(NEXT_DID_POSTPONE_HEADER, '1')\n }\n\n // we don't go through this block when preview mode is true\n // as preview mode is a dynamic request (bypasses cache) and doesn't\n // generate both HTML and payloads in the same request so continue to just\n // return the generated payload\n if (isRSCRequest && !isDraftMode) {\n // If this is a dynamic RSC request, then stream the response.\n if (typeof cachedData.rscData === 'undefined') {\n // If the response is not an RSC response, then we can't serve it.\n if (cachedData.html.contentType !== RSC_CONTENT_TYPE_HEADER) {\n if (nextConfig.cacheComponents) {\n res.statusCode = 404\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: RenderResult.EMPTY,\n cacheControl: cacheEntry.cacheControl,\n })\n } else {\n // Otherwise this case is not expected.\n throw new InvariantError(\n `Expected RSC response, got ${cachedData.html.contentType}`\n )\n }\n }\n\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: cachedData.html,\n cacheControl: cacheEntry.cacheControl,\n })\n }\n\n // As this isn't a prefetch request, we should serve the static flight\n // data.\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: RenderResult.fromStatic(\n cachedData.rscData,\n RSC_CONTENT_TYPE_HEADER\n ),\n cacheControl: cacheEntry.cacheControl,\n })\n }\n\n // This is a request for HTML data.\n const body = cachedData.html\n\n // If there's no postponed state, we should just serve the HTML. This\n // should also be the case for a resume request because it's completed\n // as a server render (rather than a static render).\n if (!didPostpone || isMinimalMode || isRSCRequest) {\n // If we're in test mode, we should add a sentinel chunk to the response\n // that's between the static and dynamic parts so we can compare the\n // chunks and add assertions.\n if (\n process.env.__NEXT_TEST_MODE &&\n isMinimalMode &&\n isRoutePPREnabled &&\n body.contentType === HTML_CONTENT_TYPE_HEADER\n ) {\n // As we're in minimal mode, the static part would have already been\n // streamed first. The only part that this streams is the dynamic part\n // so we should FIRST stream the sentinel and THEN the dynamic part.\n body.unshift(createPPRBoundarySentinel())\n }\n\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: body,\n cacheControl: cacheEntry.cacheControl,\n })\n }\n\n // If we're debugging the static shell or the dynamic API accesses, we\n // should just serve the HTML without resuming the render. The returned\n // HTML will be the static shell so all the Dynamic API's will be used\n // during static generation.\n if (isDebugStaticShell || isDebugDynamicAccesses) {\n // Since we're not resuming the render, we need to at least add the\n // closing body and html tags to create valid HTML.\n body.push(\n new ReadableStream({\n start(controller) {\n controller.enqueue(ENCODED_TAGS.CLOSED.BODY_AND_HTML)\n controller.close()\n },\n })\n )\n\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: body,\n cacheControl: { revalidate: 0, expire: undefined },\n })\n }\n\n // If we're in test mode, we should add a sentinel chunk to the response\n // that's between the static and dynamic parts so we can compare the\n // chunks and add assertions.\n if (process.env.__NEXT_TEST_MODE) {\n body.push(createPPRBoundarySentinel())\n }\n\n // This request has postponed, so let's create a new transformer that the\n // dynamic data can pipe to that will attach the dynamic data to the end\n // of the response.\n const transformer = new TransformStream()\n body.push(transformer.readable)\n\n // Perform the render again, but this time, provide the postponed state.\n // We don't await because we want the result to start streaming now, and\n // we've already chained the transformer's readable to the render result.\n doRender({\n span,\n postponed: cachedData.postponed,\n // This is a resume render, not a fallback render, so we don't need to\n // set this.\n fallbackRouteParams: null,\n forceStaticRender: false,\n })\n .then(async (result) => {\n if (!result) {\n throw new Error('Invariant: expected a result to be returned')\n }\n\n if (result.value?.kind !== CachedRouteKind.APP_PAGE) {\n throw new Error(\n `Invariant: expected a page response, got ${result.value?.kind}`\n )\n }\n\n // Pipe the resume result to the transformer.\n await result.value.html.pipeTo(transformer.writable)\n })\n .catch((err) => {\n // An error occurred during piping or preparing the render, abort\n // the transformers writer so we can terminate the stream.\n transformer.writable.abort(err).catch((e) => {\n console.error(\"couldn't abort transformer\", e)\n })\n })\n\n return sendRenderResult({\n req,\n res,\n generateEtags: nextConfig.generateEtags,\n poweredByHeader: nextConfig.poweredByHeader,\n result: body,\n // We don't want to cache the response if it has postponed data because\n // the response being sent to the client it's dynamic parts are streamed\n // to the client on the same request.\n cacheControl: { revalidate: 0, expire: undefined },\n })\n }\n\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan)\n } else {\n return await tracer.withPropagatedContext(req.headers, () =>\n tracer.trace(\n BaseServerSpan.handleRequest,\n {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url,\n },\n },\n handleResponse\n )\n )\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n await routeModule.onRequestError(\n req,\n err,\n {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'render',\n revalidateReason: getRevalidateReason({\n isStaticGeneration: isSSG,\n isOnDemandRevalidate,\n }),\n },\n routerServerContext\n )\n }\n\n // rethrow so that we can handle serving error page\n throw err\n }\n}\n\n// TODO: omit this from production builds, only test builds should include it\n/**\n * Creates a readable stream that emits a PPR boundary sentinel.\n *\n * @returns A readable stream that emits a PPR boundary sentinel.\n */\nfunction createPPRBoundarySentinel() {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(\n new TextEncoder().encode('')\n )\n controller.close()\n },\n })\n}\n"],"names":["AppPageRouteModule","RouteKind","getRevalidateReason","getTracer","SpanKind","addRequestMeta","getRequestMeta","BaseServerSpan","interopDefault","stripFlightHeaders","NodeNextRequest","NodeNextResponse","checkIsAppPPREnabled","getFallbackRouteParams","createOpaqueFallbackRouteParams","setReferenceManifestsSingleton","isHtmlBotRequest","shouldServeStreamingMetadata","createServerModuleMap","normalizeAppPath","getIsPossibleServerAction","RSC_HEADER","NEXT_ROUTER_PREFETCH_HEADER","NEXT_IS_PRERENDER_HEADER","NEXT_DID_POSTPONE_HEADER","RSC_CONTENT_TYPE_HEADER","getBotType","isBot","CachedRouteKind","IncrementalCacheKind","FallbackMode","parseFallbackField","RenderResult","CACHE_ONE_YEAR","HTML_CONTENT_TYPE_HEADER","NEXT_CACHE_TAGS_HEADER","ENCODED_TAGS","sendRenderResult","NoFallbackError","GlobalError","__next_app__","require","__next_app_require__","loadChunk","__next_app_load_chunk__","entryBase","RedirectStatusCode","InvariantError","scheduleOnNextTick","isInterceptionRouteAppPath","routeModule","definition","kind","APP_PAGE","page","pathname","bundlePath","filename","appPaths","userland","loaderTree","tree","distDir","process","env","__NEXT_RELATIVE_DIST_DIR","relativeProjectDir","__NEXT_RELATIVE_PROJECT_DIR","handler","req","res","ctx","prerenderManifest","isDev","hrtime","bigint","srcPage","TURBOPACK","replace","multiZoneDraftMode","__NEXT_MULTI_ZONE_DRAFT_MODE","isMinimalMode","Boolean","MINIMAL_MODE","prepareResult","prepare","statusCode","end","waitUntil","Promise","resolve","buildId","query","params","pageIsDynamic","buildManifest","nextFontManifest","reactLoadableManifest","serverActionsManifest","clientReferenceManifest","subresourceIntegrityManifest","isDraftMode","resolvedPathname","revalidateOnlyGenerated","routerServerContext","nextConfig","parsedUrl","interceptionRoutePatterns","normalizedSrcPage","isOnDemandRevalidate","prerenderInfo","experimental","ppr","cacheComponents","match","isPrerendered","routes","userAgent","headers","botType","isHtmlBot","isPrefetchRSCRequest","isRSCRequest","isPossibleServerAction","couldSupportPPR","hasDebugStaticShellQuery","__NEXT_EXPERIMENTAL_STATIC_SHELL_DEBUGGING","__nextppronly","hasDebugFallbackShellQuery","isRoutePPREnabled","dynamicRoutes","renderingMode","experimentalTestProxy","isDebugStaticShell","isDebugDynamicAccesses","isDebugFallbackShell","minimalPostponed","undefined","isDynamicRSCRequest","segmentPrefetchHeader","serveStreamingMetadata","htmlLimitedBots","isSSG","supportsRDCForNavigations","supportsDynamicResponse","shouldWaitOnAllReady","ssgCacheKey","staticPathKey","ComponentMod","serverModuleMap","method","tracer","activeSpan","getActiveScopeSpan","render404","varyHeader","getVaryHeader","setHeader","invokeRouteModule","span","context","nextReq","nextRes","render","finally","setAttributes","rootSpanAttributes","getRootSpanAttributes","get","handleRequest","console","warn","route","name","updateName","incrementalCache","doRender","postponed","fallbackRouteParams","forceStaticRender","sharedContext","serverComponentsHmrCache","renderOpts","App","Document","pageConfig","Component","setCacheStatus","setIsrStatus","setReactDebugChannel","dir","NEXT_RUNTIME","join","cwd","assetPrefix","nextConfigOutput","output","crossOrigin","trailingSlash","images","previewProps","preview","deploymentId","enableTainting","taint","reactMaxHeadersLength","cacheLifeProfiles","cacheLife","basePath","serverActions","nextExport","isStaticGeneration","expireTime","staleTimes","dynamicOnHover","inlineCss","authInterrupts","clientTraceMetadata","clientParamParsingOrigins","onClose","cb","on","onAfterTaskError","onInstrumentationRequestError","error","_request","errorContext","onRequestError","err","dev","result","metadata","cacheControl","fetchTags","cacheTags","fetchMetrics","revalidate","staticBailoutInfo","Error","description","stack","message","substring","indexOf","value","html","rscData","flightData","status","segmentData","responseGenerator","hasResolved","previousCacheEntry","previousIncrementalCacheEntry","isRevalidating","isProduction","didRespond","writableEnded","fallbackMode","fallback","PRERENDER","BLOCKING_STATIC_RENDER","isStale","NOT_FOUND","adapterPath","cacheKey","fallbackResponse","handleResponse","routeKind","isFallback","incrementalCacheEntry","responseCache","getResponseCache","c","expire","PAGES","EMPTY","pageData","cacheEntry","cachedData","didPostpone","isMiss","getHeader","tags","matchedSegment","generateEtags","poweredByHeader","fromStatic","onCacheEntry","finished","url","key","Object","entries","Array","isArray","v","appendHeader","toString","contentType","body","__NEXT_TEST_MODE","unshift","createPPRBoundarySentinel","push","ReadableStream","start","controller","enqueue","CLOSED","BODY_AND_HTML","close","transformer","TransformStream","readable","then","pipeTo","writable","catch","abort","e","withPropagatedContext","trace","spanName","SERVER","attributes","routerKind","routePath","routeType","revalidateReason","TextEncoder","encode"],"mappings":"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","ignoreList":[0]}}] +} \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js new file mode 100644 index 00000000..c56383ad --- /dev/null +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js @@ -0,0 +1,3144 @@ +module.exports = [ +"[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Avatar", + ()=>Avatar, + "AvatarFallback", + ()=>AvatarFallback, + "AvatarImage", + ()=>AvatarImage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-avatar@1.1.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_3ee3dafa662d71951c1a3d5b289c96d1/node_modules/@radix-ui/react-avatar/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +function Avatar({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "avatar", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('relative flex size-8 shrink-0 overflow-hidden rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 13, + columnNumber: 5 + }, this); +} +function AvatarImage({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Image"], { + "data-slot": "avatar-image", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('aspect-square size-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 29, + columnNumber: 5 + }, this); +} +function AvatarFallback({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Fallback"], { + "data-slot": "avatar-fallback", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-muted flex size-full items-center justify-center rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 42, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "DropdownMenu", + ()=>DropdownMenu, + "DropdownMenuCheckboxItem", + ()=>DropdownMenuCheckboxItem, + "DropdownMenuContent", + ()=>DropdownMenuContent, + "DropdownMenuGroup", + ()=>DropdownMenuGroup, + "DropdownMenuItem", + ()=>DropdownMenuItem, + "DropdownMenuLabel", + ()=>DropdownMenuLabel, + "DropdownMenuPortal", + ()=>DropdownMenuPortal, + "DropdownMenuRadioGroup", + ()=>DropdownMenuRadioGroup, + "DropdownMenuRadioItem", + ()=>DropdownMenuRadioItem, + "DropdownMenuSeparator", + ()=>DropdownMenuSeparator, + "DropdownMenuShortcut", + ()=>DropdownMenuShortcut, + "DropdownMenuSub", + ()=>DropdownMenuSub, + "DropdownMenuSubContent", + ()=>DropdownMenuSubContent, + "DropdownMenuSubTrigger", + ()=>DropdownMenuSubTrigger, + "DropdownMenuTrigger", + ()=>DropdownMenuTrigger +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types_aefad4ac5851d46557f75f368796c888/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-right.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function DropdownMenu({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "dropdown-menu", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function DropdownMenuPortal({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + "data-slot": "dropdown-menu-portal", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 19, + columnNumber: 5 + }, this); +} +function DropdownMenuTrigger({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "dropdown-menu-trigger", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 27, + columnNumber: 5 + }, this); +} +function DropdownMenuContent({ className, sideOffset = 4, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "dropdown-menu-content", + sideOffset: sideOffset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 41, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 40, + columnNumber: 5 + }, this); +} +function DropdownMenuGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "dropdown-menu-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 58, + columnNumber: 5 + }, this); +} +function DropdownMenuItem({ className, inset, variant = 'default', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "dropdown-menu-item", + "data-inset": inset, + "data-variant": variant, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 72, + columnNumber: 5 + }, this); +} +function DropdownMenuCheckboxItem({ className, children, checked, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CheckboxItem"], { + "data-slot": "dropdown-menu-checkbox-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + checked: checked, + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 103, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 102, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 101, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 92, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioGroup"], { + "data-slot": "dropdown-menu-radio-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 115, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioItem"], { + "data-slot": "dropdown-menu-radio-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__["CircleIcon"], { + className: "size-2 fill-current" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 138, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 137, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 136, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 128, + columnNumber: 5 + }, this); +} +function DropdownMenuLabel({ className, inset, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "dropdown-menu-label", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 154, + columnNumber: 5 + }, this); +} +function DropdownMenuSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "dropdown-menu-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 171, + columnNumber: 5 + }, this); +} +function DropdownMenuShortcut({ className, ...props }) { + 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$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", { + "data-slot": "dropdown-menu-shortcut", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground ml-auto text-xs tracking-widest', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 184, + columnNumber: 5 + }, this); +} +function DropdownMenuSub({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Sub"], { + "data-slot": "dropdown-menu-sub", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 198, + columnNumber: 10 + }, this); +} +function DropdownMenuSubTrigger({ className, inset, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubTrigger"], { + "data-slot": "dropdown-menu-sub-trigger", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__["ChevronRightIcon"], { + className: "ml-auto size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 220, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 210, + columnNumber: 5 + }, this); +} +function DropdownMenuSubContent({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubContent"], { + "data-slot": "dropdown-menu-sub-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 230, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "SiteHeader", + ()=>SiteHeader +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[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/client/app-dir/link.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript) "); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/input.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next-auth@4.24.13_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__nodemailer@7_3c43d6bc4ecce810d1d16651fe207b00/node_modules/next-auth/react/index.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +function SiteHeader() { + const { searchMembers, searchResults } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { data: session, status } = (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])(); + const { showAlert, showConfirm, showPrompt } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useDialog"])(); + const pathname = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["usePathname"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [searchQuery, setSearchQuery] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + const [showResults, setShowResults] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [familyTrees, setFamilyTrees] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [currentTree, setCurrentTree] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [deletingTreeId, setDeletingTreeId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const searchRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + // 获取当前视图模式 + const currentViewMode = searchParams.get('view') || 'traditional'; + const isTreePage = pathname === '/tree'; + // 生成带有 treeId 的 URL + const getUrlWithTreeId = (path)=>{ + if (currentTree?.id) { + return `${path}?treeId=${currentTree.id}`; + } + return path; + }; + // 切换视图模式 + const handleViewModeChange = (mode)=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', mode); + if (currentTree?.id) { + params.set('treeId', currentTree.id); + } + router.push(`${pathname}?${params.toString()}`); + }; + const getRoleBadge = (role)=>{ + switch(role){ + case "OWNER": + 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$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] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 border border-purple-200 ml-2", + children: "所有者" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 69, + columnNumber: 16 + }, this); + case "EDITOR": + 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$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] px-1.5 py-0.5 rounded bg-blue-100 text-blue-700 border border-blue-200 ml-2", + children: "编辑" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 71, + columnNumber: 16 + }, this); + case "VIEWER": + 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$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] px-1.5 py-0.5 rounded bg-gray-100 text-gray-700 border border-gray-200 ml-2", + children: "查看" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 73, + columnNumber: 16 + }, this); + default: + return null; + } + }; + const handleSignOut = async ()=>{ + await (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["signOut"])({ + callbackUrl: "/auth/signin" + }); + }; + // 获取用户名首字母作为头像 + const getUserInitial = ()=>{ + if (session?.user?.name) { + return session.user.name.charAt(0).toUpperCase(); + } + if (session?.user?.email) { + return session.user.email.charAt(0).toUpperCase(); + } + return "U"; + }; + // 删除家族树 + const handleDeleteTree = async (tree, e)=>{ + e.stopPropagation(); // 阻止触发选择事件 + // 检查权限 + if (tree.ownerId !== session?.user?.id) { + await showAlert('只有家族树的创建者才能删除', '权限不足'); + return; + } + const confirmText = `确定要删除家族树"${tree.name}"吗?\n\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`; + const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive'); + if (!confirmed) { + return; + } + // 二次确认 + const finalConfirm = await showPrompt(`请输入家族树名称"${tree.name}"以确认删除:`, '', '确认删除'); + if (finalConfirm !== tree.name) { + await showAlert('名称不匹配,删除已取消', '操作已取消'); + return; + } + setDeletingTreeId(tree.id); + try { + const response = await fetch(`/api/trees/${tree.id}`, { + method: 'DELETE' + }); + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error || '删除失败'); + } + // 刷新家族树列表 + await loadFamilyTrees(); + // 如果删除的是当前树,跳转到首页 + if (currentTree?.id === tree.id) { + window.location.href = '/'; + } + } catch (error) { + console.error('删除家族树失败:', error); + await showAlert('删除失败:' + error.message, '错误'); + } finally{ + setDeletingTreeId(null); + } + }; + // 获取家族树列表 + const loadFamilyTrees = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + if (!session?.user?.id || status !== 'authenticated') return; + const controller = new AbortController(); + fetch('/api/trees', { + signal: controller.signal + }).then((res)=>{ + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`); + return res.json(); + }).then((data)=>{ + if (data.trees) { + setFamilyTrees(data.trees); + // 如果 URL 中有 treeId,使用该树,否则使用第一个 + const urlParams = new URLSearchParams(window.location.search); + const treeId = urlParams.get('treeId'); + if (treeId) { + const tree = data.trees.find((t)=>t.id === treeId); + if (tree) { + setCurrentTree(tree); + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } + }).catch((err)=>{ + // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的) + if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') { + console.error('获取家族树列表失败:', err); + } + }); + return ()=>controller.abort(); + }, [ + session?.user?.id, + status + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + loadFamilyTrees(); + }, [ + loadFamilyTrees + ]); + // 监听路由变化,刷新家族树列表 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const handleRouteChange = ()=>{ + loadFamilyTrees(); + }; + window.addEventListener('focus', handleRouteChange); + return ()=>window.removeEventListener('focus', handleRouteChange); + }, [ + loadFamilyTrees + ]); + // 点击外部关闭搜索结果 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + function handleClickOutside(event) { + if (searchRef.current && !searchRef.current.contains(event.target)) { + setShowResults(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return ()=>document.removeEventListener("mousedown", handleClickOutside); + }, []); + const handleSearch = (query)=>{ + setSearchQuery(query); + searchMembers(query); + setShowResults(query.length > 0); + }; + const handleSelectMember = (memberId)=>{ + router.push(`/members/${memberId}`); + setSearchQuery(""); + setShowResults(false); + }; + 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$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"])("header", { + className: "sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", + 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: "container mx-auto flex h-16 items-center px-4", + 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: "mr-8 flex items-center gap-4", + 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"])(__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"], { + href: "/", + className: "flex items-center gap-2", + 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 h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__["BookOpen"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 229, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 228, + 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"])("span", { + className: "text-xl font-serif font-bold tracking-tight", + children: "华夏谱" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 231, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 227, + columnNumber: 11 + }, this), + session && familyTrees.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$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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 min-w-[200px]", + 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: "flex-1 truncate text-left", + children: currentTree?.name || '选择家族树' + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 239, + 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$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-4 w-4 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 240, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 238, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 237, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "start", + className: "w-[var(--radix-dropdown-menu-trigger-width)] min-w-[200px]", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + children: "我的家族树" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 244, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 245, + columnNumber: 17 + }, this), + familyTrees.map((tree)=>/*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + setCurrentTree(tree); + // 保持当前路径,只更新 treeId 参数 + const currentPath = window.location.pathname; + router.push(`${currentPath}?treeId=${tree.id}`); + }, + className: "cursor-pointer flex items-center justify-between group", + 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 overflow-hidden", + 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: "truncate", + children: tree.name + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 258, + columnNumber: 23 + }, this), + getRoleBadge(tree.currentUserRole) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 257, + 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: "flex items-center gap-2", + children: [ + currentTree?.id === tree.id && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 263, + columnNumber: 25 + }, this), + tree.ownerId === session?.user?.id && /*#__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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "sm", + className: "h-6 w-6 p-0 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-destructive hover:text-destructive-foreground", + onClick: (e)=>handleDeleteTree(tree, e), + disabled: deletingTreeId === tree.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$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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__["Trash2"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 273, + columnNumber: 27 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 266, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 261, + columnNumber: 21 + }, this) + ] + }, tree.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>router.push('/trees/new'), + className: "cursor-pointer text-primary", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__["Plus"], { + className: "h-4 w-4 mr-2" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 284, + columnNumber: 19 + }, this), + "创建新家族树" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 280, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 243, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 236, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 226, + 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"])("nav", { + className: "hidden md:flex items-center gap-6 text-sm font-medium text-muted-foreground", + 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"])(__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"], { + href: getUrlWithTreeId("/"), + className: "transition-colors hover:text-foreground data-[active=true]:text-foreground data-[active=true]:font-semibold", + children: "总览 (Overview)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 293, + 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$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"], { + href: getUrlWithTreeId("/tree"), + className: "transition-colors hover:text-foreground", + children: "族谱 (Tree)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 299, + 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$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"], { + href: getUrlWithTreeId("/members"), + className: "transition-colors hover:text-foreground", + children: "成员 (Members)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 302, + 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$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"], { + href: getUrlWithTreeId("/timeline"), + className: "transition-colors hover:text-foreground", + children: "大事记 (Timeline)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 305, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 292, + 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", { + className: "ml-auto flex items-center gap-4", + 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: "relative hidden sm:block", + ref: searchRef, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + 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/components/site-header.tsx", + lineNumber: 312, + 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$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Input"], { + type: "search", + placeholder: "搜索成员...", + value: searchQuery, + onChange: (e)=>handleSearch(e.target.value), + className: "h-9 w-64 rounded-full bg-muted pl-9 text-sm focus-visible:ring-primary" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 313, + columnNumber: 13 + }, this), + showResults && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg max-h-96 overflow-y-auto z-50", + children: searchResults.map((member)=>/*#__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"])("button", { + onClick: ()=>handleSelectMember(member.id), + className: "w-full px-4 py-3 text-left hover:bg-muted transition-colors border-b border-border last:border-0", + 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 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"])("div", { + className: "flex-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 gap-2", + 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: "font-medium", + children: member.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 333, + 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"])("span", { + className: `text-xs px-1.5 py-0.5 rounded ${member.gender === "MALE" ? "bg-blue-100 text-blue-700" : "bg-pink-100 text-pink-700"}`, + children: member.gender === "MALE" ? "男" : "女" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 334, + 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"])("span", { + className: "text-xs text-muted-foreground", + children: [ + "第", + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 337, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 332, + 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"])("p", { + className: "text-xs text-muted-foreground mt-1", + children: [ + member.birthDate && `生于 ${member.birthDate}`, + member.birthPlace && ` · ${member.birthPlace}` + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 339, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 331, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 330, + columnNumber: 21 + }, this) + }, member.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 325, + columnNumber: 19 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 323, + columnNumber: 15 + }, this), + showResults && searchQuery && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg p-4 text-center text-sm text-muted-foreground z-50", + children: "未找到匹配的成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 352, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 311, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__["Bell"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 359, + 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"])("span", { + className: "sr-only", + children: "Notifications" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 360, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 358, + 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$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"], { + href: "/settings", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 365, + 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"])("span", { + className: "sr-only", + children: "Settings" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 366, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 364, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 363, + columnNumber: 11 + }, this), + status === "loading" ? /*#__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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: "..." + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 372, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 371, + columnNumber: 13 + }, this) : session ? /*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + className: "relative h-8 w-8 rounded-full", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarImage"], { + src: undefined, + alt: session.user?.name || "User" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 379, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: getUserInitial() + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 380, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 378, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 377, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 376, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + className: "w-56", + align: "end", + forceMount: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + className: "font-normal", + 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 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"])("p", { + className: "text-sm font-medium leading-none", + children: session.user?.name || "用户" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 387, + 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"])("p", { + className: "text-xs leading-none text-muted-foreground", + children: session.user?.email + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 388, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 386, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 385, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 393, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + asChild: true, + 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"])(__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"], { + href: "/settings", + className: "cursor-pointer", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 396, + 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", { + children: "系统设置" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 397, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 395, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 394, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 400, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: handleSignOut, + className: "cursor-pointer text-red-600", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__["LogOut"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 402, + 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", { + children: "退出登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 403, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 401, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 384, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 375, + 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"], { + href: "/auth/signin", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "default", + size: "sm", + children: "登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 409, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 408, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 310, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 225, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 224, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "RelationshipCalculator", + ()=>RelationshipCalculator +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/relationship.js@1.2.7/node_modules/relationship.js/dist/relationship.min.mjs [app-ssr] (ecmascript)"); +; +class RelationshipCalculator { + members; + constructor(members){ + this.members = new Map(members.map((m)=>[ + m.id, + m + ])); + } + /** + * 计算两个成员之间的关系 + * @param fromId 起始成员ID(成员A) + * @param toId 目标成员ID(成员B) + * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX) + */ getRelationship(fromId, toId) { + if (fromId === toId) { + return { + term: '本人', + path: '', + success: true + }; + } + const fromMember = this.members.get(fromId); + const toMember = this.members.get(toId); + if (!fromMember || !toMember) { + return { + term: '未知', + path: '', + success: false, + error: '成员不存在' + }; + } + // 构建关系路径(从 fromId 到 toId) + const path = this.buildRelationPath(fromId, toId); + if (!path) { + return { + term: '无血缘关系', + path: '', + success: false + }; + } + // 将路径转换为中文 + const chinesePath = this.pathToChineseText(path); + // 使用 relationship.js 计算关系 + try { + // 获取fromId成员的性别(从谁的角度看关系) + const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1; + // 计算关系(toId 对 fromId 的称谓) + const result = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])({ + text: chinesePath, + target: '', + sex: fromMemberGender, + reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓 + }); + const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'; + return { + term, + path: chinesePath, + success: true + }; + } catch (error) { + return { + term: '亲戚', + path: chinesePath, + success: true + }; + } + } + /** + * 构建关系路径字符串 + * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子 + * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹 + */ buildRelationPath(fromId, toId) { + // 使用BFS查找最短路径 + const queue = [ + { + id: fromId, + path: '' + } + ]; + const visited = new Set(); + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + return path; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + queue.push({ + id: member.fatherId, + path: path + 'f' + }); + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + queue.push({ + id: member.motherId, + path: path + 'm' + }); + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const spousePath = member.gender === 'MALE' ? 'w' : 'h'; + queue.push({ + id: spouseId, + path: path + spousePath + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const childPath = child.gender === 'MALE' ? 's' : 'd'; + queue.push({ + id: childId, + path: path + childPath + }); + } + } + } + } + // 兄弟姐妹(通过父母查找) + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹 + const siblingPath = this.getSiblingPath(member, sibling); + queue.push({ + id: siblingId, + path: path + siblingPath + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹 + */ getSiblings(memberId) { + const member = this.members.get(memberId); + if (!member) return []; + const siblings = []; + // 通过父亲查找 + if (member.fatherId) { + const father = this.members.get(member.fatherId); + if (father?.childrenIds) { + siblings.push(...father.childrenIds.filter((id)=>id !== memberId)); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = this.members.get(member.motherId); + if (mother?.childrenIds) { + for (const childId of mother.childrenIds){ + if (childId !== memberId && !siblings.includes(childId)) { + siblings.push(childId); + } + } + } + } + return siblings; + } + /** + * 获取兄弟姐妹关系路径 + */ getSiblingPath(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + // 男性:哥哥(ob) 或 弟弟(lb) + return toAge > fromAge ? 'ob' : 'lb'; + } else { + // 女性:姐姐(os) 或 妹妹(ls) + return toAge > fromAge ? 'os' : 'ls'; + } + } + /** + * 获取年龄(用于比较) + */ getAge(member) { + if (!member.birthDate) return 0; + const birthYear = new Date(member.birthDate).getFullYear(); + return new Date().getFullYear() - birthYear; + } + /** + * 获取关系的详细说明 + */ getRelationshipDetail(fromId, toId) { + const result = this.getRelationship(fromId, toId); + if (!result.success) { + return { + ...result, + description: result.error || '无法计算关系' + }; + } + // 构建带人名的路径(从 fromId 到 toId) + const pathWithNames = this.buildPathWithNames(fromId, toId); + // 只返回关系称谓,不包含完整句子 + return { + ...result, + path: pathWithNames || result.path, + description: result.term + }; + } + /** + * 构建带人名的路径描述 + * @param fromId 起始ID(查询的起点) + * @param toId 目标ID(查询的终点) + */ buildPathWithNames(fromId, toId) { + const queue = [ + { + id: fromId, + path: [] + } + ]; + const visited = new Set(); + // 获取起始成员名字 + const startMember = this.members.get(fromId); + const startName = startMember?.fullName || '未知'; + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + // 构建路径字符串:从起点到终点 + if (path.length === 0) return '本人'; + // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ... + const pathStr = path.map((p)=>`${p.relation}(${p.name})`).join(' → '); + return `${startName} → ${pathStr}`; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + const father = this.members.get(member.fatherId); + if (father) { + queue.push({ + id: member.fatherId, + path: [ + ...path, + { + name: father.fullName, + relation: '父亲' + } + ] + }); + } + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + const mother = this.members.get(member.motherId); + if (mother) { + queue.push({ + id: member.motherId, + path: [ + ...path, + { + name: mother.fullName, + relation: '母亲' + } + ] + }); + } + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const relation = member.gender === 'MALE' ? '妻子' : '丈夫'; + queue.push({ + id: spouseId, + path: [ + ...path, + { + name: spouse.fullName, + relation + } + ] + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const relation = child.gender === 'MALE' ? '儿子' : '女儿'; + queue.push({ + id: childId, + path: [ + ...path, + { + name: child.fullName, + relation + } + ] + }); + } + } + } + } + // 兄弟姐妹 + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + const siblingPath = this.getSiblingRelationName(member, sibling); + queue.push({ + id: siblingId, + path: [ + ...path, + { + name: sibling.fullName, + relation: siblingPath + } + ] + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹关系名称 + */ getSiblingRelationName(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + return toAge > fromAge ? '哥哥' : '弟弟'; + } else { + return toAge > fromAge ? '姐姐' : '妹妹'; + } + } + /** + * 计算路径长度(关系代数) + */ calculatePathLength(path) { + let length = 0; + let i = 0; + while(i < path.length){ + // 两字符的关系 + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if ([ + 'ob', + 'lb', + 'os', + 'ls' + ].includes(twoChar)) { + length++; + i += 2; + continue; + } + } + // 单字符的关系 + length++; + i++; + } + return length; + } + /** + * 将符号路径转换为中文文本 + * 例如:'fm' -> '父亲的母亲' + */ pathToChineseText(path) { + const pathMap = { + 'f': '父亲', + 'm': '母亲', + 'h': '丈夫', + 'w': '妻子', + 's': '儿子', + 'd': '女儿', + 'ob': '哥哥', + 'lb': '弟弟', + 'os': '姐姐', + 'ls': '妹妹' + }; + const parts = []; + let i = 0; + while(i < path.length){ + // 处理两字符的关系(如 ob, lb, os, ls) + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if (pathMap[twoChar]) { + parts.push(pathMap[twoChar]); + i += 2; + continue; + } + } + // 处理单字符的关系 + const oneChar = path[i]; + if (pathMap[oneChar]) { + parts.push(pathMap[oneChar]); + } + i++; + } + return parts.join('的'); + } + /** + * 将路径转换为中文描述(带"的"字) + */ getPathDescription(path) { + const pathMap = { + 'f': '的父亲', + 'm': '的母亲', + 'h': '的丈夫', + 'w': '的妻子', + 's': '的儿子', + 'd': '的女儿', + 'ob': '的哥哥', + 'lb': '的弟弟', + 'os': '的姐姐', + 'ls': '的妹妹' + }; + let description = ''; + for (const char of path){ + description += pathMap[char] || ''; + } + return description || '本人'; + } +} +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "useRelationship", + ()=>useRelationship +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)"); +; +; +; +function useRelationship() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const [loading, setLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + /** + * 计算两个成员之间的关系(客户端计算) + */ const calculateRelationship = (fromId, toId)=>{ + const members = Object.values(treeData.members); + const calculator = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RelationshipCalculator"](members); + return calculator.getRelationshipDetail(fromId, toId); + }; + /** + * 通过API计算关系(服务端计算) + */ const calculateRelationshipAPI = async (treeId, fromId, toId)=>{ + setLoading(true); + try { + const response = await fetch(`/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`); + if (!response.ok) { + throw new Error('计算关系失败'); + } + const data = await response.json(); + return { + term: data.relationship, + path: data.path, + description: data.description, + success: data.success + }; + } catch (error) { + console.error('计算关系失败:', error); + return null; + } finally{ + setLoading(false); + } + }; + /** + * 获取成员的所有直系亲属 + */ const getDirectRelatives = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return null; + const relatives = { + father: member.fatherId ? treeData.members[member.fatherId] : null, + mother: member.motherId ? treeData.members[member.motherId] : null, + spouses: member.spouseIds?.map((id)=>treeData.members[id]).filter(Boolean) || [], + children: member.childrenIds?.map((id)=>treeData.members[id]).filter(Boolean) || [] + }; + return relatives; + }; + /** + * 获取成员的所有兄弟姐妹 + */ const getSiblings = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return []; + const siblings = new Set(); + // 通过父亲查找 + if (member.fatherId) { + const father = treeData.members[member.fatherId]; + if (father?.childrenIds) { + father.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = treeData.members[member.motherId]; + if (mother?.childrenIds) { + mother.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + return Array.from(siblings).map((id)=>treeData.members[id]).filter(Boolean); + }; + /** + * 获取成员的所有祖先 + */ const getAncestors = (memberId, maxGenerations = 10)=>{ + const ancestors = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + ancestors.push({ + ...member, + generationDiff: generation + }); + } + if (member.fatherId) { + queue.push({ + id: member.fatherId, + generation: generation + 1 + }); + } + if (member.motherId) { + queue.push({ + id: member.motherId, + generation: generation + 1 + }); + } + } + return ancestors; + }; + /** + * 获取成员的所有后代 + */ const getDescendants = (memberId, maxGenerations = 10)=>{ + const descendants = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + descendants.push({ + ...member, + generationDiff: generation + }); + } + if (member.childrenIds) { + member.childrenIds.forEach((childId)=>{ + queue.push({ + id: childId, + generation: generation + 1 + }); + }); + } + } + return descendants; + }; + return { + calculateRelationship, + calculateRelationshipAPI, + getDirectRelatives, + getSiblings, + getAncestors, + getDescendants, + loading + }; +} +}), +"[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "FamilyTreeDB", + ()=>FamilyTreeDB, + "db", + ()=>db +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dexie@4.2.1/node_modules/dexie/import-wrapper.mjs [app-ssr] (ecmascript)"); +; +class FamilyTreeDB extends __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] { + members; + settings; + images; + activityLogs; + constructor(){ + super("FamilyTreeDB"); + this.version(1).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id" + }); + this.version(2).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id", + activityLogs: "id, timestamp, action, entityType, entityId" + }); + } +} +const db = new FamilyTreeDB(); +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "AvatarDisplay", + ()=>AvatarDisplay +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user-round.js [app-ssr] (ecmascript) "); +"use client"; +; +; +; +; +; +function AvatarDisplay({ imageId, fallbackUrl, fallbackText, gender, className }) { + const [blobUrl, setBlobUrl] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(undefined); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + if (imageId) { + __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["db"].images.get(imageId).then((image)=>{ + if (image) { + const url = URL.createObjectURL(image.blob); + setBlobUrl(url); + return ()=>URL.revokeObjectURL(url); + } + }); + } else { + setBlobUrl(undefined); + } + }, [ + imageId + ]); + // 如果有头像,显示头像 + if (blobUrl) { + 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$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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: className, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarImage"], { + src: blobUrl + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 38, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + className: "text-lg font-serif bg-muted", + children: fallbackText + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 39, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 37, + columnNumber: 7 + }, this); + } + // 没有头像,显示性别图标 + 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$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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: className, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + className: "bg-muted flex items-center justify-center", + children: gender === 'FEMALE' ? /*#__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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__["CircleUserRound"], { + className: "h-8 w-8 text-pink-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 49, + 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$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__["CircleUser"], { + className: "h-8 w-8 text-blue-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 51, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 47, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx", + lineNumber: 46, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Select", + ()=>Select, + "SelectContent", + ()=>SelectContent, + "SelectGroup", + ()=>SelectGroup, + "SelectItem", + ()=>SelectItem, + "SelectLabel", + ()=>SelectLabel, + "SelectScrollDownButton", + ()=>SelectScrollDownButton, + "SelectScrollUpButton", + ()=>SelectScrollUpButton, + "SelectSeparator", + ()=>SelectSeparator, + "SelectTrigger", + ()=>SelectTrigger, + "SelectValue", + ()=>SelectValue +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-select@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_0db8806b22e5e8953d2741c4abb73796/node_modules/@radix-ui/react-select/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$up$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronUpIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-up.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function Select({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "select", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function SelectGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "select-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 18, + columnNumber: 10 + }, this); +} +function SelectValue({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Value"], { + "data-slot": "select-value", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 24, + columnNumber: 10 + }, this); +} +function SelectTrigger({ className, size = 'default', children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "select-trigger", + "data-size": size, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Icon"], { + asChild: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__["ChevronDownIcon"], { + className: "size-4 opacity-50" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 47, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 46, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 36, + columnNumber: 5 + }, this); +} +function SelectContent({ className, children, position = 'popper', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "select-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), + position: position, + ...props, + 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"])(SelectScrollUpButton, {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 72, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Viewport"], { + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1'), + children: children + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 73, + 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"])(SelectScrollDownButton, {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 82, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 61, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 60, + columnNumber: 5 + }, this); +} +function SelectLabel({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "select-label", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground px-2 py-1.5 text-xs', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 93, + columnNumber: 5 + }, this); +} +function SelectItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "select-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className), + ...props, + 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: "absolute right-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 117, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 116, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 115, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemText"], { + children: children + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 120, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 107, + columnNumber: 5 + }, this); +} +function SelectSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "select-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border pointer-events-none -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 130, + columnNumber: 5 + }, this); +} +function SelectScrollUpButton({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ScrollUpButton"], { + "data-slot": "select-scroll-up-button", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex cursor-default items-center justify-center py-1', className), + ...props, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$up$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronUpIcon$3e$__["ChevronUpIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 151, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 143, + columnNumber: 5 + }, this); +} +function SelectScrollDownButton({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ScrollDownButton"], { + "data-slot": "select-scroll-down-button", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex cursor-default items-center justify-center py-1', className), + ...props, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__["ChevronDownIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 169, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 161, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Slider", + ()=>Slider +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slider$40$1$2e$2$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_15cb5f57cf2d4f9538980cf9c43bf152$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slider$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-slider@1.2.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_15cb5f57cf2d4f9538980cf9c43bf152/node_modules/@radix-ui/react-slider/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function Slider({ className, defaultValue, value, min = 0, max = 100, ...props }) { + const _values = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"](()=>Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [ + min, + max + ], [ + value, + defaultValue, + min, + max + ]); + 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$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$2f40$radix$2d$ui$2b$react$2d$slider$40$1$2e$2$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_15cb5f57cf2d4f9538980cf9c43bf152$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slider$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "slider", + defaultValue: defaultValue, + value: value, + min: min, + max: max, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col', className), + ...props, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slider$40$1$2e$2$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_15cb5f57cf2d4f9538980cf9c43bf152$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slider$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Track"], { + "data-slot": "slider-track", + className: 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5', + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slider$40$1$2e$2$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_15cb5f57cf2d4f9538980cf9c43bf152$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slider$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Range"], { + "data-slot": "slider-range", + className: 'bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full' + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx", + lineNumber: 45, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx", + lineNumber: 39, + columnNumber: 7 + }, this), + Array.from({ + length: _values.length + }, (_, index)=>/*#__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$2f40$radix$2d$ui$2b$react$2d$slider$40$1$2e$2$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_15cb5f57cf2d4f9538980cf9c43bf152$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slider$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Thumb"], { + "data-slot": "slider-thumb", + className: "border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50" + }, index, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx", + lineNumber: 53, + columnNumber: 9 + }, this)) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx", + lineNumber: 27, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "default", + ()=>MembersPage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/input.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/card.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$filter$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Filter$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/filter.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__X$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/x.js [app-ssr] (ecmascript) "); +var __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$__ = __turbopack_context__.i("[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/client/app-dir/link.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2d$display$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/slider.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$label$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/label.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +; +function MembersPage() { + const { treeData, searchMembers, setHighlightedMemberId } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { calculateRelationship } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRelationship"])(); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + const [query, setQuery] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + const [showFilters, setShowFilters] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [referenceId, setReferenceId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + // 从 URL 参数读取搜索关键词 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const params = new URLSearchParams(window.location.search); + const searchParam = params.get('search'); + if (searchParam) { + setQuery(searchParam); + } + }, []); + // Filter States + const [selectedSurname, setSelectedSurname] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])("all"); + const [selectedHome, setSelectedHome] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])("all"); + const [statusFilter, setStatusFilter] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])("all"); + const [generationRange, setGenerationRange] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([ + 1, + 100 + ]); + // Derived Data + const allMembers = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>Object.values(treeData.members), [ + treeData + ]); + const { uniqueSurnames, uniqueHomes, minGen, maxGen } = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>{ + const surnames = new Set(); + const homes = new Set(); + let min = 1000; + let max = 0; + allMembers.forEach((m)=>{ + if (m.surname) surnames.add(m.surname); + if (m.ancestralHome) homes.add(m.ancestralHome); + if (m.generation) { + if (m.generation < min) min = m.generation; + if (m.generation > max) max = m.generation; + } + }); + return { + uniqueSurnames: Array.from(surnames).sort(), + uniqueHomes: Array.from(homes).sort(), + minGen: min === 1000 ? 1 : min, + maxGen: max === 0 ? 100 : max + }; + }, [ + allMembers + ]); + // Initialize slider when data loads + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>{ + if (minGen !== 1000 && maxGen !== 0) { + // Only update if range is default + // This is a bit tricky, for now let's just rely on user adjustment or default wide range + // Ideally we sync this once. + } + }, [ + minGen, + maxGen + ]); + const filteredMembers = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>{ + let result = allMembers; + // 1. Search Query + if (query) { + const lowerQuery = query.toLowerCase(); + result = result.filter((m)=>m.fullName.toLowerCase().includes(lowerQuery) || m.courtesyName?.toLowerCase().includes(lowerQuery) || m.artName?.toLowerCase().includes(lowerQuery)); + } + // 2. Surname Filter + if (selectedSurname !== "all") { + result = result.filter((m)=>m.surname === selectedSurname); + } + // 3. Home Filter + if (selectedHome !== "all") { + result = result.filter((m)=>m.ancestralHome === selectedHome); + } + // 4. Status Filter + if (statusFilter !== "all") { + if (statusFilter === "living") { + result = result.filter((m)=>!m.deathDate); + } else if (statusFilter === "deceased") { + result = result.filter((m)=>!!m.deathDate); + } + } + // 5. Generation Filter + result = result.filter((m)=>m.generation >= generationRange[0] && m.generation <= generationRange[1]); + // Sort + return result.sort((a, b)=>a.generation - b.generation || (a.birthDate || "").localeCompare(b.birthDate || "")); + }, [ + allMembers, + query, + selectedSurname, + selectedHome, + statusFilter, + generationRange + ]); + // 按世代分组 + const membersByGeneration = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>{ + const groups = new Map(); + filteredMembers.forEach((member)=>{ + const gen = member.generation; + if (!groups.has(gen)) { + groups.set(gen, []); + } + groups.get(gen).push(member); + }); + // 转换为数组并排序 + return Array.from(groups.entries()).sort((a, b)=>a[0] - b[0]).map(([generation, members])=>({ + generation, + members + })); + }, [ + filteredMembers + ]); + const clearFilters = ()=>{ + setSelectedSurname("all"); + setSelectedHome("all"); + setStatusFilter("all"); + setGenerationRange([ + 1, + 100 + ]); // Reset to wide range + setQuery(""); + }; + const activeFilterCount = (selectedSurname !== "all" ? 1 : 0) + (selectedHome !== "all" ? 1 : 0) + (statusFilter !== "all" ? 1 : 0) + (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0); + 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$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: "min-h-screen bg-background flex flex-col font-sans", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 155, + 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"])("main", { + className: "container mx-auto py-8 px-4 md:px-6 flex-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 flex-col gap-6 mb-8", + 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 flex-col md:flex-row justify-between items-center gap-4", + 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"])("h1", { + className: "text-3xl font-serif font-bold", + children: "家族成员列表" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 159, + 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"])("div", { + className: "flex items-center gap-2 w-full md:w-auto", + 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: "relative flex-1 md:w-80", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + 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: 162, + 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$input$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Input"], { + type: "search", + placeholder: "搜索姓名、字号...", + className: "pl-9", + value: query, + onChange: (e)=>setQuery(e.target.value) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 163, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 161, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: showFilters || activeFilterCount > 0 ? "secondary" : "outline", + size: "icon", + onClick: ()=>setShowFilters(!showFilters), + className: "relative", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$filter$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Filter$3e$__["Filter"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 177, + 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$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: "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: 179, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 171, + 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$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"], { + href: "/members/new", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + className: "gap-2 bg-primary text-primary-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__["Plus"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 184, + columnNumber: 19 + }, this), + "新增成员" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 183, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 182, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 160, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 158, + 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$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: "bg-muted/30 p-4 rounded-lg border border-border space-y-4 animate-in slide-in-from-top-2", + 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", + 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"])("h3", { + className: "font-medium text-sm text-muted-foreground", + children: "高级筛选" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 195, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "sm", + onClick: clearFilters, + className: "h-8 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__X$3e$__["X"], { + className: "mr-1 h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 197, + columnNumber: 19 + }, this), + " 重置筛选" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 196, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 194, + 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: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4", + 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: "space-y-2", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$label$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + className: "text-xs", + children: "姓氏 (Surname)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 202, + 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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Select"], { + value: selectedSurname, + onValueChange: setSelectedSurname, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectTrigger"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectValue"], { + placeholder: "全部" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 205, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 204, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectContent"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: "all", + children: "全部 (All)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 208, + 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$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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: s, + children: s + }, s, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 210, + columnNumber: 25 + }, this)) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 207, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 203, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 201, + 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", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$label$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + className: "text-xs", + children: "籍贯 (Ancestral Home)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 219, + 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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Select"], { + value: selectedHome, + onValueChange: setSelectedHome, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectTrigger"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectValue"], { + placeholder: "全部" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 222, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 221, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectContent"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: "all", + children: "全部 (All)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 225, + 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$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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: h, + children: h + }, h, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 227, + columnNumber: 25 + }, this)) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 224, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 220, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 218, + 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", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$label$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + className: "text-xs", + children: "状态 (Status)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 236, + 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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Select"], { + value: statusFilter, + onValueChange: setStatusFilter, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectTrigger"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectValue"], { + placeholder: "全部" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 239, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 238, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectContent"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: "all", + children: "全部 (All)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 242, + 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$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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: "living", + children: "在世 (Living)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 243, + 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$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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: "deceased", + children: "已故 (Deceased)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 244, + columnNumber: 23 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 241, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 237, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 235, + 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", + 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 justify-between", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$label$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + className: "text-xs", + children: "世系范围 (Generation)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 251, + 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-xs text-muted-foreground", + children: [ + generationRange[0], + " - ", + generationRange[1], + " 世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 252, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 250, + 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$slider$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Slider"], { + defaultValue: [ + 1, + 100 + ], + value: generationRange, + min: 1, + max: 100, + step: 1, + onValueChange: (val)=>setGenerationRange(val), + className: "py-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 256, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 249, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 200, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 193, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 157, + 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$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/members/page.tsx", + lineNumber: 272, + 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", { + className: "space-y-8", + children: membersByGeneration.map(({ generation, members })=>/*#__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", { + 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 gap-3 mb-4", + 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"])("h2", { + className: "text-xl font-serif font-bold text-foreground", + children: [ + "第 ", + generation, + " 世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + 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"])("span", { + className: "text-sm text-muted-foreground", + children: [ + "共 ", + members.length, + " 人" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 281, + 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: "flex-1 h-px bg-border" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 282, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + 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"])("div", { + className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4", + children: members.map((member)=>{ + // 判断是否是配偶: + // 1. 没有父母ID + // 2. 有配偶ID + // 3. 不是始祖(没有'始祖'标签) + const isFounder = member.tags?.includes('始祖'); + const isSpouse = !member.fatherId && !member.motherId && member.spouseIds && member.spouseIds.length > 0 && !isFounder; + // 获取配偶信息 + const spouse = isSpouse && member.spouseIds?.[0] ? allMembers.find((m)=>m.id === member.spouseIds[0]) : null; + const spouseName = spouse ? spouse.fullName : null; + 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$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: "relative group", + 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"])(__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"], { + 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$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$__["Card"], { + className: "hover:border-primary transition-colors cursor-pointer h-full", + 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"])(__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"], { + className: "p-3 flex items-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"])("div", { + className: "relative flex-shrink-0", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2d$display$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarDisplay"], { + imageId: member.avatarImageId, + fallbackUrl: member.avatarUrl, + fallbackText: member.surname, + gender: member.gender, + 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: 305, + 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$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-1 -right-1 w-4 h-4 rounded-full bg-gray-500 border-2 border-white", + title: "已故" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 314, + 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$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-1 -right-1 w-4 h-4 rounded-full bg-green-500 border-2 border-white", + title: "在世" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 317, + columnNumber: 31 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 304, + 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: "flex-1 min-w-0 pl-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-baseline justify-between gap-1.5", + 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"])("h3", { + className: "text-base font-bold font-serif truncate", + children: [ + member.fullName, + member.courtesyName && /*#__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-[11px] font-normal text-muted-foreground ml-1", + children: [ + "字 ", + member.courtesyName + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 325, + columnNumber: 35 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 322, + columnNumber: 31 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 321, + 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$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", { + className: "text-[11px] text-amber-700 font-medium mt-0.5 truncate", + children: "家族始祖" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 332, + 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$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", { + className: "text-[11px] text-purple-700 mt-0.5 truncate", + children: [ + spouseName, + "的配偶" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 336, + 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", { + 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: 340, + 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: "flex items-start justify-between gap-2 mt-0.5", + 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"])("p", { + className: "text-[11px] text-muted-foreground truncate flex-1", + children: member.ancestralHome || "籍贯未知" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 347, + 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$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-[10px] text-muted-foreground text-right space-y-0.5 flex-shrink-0", + 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", { + children: [ + member.birthDate && new Date(member.birthDate).getFullYear(), + member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`, + !member.deathDate && member.birthDate && ' - ' + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 352, + columnNumber: 35 + }, this), + (()=>{ + if (!member.birthDate) return null; + const birthYear = new Date(member.birthDate).getFullYear(); + const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear(); + const age = deathYear - birthYear; + 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$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-[9px] text-muted-foreground", + children: member.deathDate ? `享年${age}岁` : `${age}岁` + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 363, + columnNumber: 39 + }, this); + })() + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 351, + columnNumber: 33 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 346, + 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$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: "mt-1.5 flex flex-wrap gap-1", + children: member.tags.map((tag)=>/*#__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-[9px] bg-primary/10 text-primary px-1 py-0.5 rounded border border-primary/20", + children: tag + }, tag, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 375, + columnNumber: 35 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 373, + columnNumber: 31 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 320, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 303, + columnNumber: 25 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 302, + columnNumber: 25 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 301, + 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$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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + size: "sm", + variant: "ghost", + className: "absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity h-6 w-6 p-0", + onClick: ()=>{ + setHighlightedMemberId(member.id); + router.push('/tree'); + }, + title: "在族谱图中定位", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 398, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 388, + columnNumber: 21 + }, this) + ] + }, member.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 300, + columnNumber: 21 + }, this); + }) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 284, + columnNumber: 17 + }, this) + ] + }, generation, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 278, + columnNumber: 15 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 276, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 156, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", + lineNumber: 154, + columnNumber: 5 + }, this); +} +}), +]; + +//# sourceMappingURL=Documents_go-new_chinese-family-tree_0fb7be34._.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js.map b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js.map new file mode 100644 index 00000000..0aff120b --- /dev/null +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_0fb7be34._.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sources": [], + "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 } 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 {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": 1187, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts"],"sourcesContent":["import relationship from 'relationship.js'\nimport type { FamilyMember } from '@/types/family'\n\n/**\n * 家族关系计算器\n * 使用 relationship.js 库计算中文亲属关系\n */\nexport class RelationshipCalculator {\n private members: Map\n\n constructor(members: FamilyMember[]) {\n this.members = new Map(members.map(m => [m.id, m]))\n }\n\n /**\n * 计算两个成员之间的关系\n * @param fromId 起始成员ID(成员A)\n * @param toId 目标成员ID(成员B)\n * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX)\n */\n getRelationship(fromId: string, toId: string): RelationshipResult {\n if (fromId === toId) {\n return {\n term: '本人',\n path: '',\n success: true\n }\n }\n\n const fromMember = this.members.get(fromId)\n const toMember = this.members.get(toId)\n\n if (!fromMember || !toMember) {\n return {\n term: '未知',\n path: '',\n success: false,\n error: '成员不存在'\n }\n }\n\n // 构建关系路径(从 fromId 到 toId)\n const path = this.buildRelationPath(fromId, toId)\n \n if (!path) {\n return {\n term: '无血缘关系',\n path: '',\n success: false\n }\n }\n\n // 将路径转换为中文\n const chinesePath = this.pathToChineseText(path)\n \n // 使用 relationship.js 计算关系\n try {\n // 获取fromId成员的性别(从谁的角度看关系)\n const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1\n \n // 计算关系(toId 对 fromId 的称谓)\n const result = relationship({\n text: chinesePath,\n target: '',\n sex: fromMemberGender, // 传入fromId的性别(从谁的角度看)\n reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓\n })\n \n const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'\n \n return {\n term,\n path: chinesePath,\n success: true\n }\n } catch (error) {\n return {\n term: '亲戚',\n path: chinesePath,\n success: true\n }\n }\n }\n\n /**\n * 构建关系路径字符串\n * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子\n * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹\n */\n private buildRelationPath(fromId: string, toId: string): string | null {\n // 使用BFS查找最短路径\n const queue: Array<{ id: string; path: string }> = [{ id: fromId, path: '' }]\n const visited = new Set()\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n return path\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n queue.push({ id: member.fatherId, path: path + 'f' })\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n queue.push({ id: member.motherId, path: path + 'm' })\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const spousePath = member.gender === 'MALE' ? 'w' : 'h'\n queue.push({ id: spouseId, path: path + spousePath })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const childPath = child.gender === 'MALE' ? 's' : 'd'\n queue.push({ id: childId, path: path + childPath })\n }\n }\n }\n }\n\n // 兄弟姐妹(通过父母查找)\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹\n const siblingPath = this.getSiblingPath(member, sibling)\n queue.push({ id: siblingId, path: path + siblingPath })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹\n */\n private getSiblings(memberId: string): string[] {\n const member = this.members.get(memberId)\n if (!member) return []\n\n const siblings: string[] = []\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = this.members.get(member.fatherId)\n if (father?.childrenIds) {\n siblings.push(...father.childrenIds.filter(id => id !== memberId))\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = this.members.get(member.motherId)\n if (mother?.childrenIds) {\n for (const childId of mother.childrenIds) {\n if (childId !== memberId && !siblings.includes(childId)) {\n siblings.push(childId)\n }\n }\n }\n }\n\n return siblings\n }\n\n /**\n * 获取兄弟姐妹关系路径\n */\n private getSiblingPath(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n // 男性:哥哥(ob) 或 弟弟(lb)\n return toAge > fromAge ? 'ob' : 'lb'\n } else {\n // 女性:姐姐(os) 或 妹妹(ls)\n return toAge > fromAge ? 'os' : 'ls'\n }\n }\n\n /**\n * 获取年龄(用于比较)\n */\n private getAge(member: FamilyMember): number {\n if (!member.birthDate) return 0\n const birthYear = new Date(member.birthDate).getFullYear()\n return new Date().getFullYear() - birthYear\n }\n\n /**\n * 获取关系的详细说明\n */\n getRelationshipDetail(fromId: string, toId: string): RelationshipDetail {\n const result = this.getRelationship(fromId, toId)\n \n if (!result.success) {\n return {\n ...result,\n description: result.error || '无法计算关系'\n }\n }\n\n // 构建带人名的路径(从 fromId 到 toId)\n const pathWithNames = this.buildPathWithNames(fromId, toId)\n\n // 只返回关系称谓,不包含完整句子\n return {\n ...result,\n path: pathWithNames || result.path,\n description: result.term\n }\n }\n\n /**\n * 构建带人名的路径描述\n * @param fromId 起始ID(查询的起点)\n * @param toId 目标ID(查询的终点)\n */\n private buildPathWithNames(fromId: string, toId: string): string | null {\n const queue: Array<{ id: string; path: Array<{name: string, relation: string}> }> = [\n { id: fromId, path: [] }\n ]\n const visited = new Set()\n \n // 获取起始成员名字\n const startMember = this.members.get(fromId)\n const startName = startMember?.fullName || '未知'\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n // 构建路径字符串:从起点到终点\n if (path.length === 0) return '本人'\n \n // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ...\n const pathStr = path.map(p => `${p.relation}(${p.name})`).join(' → ')\n return `${startName} → ${pathStr}`\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n const father = this.members.get(member.fatherId)\n if (father) {\n queue.push({\n id: member.fatherId,\n path: [...path, { name: father.fullName, relation: '父亲' }]\n })\n }\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n const mother = this.members.get(member.motherId)\n if (mother) {\n queue.push({\n id: member.motherId,\n path: [...path, { name: mother.fullName, relation: '母亲' }]\n })\n }\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const relation = member.gender === 'MALE' ? '妻子' : '丈夫'\n queue.push({\n id: spouseId,\n path: [...path, { name: spouse.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const relation = child.gender === 'MALE' ? '儿子' : '女儿'\n queue.push({\n id: childId,\n path: [...path, { name: child.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 兄弟姐妹\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n const siblingPath = this.getSiblingRelationName(member, sibling)\n queue.push({\n id: siblingId,\n path: [...path, { name: sibling.fullName, relation: siblingPath }]\n })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹关系名称\n */\n private getSiblingRelationName(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n return toAge > fromAge ? '哥哥' : '弟弟'\n } else {\n return toAge > fromAge ? '姐姐' : '妹妹'\n }\n }\n\n /**\n * 计算路径长度(关系代数)\n */\n private calculatePathLength(path: string): number {\n let length = 0\n let i = 0\n \n while (i < path.length) {\n // 两字符的关系\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (['ob', 'lb', 'os', 'ls'].includes(twoChar)) {\n length++\n i += 2\n continue\n }\n }\n \n // 单字符的关系\n length++\n i++\n }\n \n return length\n }\n\n /**\n * 将符号路径转换为中文文本\n * 例如:'fm' -> '父亲的母亲'\n */\n private pathToChineseText(path: string): string {\n const pathMap: Record = {\n 'f': '父亲',\n 'm': '母亲',\n 'h': '丈夫',\n 'w': '妻子',\n 's': '儿子',\n 'd': '女儿',\n 'ob': '哥哥',\n 'lb': '弟弟',\n 'os': '姐姐',\n 'ls': '妹妹'\n }\n\n const parts: string[] = []\n let i = 0\n \n while (i < path.length) {\n // 处理两字符的关系(如 ob, lb, os, ls)\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (pathMap[twoChar]) {\n parts.push(pathMap[twoChar])\n i += 2\n continue\n }\n }\n \n // 处理单字符的关系\n const oneChar = path[i]\n if (pathMap[oneChar]) {\n parts.push(pathMap[oneChar])\n }\n i++\n }\n\n return parts.join('的')\n }\n\n /**\n * 将路径转换为中文描述(带\"的\"字)\n */\n private getPathDescription(path: string): string {\n const pathMap: Record = {\n 'f': '的父亲',\n 'm': '的母亲',\n 'h': '的丈夫',\n 'w': '的妻子',\n 's': '的儿子',\n 'd': '的女儿',\n 'ob': '的哥哥',\n 'lb': '的弟弟',\n 'os': '的姐姐',\n 'ls': '的妹妹'\n }\n\n let description = ''\n for (const char of path) {\n description += pathMap[char] || ''\n }\n\n return description || '本人'\n }\n}\n\nexport interface RelationshipResult {\n term: string // 关系称谓(如:父亲、堂兄弟)\n path: string // 关系路径(如:f, fbs)\n success: boolean // 是否成功计算\n error?: string // 错误信息\n}\n\nexport interface RelationshipDetail extends RelationshipResult {\n description: string // 关系描述(如:父亲的哥哥的儿子)\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1638, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts"],"sourcesContent":["import { useState } from 'react'\nimport { useFamily } from '@/context/family-context'\nimport { RelationshipCalculator, type RelationshipDetail } from '@/lib/relationship-calculator'\n\n/**\n * 使用家族关系计算的Hook\n */\nexport function useRelationship() {\n const { treeData } = useFamily()\n const [loading, setLoading] = useState(false)\n\n /**\n * 计算两个成员之间的关系(客户端计算)\n */\n const calculateRelationship = (fromId: string, toId: string): RelationshipDetail => {\n const members = Object.values(treeData.members)\n const calculator = new RelationshipCalculator(members)\n return calculator.getRelationshipDetail(fromId, toId)\n }\n\n /**\n * 通过API计算关系(服务端计算)\n */\n const calculateRelationshipAPI = async (\n treeId: string,\n fromId: string,\n toId: string\n ): Promise => {\n setLoading(true)\n try {\n const response = await fetch(\n `/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`\n )\n \n if (!response.ok) {\n throw new Error('计算关系失败')\n }\n\n const data = await response.json()\n return {\n term: data.relationship,\n path: data.path,\n description: data.description,\n success: data.success\n }\n } catch (error) {\n console.error('计算关系失败:', error)\n return null\n } finally {\n setLoading(false)\n }\n }\n\n /**\n * 获取成员的所有直系亲属\n */\n const getDirectRelatives = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return null\n\n const relatives = {\n father: member.fatherId ? treeData.members[member.fatherId] : null,\n mother: member.motherId ? treeData.members[member.motherId] : null,\n spouses: member.spouseIds?.map(id => treeData.members[id]).filter(Boolean) || [],\n children: member.childrenIds?.map(id => treeData.members[id]).filter(Boolean) || []\n }\n\n return relatives\n }\n\n /**\n * 获取成员的所有兄弟姐妹\n */\n const getSiblings = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return []\n\n const siblings = new Set()\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = treeData.members[member.fatherId]\n if (father?.childrenIds) {\n father.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = treeData.members[member.motherId]\n if (mother?.childrenIds) {\n mother.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n return Array.from(siblings).map(id => treeData.members[id]).filter(Boolean)\n }\n\n /**\n * 获取成员的所有祖先\n */\n const getAncestors = (memberId: string, maxGenerations: number = 10) => {\n const ancestors: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n ancestors.push({ ...member, generationDiff: generation })\n }\n\n if (member.fatherId) {\n queue.push({ id: member.fatherId, generation: generation + 1 })\n }\n if (member.motherId) {\n queue.push({ id: member.motherId, generation: generation + 1 })\n }\n }\n\n return ancestors\n }\n\n /**\n * 获取成员的所有后代\n */\n const getDescendants = (memberId: string, maxGenerations: number = 10) => {\n const descendants: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n descendants.push({ ...member, generationDiff: generation })\n }\n\n if (member.childrenIds) {\n member.childrenIds.forEach(childId => {\n queue.push({ id: childId, generation: generation + 1 })\n })\n }\n }\n\n return descendants\n }\n\n return {\n calculateRelationship,\n calculateRelationshipAPI,\n getDirectRelatives,\n getSiblings,\n getAncestors,\n getDescendants,\n loading\n }\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1806, "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": 1839, "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": 1932, "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": 2165, "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": 2235, "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 { useRelationship } from \"@/hooks/use-relationship\"\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 { calculateRelationship } = useRelationship()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n const [referenceId, setReferenceId] = useState(\"\")\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 generation,\n members\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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"}}] +} \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js new file mode 100644 index 00000000..88be9aa2 --- /dev/null +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js @@ -0,0 +1,2765 @@ +module.exports = [ +"[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Avatar", + ()=>Avatar, + "AvatarFallback", + ()=>AvatarFallback, + "AvatarImage", + ()=>AvatarImage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-avatar@1.1.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_3ee3dafa662d71951c1a3d5b289c96d1/node_modules/@radix-ui/react-avatar/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +function Avatar({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "avatar", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('relative flex size-8 shrink-0 overflow-hidden rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 13, + columnNumber: 5 + }, this); +} +function AvatarImage({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Image"], { + "data-slot": "avatar-image", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('aspect-square size-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 29, + columnNumber: 5 + }, this); +} +function AvatarFallback({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Fallback"], { + "data-slot": "avatar-fallback", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-muted flex size-full items-center justify-center rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 42, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "DropdownMenu", + ()=>DropdownMenu, + "DropdownMenuCheckboxItem", + ()=>DropdownMenuCheckboxItem, + "DropdownMenuContent", + ()=>DropdownMenuContent, + "DropdownMenuGroup", + ()=>DropdownMenuGroup, + "DropdownMenuItem", + ()=>DropdownMenuItem, + "DropdownMenuLabel", + ()=>DropdownMenuLabel, + "DropdownMenuPortal", + ()=>DropdownMenuPortal, + "DropdownMenuRadioGroup", + ()=>DropdownMenuRadioGroup, + "DropdownMenuRadioItem", + ()=>DropdownMenuRadioItem, + "DropdownMenuSeparator", + ()=>DropdownMenuSeparator, + "DropdownMenuShortcut", + ()=>DropdownMenuShortcut, + "DropdownMenuSub", + ()=>DropdownMenuSub, + "DropdownMenuSubContent", + ()=>DropdownMenuSubContent, + "DropdownMenuSubTrigger", + ()=>DropdownMenuSubTrigger, + "DropdownMenuTrigger", + ()=>DropdownMenuTrigger +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types_aefad4ac5851d46557f75f368796c888/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-right.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function DropdownMenu({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "dropdown-menu", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function DropdownMenuPortal({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + "data-slot": "dropdown-menu-portal", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 19, + columnNumber: 5 + }, this); +} +function DropdownMenuTrigger({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "dropdown-menu-trigger", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 27, + columnNumber: 5 + }, this); +} +function DropdownMenuContent({ className, sideOffset = 4, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "dropdown-menu-content", + sideOffset: sideOffset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 41, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 40, + columnNumber: 5 + }, this); +} +function DropdownMenuGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "dropdown-menu-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 58, + columnNumber: 5 + }, this); +} +function DropdownMenuItem({ className, inset, variant = 'default', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "dropdown-menu-item", + "data-inset": inset, + "data-variant": variant, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 72, + columnNumber: 5 + }, this); +} +function DropdownMenuCheckboxItem({ className, children, checked, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CheckboxItem"], { + "data-slot": "dropdown-menu-checkbox-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + checked: checked, + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 103, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 102, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 101, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 92, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioGroup"], { + "data-slot": "dropdown-menu-radio-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 115, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioItem"], { + "data-slot": "dropdown-menu-radio-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__["CircleIcon"], { + className: "size-2 fill-current" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 138, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 137, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 136, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 128, + columnNumber: 5 + }, this); +} +function DropdownMenuLabel({ className, inset, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "dropdown-menu-label", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 154, + columnNumber: 5 + }, this); +} +function DropdownMenuSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "dropdown-menu-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 171, + columnNumber: 5 + }, this); +} +function DropdownMenuShortcut({ className, ...props }) { + 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$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", { + "data-slot": "dropdown-menu-shortcut", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground ml-auto text-xs tracking-widest', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 184, + columnNumber: 5 + }, this); +} +function DropdownMenuSub({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Sub"], { + "data-slot": "dropdown-menu-sub", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 198, + columnNumber: 10 + }, this); +} +function DropdownMenuSubTrigger({ className, inset, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubTrigger"], { + "data-slot": "dropdown-menu-sub-trigger", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__["ChevronRightIcon"], { + className: "ml-auto size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 220, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 210, + columnNumber: 5 + }, this); +} +function DropdownMenuSubContent({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubContent"], { + "data-slot": "dropdown-menu-sub-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 230, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "SiteHeader", + ()=>SiteHeader +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[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/client/app-dir/link.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript) "); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/input.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next-auth@4.24.13_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__nodemailer@7_3c43d6bc4ecce810d1d16651fe207b00/node_modules/next-auth/react/index.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +function SiteHeader() { + const { searchMembers, searchResults } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { data: session, status } = (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])(); + const { showAlert, showConfirm, showPrompt } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useDialog"])(); + const pathname = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["usePathname"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [searchQuery, setSearchQuery] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + const [showResults, setShowResults] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [familyTrees, setFamilyTrees] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [currentTree, setCurrentTree] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [deletingTreeId, setDeletingTreeId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const searchRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + // 获取当前视图模式 + const currentViewMode = searchParams.get('view') || 'traditional'; + const isTreePage = pathname === '/tree'; + // 生成带有 treeId 的 URL + const getUrlWithTreeId = (path)=>{ + if (currentTree?.id) { + return `${path}?treeId=${currentTree.id}`; + } + return path; + }; + // 切换视图模式 + const handleViewModeChange = (mode)=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', mode); + if (currentTree?.id) { + params.set('treeId', currentTree.id); + } + router.push(`${pathname}?${params.toString()}`); + }; + const getRoleBadge = (role)=>{ + switch(role){ + case "OWNER": + 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$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] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 border border-purple-200 ml-2", + children: "所有者" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 69, + columnNumber: 16 + }, this); + case "EDITOR": + 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$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] px-1.5 py-0.5 rounded bg-blue-100 text-blue-700 border border-blue-200 ml-2", + children: "编辑" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 71, + columnNumber: 16 + }, this); + case "VIEWER": + 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$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] px-1.5 py-0.5 rounded bg-gray-100 text-gray-700 border border-gray-200 ml-2", + children: "查看" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 73, + columnNumber: 16 + }, this); + default: + return null; + } + }; + const handleSignOut = async ()=>{ + await (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["signOut"])({ + callbackUrl: "/auth/signin" + }); + }; + // 获取用户名首字母作为头像 + const getUserInitial = ()=>{ + if (session?.user?.name) { + return session.user.name.charAt(0).toUpperCase(); + } + if (session?.user?.email) { + return session.user.email.charAt(0).toUpperCase(); + } + return "U"; + }; + // 删除家族树 + const handleDeleteTree = async (tree, e)=>{ + e.stopPropagation(); // 阻止触发选择事件 + // 检查权限 + if (tree.ownerId !== session?.user?.id) { + await showAlert('只有家族树的创建者才能删除', '权限不足'); + return; + } + const confirmText = `确定要删除家族树"${tree.name}"吗?\n\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`; + const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive'); + if (!confirmed) { + return; + } + // 二次确认 + const finalConfirm = await showPrompt(`请输入家族树名称"${tree.name}"以确认删除:`, '', '确认删除'); + if (finalConfirm !== tree.name) { + await showAlert('名称不匹配,删除已取消', '操作已取消'); + return; + } + setDeletingTreeId(tree.id); + try { + const response = await fetch(`/api/trees/${tree.id}`, { + method: 'DELETE' + }); + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error || '删除失败'); + } + // 刷新家族树列表 + await loadFamilyTrees(); + // 如果删除的是当前树,跳转到首页 + if (currentTree?.id === tree.id) { + window.location.href = '/'; + } + } catch (error) { + console.error('删除家族树失败:', error); + await showAlert('删除失败:' + error.message, '错误'); + } finally{ + setDeletingTreeId(null); + } + }; + // 获取家族树列表 + const loadFamilyTrees = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + if (!session?.user?.id || status !== 'authenticated') return; + const controller = new AbortController(); + fetch('/api/trees', { + signal: controller.signal + }).then((res)=>{ + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`); + return res.json(); + }).then((data)=>{ + if (data.trees) { + setFamilyTrees(data.trees); + // 如果 URL 中有 treeId,使用该树,否则使用第一个 + const urlParams = new URLSearchParams(window.location.search); + const treeId = urlParams.get('treeId'); + if (treeId) { + const tree = data.trees.find((t)=>t.id === treeId); + if (tree) { + setCurrentTree(tree); + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } + }).catch((err)=>{ + // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的) + if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') { + console.error('获取家族树列表失败:', err); + } + }); + return ()=>controller.abort(); + }, [ + session?.user?.id, + status + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + loadFamilyTrees(); + }, [ + loadFamilyTrees + ]); + // 监听路由变化,刷新家族树列表 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const handleRouteChange = ()=>{ + loadFamilyTrees(); + }; + window.addEventListener('focus', handleRouteChange); + return ()=>window.removeEventListener('focus', handleRouteChange); + }, [ + loadFamilyTrees + ]); + // 点击外部关闭搜索结果 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + function handleClickOutside(event) { + if (searchRef.current && !searchRef.current.contains(event.target)) { + setShowResults(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return ()=>document.removeEventListener("mousedown", handleClickOutside); + }, []); + const handleSearch = (query)=>{ + setSearchQuery(query); + searchMembers(query); + setShowResults(query.length > 0); + }; + const handleSelectMember = (memberId)=>{ + router.push(`/members/${memberId}`); + setSearchQuery(""); + setShowResults(false); + }; + 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$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"])("header", { + className: "sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", + 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: "container mx-auto flex h-16 items-center px-4", + 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: "mr-8 flex items-center gap-4", + 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"])(__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"], { + href: "/", + className: "flex items-center gap-2", + 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 h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__["BookOpen"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 229, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 228, + 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"])("span", { + className: "text-xl font-serif font-bold tracking-tight", + children: "华夏谱" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 231, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 227, + columnNumber: 11 + }, this), + session && familyTrees.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$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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 min-w-[200px]", + 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: "flex-1 truncate text-left", + children: currentTree?.name || '选择家族树' + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 239, + 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$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-4 w-4 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 240, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 238, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 237, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "start", + className: "w-[var(--radix-dropdown-menu-trigger-width)] min-w-[200px]", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + children: "我的家族树" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 244, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 245, + columnNumber: 17 + }, this), + familyTrees.map((tree)=>/*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + setCurrentTree(tree); + // 保持当前路径,只更新 treeId 参数 + const currentPath = window.location.pathname; + router.push(`${currentPath}?treeId=${tree.id}`); + }, + className: "cursor-pointer flex items-center justify-between group", + 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 overflow-hidden", + 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: "truncate", + children: tree.name + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 258, + columnNumber: 23 + }, this), + getRoleBadge(tree.currentUserRole) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 257, + 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: "flex items-center gap-2", + children: [ + currentTree?.id === tree.id && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 263, + columnNumber: 25 + }, this), + tree.ownerId === session?.user?.id && /*#__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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "sm", + className: "h-6 w-6 p-0 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-destructive hover:text-destructive-foreground", + onClick: (e)=>handleDeleteTree(tree, e), + disabled: deletingTreeId === tree.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$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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__["Trash2"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 273, + columnNumber: 27 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 266, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 261, + columnNumber: 21 + }, this) + ] + }, tree.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>router.push('/trees/new'), + className: "cursor-pointer text-primary", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__["Plus"], { + className: "h-4 w-4 mr-2" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 284, + columnNumber: 19 + }, this), + "创建新家族树" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 280, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 243, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 236, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 226, + 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"])("nav", { + className: "hidden md:flex items-center gap-6 text-sm font-medium text-muted-foreground", + 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"])(__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"], { + href: getUrlWithTreeId("/"), + className: "transition-colors hover:text-foreground data-[active=true]:text-foreground data-[active=true]:font-semibold", + children: "总览 (Overview)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 293, + 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$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"], { + href: getUrlWithTreeId("/tree"), + className: "transition-colors hover:text-foreground", + children: "族谱 (Tree)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 299, + 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$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"], { + href: getUrlWithTreeId("/members"), + className: "transition-colors hover:text-foreground", + children: "成员 (Members)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 302, + 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$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"], { + href: getUrlWithTreeId("/timeline"), + className: "transition-colors hover:text-foreground", + children: "大事记 (Timeline)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 305, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 292, + 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", { + className: "ml-auto flex items-center gap-4", + 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: "relative hidden sm:block", + ref: searchRef, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + 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/components/site-header.tsx", + lineNumber: 312, + 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$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Input"], { + type: "search", + placeholder: "搜索成员...", + value: searchQuery, + onChange: (e)=>handleSearch(e.target.value), + className: "h-9 w-64 rounded-full bg-muted pl-9 text-sm focus-visible:ring-primary" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 313, + columnNumber: 13 + }, this), + showResults && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg max-h-96 overflow-y-auto z-50", + children: searchResults.map((member)=>/*#__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"])("button", { + onClick: ()=>handleSelectMember(member.id), + className: "w-full px-4 py-3 text-left hover:bg-muted transition-colors border-b border-border last:border-0", + 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 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"])("div", { + className: "flex-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 gap-2", + 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: "font-medium", + children: member.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 333, + 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"])("span", { + className: `text-xs px-1.5 py-0.5 rounded ${member.gender === "MALE" ? "bg-blue-100 text-blue-700" : "bg-pink-100 text-pink-700"}`, + children: member.gender === "MALE" ? "男" : "女" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 334, + 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"])("span", { + className: "text-xs text-muted-foreground", + children: [ + "第", + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 337, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 332, + 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"])("p", { + className: "text-xs text-muted-foreground mt-1", + children: [ + member.birthDate && `生于 ${member.birthDate}`, + member.birthPlace && ` · ${member.birthPlace}` + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 339, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 331, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 330, + columnNumber: 21 + }, this) + }, member.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 325, + columnNumber: 19 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 323, + columnNumber: 15 + }, this), + showResults && searchQuery && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg p-4 text-center text-sm text-muted-foreground z-50", + children: "未找到匹配的成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 352, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 311, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__["Bell"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 359, + 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"])("span", { + className: "sr-only", + children: "Notifications" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 360, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 358, + 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$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"], { + href: "/settings", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 365, + 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"])("span", { + className: "sr-only", + children: "Settings" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 366, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 364, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 363, + columnNumber: 11 + }, this), + status === "loading" ? /*#__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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: "..." + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 372, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 371, + columnNumber: 13 + }, this) : session ? /*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + className: "relative h-8 w-8 rounded-full", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarImage"], { + src: undefined, + alt: session.user?.name || "User" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 379, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: getUserInitial() + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 380, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 378, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 377, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 376, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + className: "w-56", + align: "end", + forceMount: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + className: "font-normal", + 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 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"])("p", { + className: "text-sm font-medium leading-none", + children: session.user?.name || "用户" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 387, + 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"])("p", { + className: "text-xs leading-none text-muted-foreground", + children: session.user?.email + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 388, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 386, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 385, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 393, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + asChild: true, + 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"])(__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"], { + href: "/settings", + className: "cursor-pointer", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 396, + 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", { + children: "系统设置" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 397, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 395, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 394, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 400, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: handleSignOut, + className: "cursor-pointer text-red-600", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__["LogOut"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 402, + 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", { + children: "退出登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 403, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 401, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 384, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 375, + 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"], { + href: "/auth/signin", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "default", + size: "sm", + children: "登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 409, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 408, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 310, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 225, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 224, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "RelationshipCalculator", + ()=>RelationshipCalculator +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/relationship.js@1.2.7/node_modules/relationship.js/dist/relationship.min.mjs [app-ssr] (ecmascript)"); +; +class RelationshipCalculator { + members; + constructor(members){ + this.members = new Map(members.map((m)=>[ + m.id, + m + ])); + } + /** + * 计算两个成员之间的关系 + * @param fromId 起始成员ID(成员A) + * @param toId 目标成员ID(成员B) + * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX) + */ getRelationship(fromId, toId) { + if (fromId === toId) { + return { + term: '本人', + path: '', + success: true + }; + } + const fromMember = this.members.get(fromId); + const toMember = this.members.get(toId); + if (!fromMember || !toMember) { + return { + term: '未知', + path: '', + success: false, + error: '成员不存在' + }; + } + // 构建关系路径(从 fromId 到 toId) + const path = this.buildRelationPath(fromId, toId); + if (!path) { + return { + term: '无血缘关系', + path: '', + success: false + }; + } + // 将路径转换为中文 + const chinesePath = this.pathToChineseText(path); + // 使用 relationship.js 计算关系 + try { + // 获取fromId成员的性别(从谁的角度看关系) + const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1; + // 计算关系(toId 对 fromId 的称谓) + const result = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])({ + text: chinesePath, + target: '', + sex: fromMemberGender, + reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓 + }); + const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'; + return { + term, + path: chinesePath, + success: true + }; + } catch (error) { + return { + term: '亲戚', + path: chinesePath, + success: true + }; + } + } + /** + * 构建关系路径字符串 + * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子 + * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹 + */ buildRelationPath(fromId, toId) { + // 使用BFS查找最短路径 + const queue = [ + { + id: fromId, + path: '' + } + ]; + const visited = new Set(); + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + return path; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + queue.push({ + id: member.fatherId, + path: path + 'f' + }); + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + queue.push({ + id: member.motherId, + path: path + 'm' + }); + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const spousePath = member.gender === 'MALE' ? 'w' : 'h'; + queue.push({ + id: spouseId, + path: path + spousePath + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const childPath = child.gender === 'MALE' ? 's' : 'd'; + queue.push({ + id: childId, + path: path + childPath + }); + } + } + } + } + // 兄弟姐妹(通过父母查找) + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹 + const siblingPath = this.getSiblingPath(member, sibling); + queue.push({ + id: siblingId, + path: path + siblingPath + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹 + */ getSiblings(memberId) { + const member = this.members.get(memberId); + if (!member) return []; + const siblings = []; + // 通过父亲查找 + if (member.fatherId) { + const father = this.members.get(member.fatherId); + if (father?.childrenIds) { + siblings.push(...father.childrenIds.filter((id)=>id !== memberId)); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = this.members.get(member.motherId); + if (mother?.childrenIds) { + for (const childId of mother.childrenIds){ + if (childId !== memberId && !siblings.includes(childId)) { + siblings.push(childId); + } + } + } + } + return siblings; + } + /** + * 获取兄弟姐妹关系路径 + */ getSiblingPath(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + // 男性:哥哥(ob) 或 弟弟(lb) + return toAge > fromAge ? 'ob' : 'lb'; + } else { + // 女性:姐姐(os) 或 妹妹(ls) + return toAge > fromAge ? 'os' : 'ls'; + } + } + /** + * 获取年龄(用于比较) + */ getAge(member) { + if (!member.birthDate) return 0; + const birthYear = new Date(member.birthDate).getFullYear(); + return new Date().getFullYear() - birthYear; + } + /** + * 获取关系的详细说明 + */ getRelationshipDetail(fromId, toId) { + const result = this.getRelationship(fromId, toId); + if (!result.success) { + return { + ...result, + description: result.error || '无法计算关系' + }; + } + // 构建带人名的路径(从 fromId 到 toId) + const pathWithNames = this.buildPathWithNames(fromId, toId); + // 只返回关系称谓,不包含完整句子 + return { + ...result, + path: pathWithNames || result.path, + description: result.term + }; + } + /** + * 构建带人名的路径描述 + * @param fromId 起始ID(查询的起点) + * @param toId 目标ID(查询的终点) + */ buildPathWithNames(fromId, toId) { + const queue = [ + { + id: fromId, + path: [] + } + ]; + const visited = new Set(); + // 获取起始成员名字 + const startMember = this.members.get(fromId); + const startName = startMember?.fullName || '未知'; + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + // 构建路径字符串:从起点到终点 + if (path.length === 0) return '本人'; + // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ... + const pathStr = path.map((p)=>`${p.relation}(${p.name})`).join(' → '); + return `${startName} → ${pathStr}`; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + const father = this.members.get(member.fatherId); + if (father) { + queue.push({ + id: member.fatherId, + path: [ + ...path, + { + name: father.fullName, + relation: '父亲' + } + ] + }); + } + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + const mother = this.members.get(member.motherId); + if (mother) { + queue.push({ + id: member.motherId, + path: [ + ...path, + { + name: mother.fullName, + relation: '母亲' + } + ] + }); + } + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const relation = member.gender === 'MALE' ? '妻子' : '丈夫'; + queue.push({ + id: spouseId, + path: [ + ...path, + { + name: spouse.fullName, + relation + } + ] + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const relation = child.gender === 'MALE' ? '儿子' : '女儿'; + queue.push({ + id: childId, + path: [ + ...path, + { + name: child.fullName, + relation + } + ] + }); + } + } + } + } + // 兄弟姐妹 + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + const siblingPath = this.getSiblingRelationName(member, sibling); + queue.push({ + id: siblingId, + path: [ + ...path, + { + name: sibling.fullName, + relation: siblingPath + } + ] + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹关系名称 + */ getSiblingRelationName(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + return toAge > fromAge ? '哥哥' : '弟弟'; + } else { + return toAge > fromAge ? '姐姐' : '妹妹'; + } + } + /** + * 计算路径长度(关系代数) + */ calculatePathLength(path) { + let length = 0; + let i = 0; + while(i < path.length){ + // 两字符的关系 + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if ([ + 'ob', + 'lb', + 'os', + 'ls' + ].includes(twoChar)) { + length++; + i += 2; + continue; + } + } + // 单字符的关系 + length++; + i++; + } + return length; + } + /** + * 将符号路径转换为中文文本 + * 例如:'fm' -> '父亲的母亲' + */ pathToChineseText(path) { + const pathMap = { + 'f': '父亲', + 'm': '母亲', + 'h': '丈夫', + 'w': '妻子', + 's': '儿子', + 'd': '女儿', + 'ob': '哥哥', + 'lb': '弟弟', + 'os': '姐姐', + 'ls': '妹妹' + }; + const parts = []; + let i = 0; + while(i < path.length){ + // 处理两字符的关系(如 ob, lb, os, ls) + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if (pathMap[twoChar]) { + parts.push(pathMap[twoChar]); + i += 2; + continue; + } + } + // 处理单字符的关系 + const oneChar = path[i]; + if (pathMap[oneChar]) { + parts.push(pathMap[oneChar]); + } + i++; + } + return parts.join('的'); + } + /** + * 将路径转换为中文描述(带"的"字) + */ getPathDescription(path) { + const pathMap = { + 'f': '的父亲', + 'm': '的母亲', + 'h': '的丈夫', + 'w': '的妻子', + 's': '的儿子', + 'd': '的女儿', + 'ob': '的哥哥', + 'lb': '的弟弟', + 'os': '的姐姐', + 'ls': '的妹妹' + }; + let description = ''; + for (const char of path){ + description += pathMap[char] || ''; + } + return description || '本人'; + } +} +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "useRelationship", + ()=>useRelationship +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)"); +; +; +; +function useRelationship() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const [loading, setLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + /** + * 计算两个成员之间的关系(客户端计算) + */ const calculateRelationship = (fromId, toId)=>{ + const members = Object.values(treeData.members); + const calculator = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RelationshipCalculator"](members); + return calculator.getRelationshipDetail(fromId, toId); + }; + /** + * 通过API计算关系(服务端计算) + */ const calculateRelationshipAPI = async (treeId, fromId, toId)=>{ + setLoading(true); + try { + const response = await fetch(`/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`); + if (!response.ok) { + throw new Error('计算关系失败'); + } + const data = await response.json(); + return { + term: data.relationship, + path: data.path, + description: data.description, + success: data.success + }; + } catch (error) { + console.error('计算关系失败:', error); + return null; + } finally{ + setLoading(false); + } + }; + /** + * 获取成员的所有直系亲属 + */ const getDirectRelatives = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return null; + const relatives = { + father: member.fatherId ? treeData.members[member.fatherId] : null, + mother: member.motherId ? treeData.members[member.motherId] : null, + spouses: member.spouseIds?.map((id)=>treeData.members[id]).filter(Boolean) || [], + children: member.childrenIds?.map((id)=>treeData.members[id]).filter(Boolean) || [] + }; + return relatives; + }; + /** + * 获取成员的所有兄弟姐妹 + */ const getSiblings = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return []; + const siblings = new Set(); + // 通过父亲查找 + if (member.fatherId) { + const father = treeData.members[member.fatherId]; + if (father?.childrenIds) { + father.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = treeData.members[member.motherId]; + if (mother?.childrenIds) { + mother.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + return Array.from(siblings).map((id)=>treeData.members[id]).filter(Boolean); + }; + /** + * 获取成员的所有祖先 + */ const getAncestors = (memberId, maxGenerations = 10)=>{ + const ancestors = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + ancestors.push({ + ...member, + generationDiff: generation + }); + } + if (member.fatherId) { + queue.push({ + id: member.fatherId, + generation: generation + 1 + }); + } + if (member.motherId) { + queue.push({ + id: member.motherId, + generation: generation + 1 + }); + } + } + return ancestors; + }; + /** + * 获取成员的所有后代 + */ const getDescendants = (memberId, maxGenerations = 10)=>{ + const descendants = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + descendants.push({ + ...member, + generationDiff: generation + }); + } + if (member.childrenIds) { + member.childrenIds.forEach((childId)=>{ + queue.push({ + id: childId, + generation: generation + 1 + }); + }); + } + } + return descendants; + }; + return { + calculateRelationship, + calculateRelationshipAPI, + getDirectRelatives, + getSiblings, + getAncestors, + getDescendants, + loading + }; +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Select", + ()=>Select, + "SelectContent", + ()=>SelectContent, + "SelectGroup", + ()=>SelectGroup, + "SelectItem", + ()=>SelectItem, + "SelectLabel", + ()=>SelectLabel, + "SelectScrollDownButton", + ()=>SelectScrollDownButton, + "SelectScrollUpButton", + ()=>SelectScrollUpButton, + "SelectSeparator", + ()=>SelectSeparator, + "SelectTrigger", + ()=>SelectTrigger, + "SelectValue", + ()=>SelectValue +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-select@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_0db8806b22e5e8953d2741c4abb73796/node_modules/@radix-ui/react-select/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$up$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronUpIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-up.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function Select({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "select", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function SelectGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "select-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 18, + columnNumber: 10 + }, this); +} +function SelectValue({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Value"], { + "data-slot": "select-value", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 24, + columnNumber: 10 + }, this); +} +function SelectTrigger({ className, size = 'default', children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "select-trigger", + "data-size": size, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Icon"], { + asChild: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__["ChevronDownIcon"], { + className: "size-4 opacity-50" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 47, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 46, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 36, + columnNumber: 5 + }, this); +} +function SelectContent({ className, children, position = 'popper', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "select-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), + position: position, + ...props, + 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"])(SelectScrollUpButton, {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 72, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Viewport"], { + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('p-1', position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1'), + children: children + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 73, + 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"])(SelectScrollDownButton, {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 82, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 61, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 60, + columnNumber: 5 + }, this); +} +function SelectLabel({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "select-label", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground px-2 py-1.5 text-xs', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 93, + columnNumber: 5 + }, this); +} +function SelectItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "select-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className), + ...props, + 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: "absolute right-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 117, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 116, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 115, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemText"], { + children: children + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 120, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 107, + columnNumber: 5 + }, this); +} +function SelectSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "select-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border pointer-events-none -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 130, + columnNumber: 5 + }, this); +} +function SelectScrollUpButton({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ScrollUpButton"], { + "data-slot": "select-scroll-up-button", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex cursor-default items-center justify-center py-1', className), + ...props, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$up$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronUpIcon$3e$__["ChevronUpIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 151, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 143, + columnNumber: 5 + }, this); +} +function SelectScrollDownButton({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$select$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_0db8806b22e5e8953d2741c4abb73796$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$select$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ScrollDownButton"], { + "data-slot": "select-scroll-down-button", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex cursor-default items-center justify-center py-1', className), + ...props, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDownIcon$3e$__["ChevronDownIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 169, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx", + lineNumber: 161, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Badge", + ()=>Badge, + "badgeVariants", + ()=>badgeVariants +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-slot@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-slot/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$class$2d$variance$2d$authority$40$0$2e$7$2e$1$2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +; +; +; +; +const badgeVariants = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$class$2d$variance$2d$authority$40$0$2e$7$2e$1$2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cva"])('inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', { + variants: { + variant: { + default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + destructive: 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground' + } + }, + defaultVariants: { + variant: 'default' + } +}); +function Badge({ className, variant, asChild = false, ...props }) { + const Comp = asChild ? __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Slot"] : 'span'; + 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$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"])(Comp, { + "data-slot": "badge", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])(badgeVariants({ + variant + }), className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx", + lineNumber: 38, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "default", + ()=>RelationshipTestPage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/card.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/select.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$badge$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +function RelationshipTestPage() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { calculateRelationship, getDirectRelatives, getSiblings } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRelationship"])(); + const [fromId, setFromId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(''); + const [toId, setToId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(''); + const [result, setResult] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const members = Object.values(treeData.members); + const handleCalculate = ()=>{ + if (!fromId || !toId) return; + const relationship = calculateRelationship(fromId, toId); + const fromMember = treeData.members[fromId]; + const toMember = treeData.members[toId]; + setResult({ + from: fromMember, + to: toMember, + relationship + }); + }; + 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$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: "min-h-screen flex flex-col bg-background", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 38, + 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"])("main", { + className: "flex-1 container mx-auto px-4 py-8", + 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: "max-w-4xl mx-auto space-y-6", + 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", { + 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"])("h1", { + className: "text-3xl font-bold font-serif mb-2", + children: "家族关系计算器" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 44, + 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"])("p", { + className: "text-muted-foreground", + children: "选择两个家族成员,自动计算他们之间的亲属关系" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 45, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 43, + 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$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Card"], { + 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"])(__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$__["CardHeader"], { + 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"])(__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$__["CardTitle"], { + children: "选择成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 53, + 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$__["CardDescription"], { + children: "请选择要计算关系的两个成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 54, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 52, + 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$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CardContent"], { + className: "space-y-4", + 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: "grid grid-cols-1 md:grid-cols-2 gap-4", + 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: "space-y-2", + 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"])("label", { + className: "text-sm font-medium", + children: "成员A" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 59, + 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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Select"], { + value: fromId, + onValueChange: setFromId, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectTrigger"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectValue"], { + placeholder: "选择成员A" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 62, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 61, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectContent"], { + children: members.map((member)=>/*#__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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: member.id, + children: [ + member.fullName, + " (第", + member.generation, + "世)" + ] + }, member.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 66, + columnNumber: 25 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 64, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 60, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 58, + 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", + 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"])("label", { + className: "text-sm font-medium", + children: "成员B" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 75, + 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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Select"], { + value: toId, + onValueChange: setToId, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectTrigger"], { + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectValue"], { + placeholder: "选择成员B" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 78, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 77, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SelectContent"], { + children: members.map((member)=>/*#__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$select$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SelectItem"], { + value: member.id, + children: [ + member.fullName, + " (第", + member.generation, + "世)" + ] + }, member.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 82, + columnNumber: 25 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 80, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 76, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 74, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 57, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + onClick: handleCalculate, + disabled: !fromId || !toId, + className: "w-full", + children: "计算关系" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 91, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 56, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 51, + columnNumber: 11 + }, this), + result && /*#__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$__["Card"], { + 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"])(__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$__["CardHeader"], { + 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"])(__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$__["CardTitle"], { + children: "计算结果" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 105, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 104, + 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"], { + className: "space-y-4", + 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-4 p-6 bg-muted rounded-lg", + 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: "text-center", + 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: "text-2xl font-bold font-serif mb-1", + children: result.from.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 110, + 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: "text-sm text-muted-foreground", + children: [ + "第", + result.from.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 113, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 109, + 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: "flex flex-col items-center gap-2", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$badge$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Badge"], { + variant: "default", + className: "text-lg px-4 py-2", + children: result.relationship.term + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 119, + columnNumber: 21 + }, this), + result.relationship.path && /*#__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-xs text-muted-foreground", + children: [ + "路径: ", + result.relationship.path + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 123, + columnNumber: 23 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 118, + 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: "text-center", + 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: "text-2xl font-bold font-serif mb-1", + children: result.to.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 130, + 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: "text-sm text-muted-foreground", + children: [ + "第", + result.to.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 133, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 129, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 108, + columnNumber: 17 + }, this), + result.relationship.description && /*#__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: "p-4 bg-blue-50 dark:bg-blue-950 rounded-lg", + 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: "text-sm font-medium mb-1", + children: "关系说明:" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 141, + 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: "text-muted-foreground", + 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"])("strong", { + children: result.from.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 143, + 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$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"])("strong", { + children: result.to.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 143, + columnNumber: 65 + }, 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"])("strong", { + className: "text-primary", + children: result.relationship.term + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 143, + columnNumber: 105 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 142, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 140, + columnNumber: 19 + }, this), + result.relationship.success === false && /*#__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: "p-4 bg-yellow-50 dark:bg-yellow-950 rounded-lg", + 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: "text-sm text-yellow-800 dark:text-yellow-200", + children: [ + "⚠️ ", + result.relationship.error || '无法计算关系' + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 150, + columnNumber: 21 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 149, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 107, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 103, + columnNumber: 13 + }, this), + fromId && /*#__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$__["Card"], { + 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"])(__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$__["CardHeader"], { + 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"])(__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$__["CardTitle"], { + children: [ + treeData.members[fromId]?.fullName, + " 的直系亲属" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 163, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 162, + 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"], { + children: [ + (()=>{ + const relatives = getDirectRelatives(fromId); + if (!relatives) return null; + 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$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: "grid grid-cols-1 md:grid-cols-2 gap-4", + children: [ + relatives.father && /*#__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: "p-3 bg-muted rounded-lg", + 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: "text-sm text-muted-foreground mb-1", + children: "父亲" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 176, + 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: "font-medium", + children: relatives.father.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 177, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 175, + columnNumber: 25 + }, this), + relatives.mother && /*#__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: "p-3 bg-muted rounded-lg", + 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: "text-sm text-muted-foreground mb-1", + children: "母亲" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 182, + 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: "font-medium", + children: relatives.mother.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 183, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 181, + columnNumber: 25 + }, this), + relatives.spouses.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$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: "p-3 bg-muted rounded-lg", + 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: "text-sm text-muted-foreground mb-1", + children: "配偶" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 188, + columnNumber: 27 + }, this), + relatives.spouses.map((spouse)=>/*#__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: "font-medium", + children: spouse.fullName + }, spouse.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 190, + columnNumber: 29 + }, this)) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 187, + columnNumber: 25 + }, this), + relatives.children.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$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: "p-3 bg-muted rounded-lg", + 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: "text-sm text-muted-foreground mb-1", + children: [ + "子女 (", + relatives.children.length, + "人)" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 198, + 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: "space-y-1", + children: [ + relatives.children.slice(0, 3).map((child)=>/*#__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: "font-medium text-sm", + children: child.fullName + }, child.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 203, + columnNumber: 31 + }, this)), + relatives.children.length > 3 && /*#__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-xs text-muted-foreground", + children: [ + "还有 ", + relatives.children.length - 3, + " 人..." + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 208, + columnNumber: 31 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 201, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 197, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 173, + columnNumber: 21 + }, this); + })(), + (()=>{ + const siblings = getSiblings(fromId); + if (siblings.length === 0) return null; + 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$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: "mt-4 p-3 bg-muted rounded-lg", + 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: "text-sm text-muted-foreground mb-2", + children: [ + "兄弟姐妹 (", + siblings.length, + "人)" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 225, + 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$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-wrap gap-2", + children: siblings.map((sibling)=>/*#__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$badge$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Badge"], { + variant: "outline", + children: sibling.fullName + }, sibling.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 230, + columnNumber: 27 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 228, + columnNumber: 23 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 224, + columnNumber: 21 + }, this); + })() + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 167, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 161, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 41, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 40, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", + lineNumber: 37, + columnNumber: 5 + }, this); +} +}), +]; + +//# sourceMappingURL=Documents_go-new_chinese-family-tree_122387b1._.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js.map b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js.map new file mode 100644 index 00000000..a960b727 --- /dev/null +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_122387b1._.js.map @@ -0,0 +1,13 @@ +{ + "version": 3, + "sources": [], + "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 } 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 {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": 1187, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts"],"sourcesContent":["import relationship from 'relationship.js'\nimport type { FamilyMember } from '@/types/family'\n\n/**\n * 家族关系计算器\n * 使用 relationship.js 库计算中文亲属关系\n */\nexport class RelationshipCalculator {\n private members: Map\n\n constructor(members: FamilyMember[]) {\n this.members = new Map(members.map(m => [m.id, m]))\n }\n\n /**\n * 计算两个成员之间的关系\n * @param fromId 起始成员ID(成员A)\n * @param toId 目标成员ID(成员B)\n * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX)\n */\n getRelationship(fromId: string, toId: string): RelationshipResult {\n if (fromId === toId) {\n return {\n term: '本人',\n path: '',\n success: true\n }\n }\n\n const fromMember = this.members.get(fromId)\n const toMember = this.members.get(toId)\n\n if (!fromMember || !toMember) {\n return {\n term: '未知',\n path: '',\n success: false,\n error: '成员不存在'\n }\n }\n\n // 构建关系路径(从 fromId 到 toId)\n const path = this.buildRelationPath(fromId, toId)\n \n if (!path) {\n return {\n term: '无血缘关系',\n path: '',\n success: false\n }\n }\n\n // 将路径转换为中文\n const chinesePath = this.pathToChineseText(path)\n \n // 使用 relationship.js 计算关系\n try {\n // 获取fromId成员的性别(从谁的角度看关系)\n const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1\n \n // 计算关系(toId 对 fromId 的称谓)\n const result = relationship({\n text: chinesePath,\n target: '',\n sex: fromMemberGender, // 传入fromId的性别(从谁的角度看)\n reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓\n })\n \n const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'\n \n return {\n term,\n path: chinesePath,\n success: true\n }\n } catch (error) {\n return {\n term: '亲戚',\n path: chinesePath,\n success: true\n }\n }\n }\n\n /**\n * 构建关系路径字符串\n * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子\n * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹\n */\n private buildRelationPath(fromId: string, toId: string): string | null {\n // 使用BFS查找最短路径\n const queue: Array<{ id: string; path: string }> = [{ id: fromId, path: '' }]\n const visited = new Set()\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n return path\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n queue.push({ id: member.fatherId, path: path + 'f' })\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n queue.push({ id: member.motherId, path: path + 'm' })\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const spousePath = member.gender === 'MALE' ? 'w' : 'h'\n queue.push({ id: spouseId, path: path + spousePath })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const childPath = child.gender === 'MALE' ? 's' : 'd'\n queue.push({ id: childId, path: path + childPath })\n }\n }\n }\n }\n\n // 兄弟姐妹(通过父母查找)\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹\n const siblingPath = this.getSiblingPath(member, sibling)\n queue.push({ id: siblingId, path: path + siblingPath })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹\n */\n private getSiblings(memberId: string): string[] {\n const member = this.members.get(memberId)\n if (!member) return []\n\n const siblings: string[] = []\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = this.members.get(member.fatherId)\n if (father?.childrenIds) {\n siblings.push(...father.childrenIds.filter(id => id !== memberId))\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = this.members.get(member.motherId)\n if (mother?.childrenIds) {\n for (const childId of mother.childrenIds) {\n if (childId !== memberId && !siblings.includes(childId)) {\n siblings.push(childId)\n }\n }\n }\n }\n\n return siblings\n }\n\n /**\n * 获取兄弟姐妹关系路径\n */\n private getSiblingPath(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n // 男性:哥哥(ob) 或 弟弟(lb)\n return toAge > fromAge ? 'ob' : 'lb'\n } else {\n // 女性:姐姐(os) 或 妹妹(ls)\n return toAge > fromAge ? 'os' : 'ls'\n }\n }\n\n /**\n * 获取年龄(用于比较)\n */\n private getAge(member: FamilyMember): number {\n if (!member.birthDate) return 0\n const birthYear = new Date(member.birthDate).getFullYear()\n return new Date().getFullYear() - birthYear\n }\n\n /**\n * 获取关系的详细说明\n */\n getRelationshipDetail(fromId: string, toId: string): RelationshipDetail {\n const result = this.getRelationship(fromId, toId)\n \n if (!result.success) {\n return {\n ...result,\n description: result.error || '无法计算关系'\n }\n }\n\n // 构建带人名的路径(从 fromId 到 toId)\n const pathWithNames = this.buildPathWithNames(fromId, toId)\n\n // 只返回关系称谓,不包含完整句子\n return {\n ...result,\n path: pathWithNames || result.path,\n description: result.term\n }\n }\n\n /**\n * 构建带人名的路径描述\n * @param fromId 起始ID(查询的起点)\n * @param toId 目标ID(查询的终点)\n */\n private buildPathWithNames(fromId: string, toId: string): string | null {\n const queue: Array<{ id: string; path: Array<{name: string, relation: string}> }> = [\n { id: fromId, path: [] }\n ]\n const visited = new Set()\n \n // 获取起始成员名字\n const startMember = this.members.get(fromId)\n const startName = startMember?.fullName || '未知'\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n // 构建路径字符串:从起点到终点\n if (path.length === 0) return '本人'\n \n // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ...\n const pathStr = path.map(p => `${p.relation}(${p.name})`).join(' → ')\n return `${startName} → ${pathStr}`\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n const father = this.members.get(member.fatherId)\n if (father) {\n queue.push({\n id: member.fatherId,\n path: [...path, { name: father.fullName, relation: '父亲' }]\n })\n }\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n const mother = this.members.get(member.motherId)\n if (mother) {\n queue.push({\n id: member.motherId,\n path: [...path, { name: mother.fullName, relation: '母亲' }]\n })\n }\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const relation = member.gender === 'MALE' ? '妻子' : '丈夫'\n queue.push({\n id: spouseId,\n path: [...path, { name: spouse.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const relation = child.gender === 'MALE' ? '儿子' : '女儿'\n queue.push({\n id: childId,\n path: [...path, { name: child.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 兄弟姐妹\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n const siblingPath = this.getSiblingRelationName(member, sibling)\n queue.push({\n id: siblingId,\n path: [...path, { name: sibling.fullName, relation: siblingPath }]\n })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹关系名称\n */\n private getSiblingRelationName(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n return toAge > fromAge ? '哥哥' : '弟弟'\n } else {\n return toAge > fromAge ? '姐姐' : '妹妹'\n }\n }\n\n /**\n * 计算路径长度(关系代数)\n */\n private calculatePathLength(path: string): number {\n let length = 0\n let i = 0\n \n while (i < path.length) {\n // 两字符的关系\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (['ob', 'lb', 'os', 'ls'].includes(twoChar)) {\n length++\n i += 2\n continue\n }\n }\n \n // 单字符的关系\n length++\n i++\n }\n \n return length\n }\n\n /**\n * 将符号路径转换为中文文本\n * 例如:'fm' -> '父亲的母亲'\n */\n private pathToChineseText(path: string): string {\n const pathMap: Record = {\n 'f': '父亲',\n 'm': '母亲',\n 'h': '丈夫',\n 'w': '妻子',\n 's': '儿子',\n 'd': '女儿',\n 'ob': '哥哥',\n 'lb': '弟弟',\n 'os': '姐姐',\n 'ls': '妹妹'\n }\n\n const parts: string[] = []\n let i = 0\n \n while (i < path.length) {\n // 处理两字符的关系(如 ob, lb, os, ls)\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (pathMap[twoChar]) {\n parts.push(pathMap[twoChar])\n i += 2\n continue\n }\n }\n \n // 处理单字符的关系\n const oneChar = path[i]\n if (pathMap[oneChar]) {\n parts.push(pathMap[oneChar])\n }\n i++\n }\n\n return parts.join('的')\n }\n\n /**\n * 将路径转换为中文描述(带\"的\"字)\n */\n private getPathDescription(path: string): string {\n const pathMap: Record = {\n 'f': '的父亲',\n 'm': '的母亲',\n 'h': '的丈夫',\n 'w': '的妻子',\n 's': '的儿子',\n 'd': '的女儿',\n 'ob': '的哥哥',\n 'lb': '的弟弟',\n 'os': '的姐姐',\n 'ls': '的妹妹'\n }\n\n let description = ''\n for (const char of path) {\n description += pathMap[char] || ''\n }\n\n return description || '本人'\n }\n}\n\nexport interface RelationshipResult {\n term: string // 关系称谓(如:父亲、堂兄弟)\n path: string // 关系路径(如:f, fbs)\n success: boolean // 是否成功计算\n error?: string // 错误信息\n}\n\nexport interface RelationshipDetail extends RelationshipResult {\n description: string // 关系描述(如:父亲的哥哥的儿子)\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1638, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts"],"sourcesContent":["import { useState } from 'react'\nimport { useFamily } from '@/context/family-context'\nimport { RelationshipCalculator, type RelationshipDetail } from '@/lib/relationship-calculator'\n\n/**\n * 使用家族关系计算的Hook\n */\nexport function useRelationship() {\n const { treeData } = useFamily()\n const [loading, setLoading] = useState(false)\n\n /**\n * 计算两个成员之间的关系(客户端计算)\n */\n const calculateRelationship = (fromId: string, toId: string): RelationshipDetail => {\n const members = Object.values(treeData.members)\n const calculator = new RelationshipCalculator(members)\n return calculator.getRelationshipDetail(fromId, toId)\n }\n\n /**\n * 通过API计算关系(服务端计算)\n */\n const calculateRelationshipAPI = async (\n treeId: string,\n fromId: string,\n toId: string\n ): Promise => {\n setLoading(true)\n try {\n const response = await fetch(\n `/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`\n )\n \n if (!response.ok) {\n throw new Error('计算关系失败')\n }\n\n const data = await response.json()\n return {\n term: data.relationship,\n path: data.path,\n description: data.description,\n success: data.success\n }\n } catch (error) {\n console.error('计算关系失败:', error)\n return null\n } finally {\n setLoading(false)\n }\n }\n\n /**\n * 获取成员的所有直系亲属\n */\n const getDirectRelatives = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return null\n\n const relatives = {\n father: member.fatherId ? treeData.members[member.fatherId] : null,\n mother: member.motherId ? treeData.members[member.motherId] : null,\n spouses: member.spouseIds?.map(id => treeData.members[id]).filter(Boolean) || [],\n children: member.childrenIds?.map(id => treeData.members[id]).filter(Boolean) || []\n }\n\n return relatives\n }\n\n /**\n * 获取成员的所有兄弟姐妹\n */\n const getSiblings = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return []\n\n const siblings = new Set()\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = treeData.members[member.fatherId]\n if (father?.childrenIds) {\n father.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = treeData.members[member.motherId]\n if (mother?.childrenIds) {\n mother.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n return Array.from(siblings).map(id => treeData.members[id]).filter(Boolean)\n }\n\n /**\n * 获取成员的所有祖先\n */\n const getAncestors = (memberId: string, maxGenerations: number = 10) => {\n const ancestors: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n ancestors.push({ ...member, generationDiff: generation })\n }\n\n if (member.fatherId) {\n queue.push({ id: member.fatherId, generation: generation + 1 })\n }\n if (member.motherId) {\n queue.push({ id: member.motherId, generation: generation + 1 })\n }\n }\n\n return ancestors\n }\n\n /**\n * 获取成员的所有后代\n */\n const getDescendants = (memberId: string, maxGenerations: number = 10) => {\n const descendants: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n descendants.push({ ...member, generationDiff: generation })\n }\n\n if (member.childrenIds) {\n member.childrenIds.forEach(childId => {\n queue.push({ id: childId, generation: generation + 1 })\n })\n }\n }\n\n return descendants\n }\n\n return {\n calculateRelationship,\n calculateRelationshipAPI,\n getDirectRelatives,\n getSiblings,\n getAncestors,\n getDescendants,\n loading\n }\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1806, "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": 2039, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/badge.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> &\n VariantProps & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span'\n\n return (\n \n )\n}\n\nexport { Badge, badgeVariants }\n"],"names":[],"mappings":";;;;;;;AACA;AACA;AAEA;;;;;AAEA,MAAM,gBAAgB,IAAA,ySAAG,EACvB,kZACA;IACE,UAAU;QACR,SAAS;YACP,SACE;YACF,WACE;YACF,aACE;YACF,SACE;QACJ;IACF;IACA,iBAAiB;QACf,SAAS;IACX;AACF;AAGF,SAAS,MAAM,EACb,SAAS,EACT,OAAO,EACP,UAAU,KAAK,EACf,GAAG,OAEuD;IAC1D,MAAM,OAAO,UAAU,mWAAI,GAAG;IAE9B,qBACE,oaAAC;QACC,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,cAAc;YAAE;QAAQ,IAAI;QACzC,GAAG,KAAK;;;;;;AAGf"}}, + {"offset": {"line": 2085, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState } from 'react'\nimport { SiteHeader } from '@/components/site-header'\nimport { useFamily } from '@/context/family-context'\nimport { useRelationship } from '@/hooks/use-relationship'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\n\nexport default function RelationshipTestPage() {\n const { treeData } = useFamily()\n const { calculateRelationship, getDirectRelatives, getSiblings } = useRelationship()\n \n const [fromId, setFromId] = useState('')\n const [toId, setToId] = useState('')\n const [result, setResult] = useState(null)\n\n const members = Object.values(treeData.members)\n\n const handleCalculate = () => {\n if (!fromId || !toId) return\n \n const relationship = calculateRelationship(fromId, toId)\n const fromMember = treeData.members[fromId]\n const toMember = treeData.members[toId]\n \n setResult({\n from: fromMember,\n to: toMember,\n relationship\n })\n }\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 {result && (\n \n \n 计算结果\n \n \n
\n
\n
\n {result.from.fullName}\n
\n
\n 第{result.from.generation}世\n
\n
\n\n
\n \n {result.relationship.term}\n \n {result.relationship.path && (\n \n 路径: {result.relationship.path}\n \n )}\n
\n\n
\n
\n {result.to.fullName}\n
\n
\n 第{result.to.generation}世\n
\n
\n
\n\n {result.relationship.description && (\n
\n
关系说明:
\n
\n {result.from.fullName}{result.to.fullName}{result.relationship.term}\n
\n
\n )}\n\n {result.relationship.success === false && (\n
\n
\n ⚠️ {result.relationship.error || '无法计算关系'}\n
\n
\n )}\n
\n
\n )}\n\n {/* 快速查询示例 */}\n {fromId && (\n \n \n \n {treeData.members[fromId]?.fullName} 的直系亲属\n \n \n \n {(() => {\n const relatives = getDirectRelatives(fromId)\n if (!relatives) return null\n\n return (\n
\n {relatives.father && (\n
\n
父亲
\n
{relatives.father.fullName}
\n
\n )}\n {relatives.mother && (\n
\n
母亲
\n
{relatives.mother.fullName}
\n
\n )}\n {relatives.spouses.length > 0 && (\n
\n
配偶
\n {relatives.spouses.map((spouse: any) => (\n
\n {spouse.fullName}\n
\n ))}\n
\n )}\n {relatives.children.length > 0 && (\n
\n
\n 子女 ({relatives.children.length}人)\n
\n
\n {relatives.children.slice(0, 3).map((child: any) => (\n
\n {child.fullName}\n
\n ))}\n {relatives.children.length > 3 && (\n
\n 还有 {relatives.children.length - 3} 人...\n
\n )}\n
\n
\n )}\n
\n )\n })()}\n\n {(() => {\n const siblings = getSiblings(fromId)\n if (siblings.length === 0) return null\n\n return (\n
\n
\n 兄弟姐妹 ({siblings.length}人)\n
\n
\n {siblings.map((sibling: any) => (\n \n {sibling.fullName}\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/[root-of-the-server]__1c65776d._.js b/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js index c1b279ab..434d5b44 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js @@ -2333,7 +2333,7 @@ function TreePage() { 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 188, + lineNumber: 191, 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", { @@ -2341,13 +2341,13 @@ function TreePage() { children: "暂无家族树数据" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 189, + lineNumber: 192, columnNumber: 9 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 187, + lineNumber: 190, columnNumber: 7 }, this); } @@ -2356,7 +2356,7 @@ function TreePage() { 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 196, + lineNumber: 199, 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", { @@ -2373,7 +2373,7 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 203, + lineNumber: 206, columnNumber: 15 }, this), viewMode === 'traditional' ? '传统视图' : 'D3家谱图', @@ -2381,18 +2381,18 @@ function TreePage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 205, + lineNumber: 208, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 202, + lineNumber: 205, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 201, + lineNumber: 204, 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { @@ -2413,7 +2413,7 @@ function TreePage() { children: "传统家谱视图" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 218, + lineNumber: 221, columnNumber: 17 }, this), viewMode === 'traditional' && /*#__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", { @@ -2421,18 +2421,18 @@ function TreePage() { children: "✓" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 219, + lineNumber: 222, columnNumber: 48 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 217, + lineNumber: 220, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 209, + lineNumber: 212, 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$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { @@ -2449,7 +2449,7 @@ function TreePage() { children: "D3 家谱图" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 231, + lineNumber: 234, columnNumber: 17 }, this), viewMode === 'd3-org-chart' && /*#__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", { @@ -2457,35 +2457,35 @@ function TreePage() { children: "✓" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 232, + lineNumber: 235, columnNumber: 49 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 230, + lineNumber: 233, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 222, + lineNumber: 225, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 208, + lineNumber: 211, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 200, + lineNumber: 203, columnNumber: 9 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 199, + lineNumber: 202, columnNumber: 7 }, this), viewMode === 'traditional' ? /*#__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", { @@ -2502,12 +2502,12 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 244, + lineNumber: 247, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 243, + lineNumber: 246, 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { @@ -2518,12 +2518,12 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 247, + lineNumber: 250, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 246, + lineNumber: 249, 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { @@ -2537,19 +2537,19 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 250, + lineNumber: 253, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 249, + lineNumber: 252, 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"])("div", { className: "h-px bg-border my-1" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 252, + lineNumber: 255, 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { @@ -2561,18 +2561,18 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 254, + lineNumber: 257, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 253, + lineNumber: 256, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 242, + lineNumber: 245, 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", { @@ -2593,23 +2593,23 @@ function TreePage() { rootId: treeData.rootId }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 275, + lineNumber: 278, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 267, + lineNumber: 270, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 259, + lineNumber: 262, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 240, + lineNumber: 243, 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", { className: "flex-1 relative", @@ -2624,23 +2624,6 @@ function TreePage() { title: "展开全部", 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__["ZoomIn"], { className: "h-4 w-4" - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 284, - columnNumber: 15 - }, this) - }, void 0, false, { - fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 283, - 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { - variant: "outline", - size: "icon", - onClick: ()=>d3ChartRef.current?.collapseAll(), - title: "折叠全部", - 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { - className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", lineNumber: 287, @@ -2654,9 +2637,9 @@ function TreePage() { /*#__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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { variant: "outline", size: "icon", - onClick: ()=>d3ChartRef.current?.fitView(), - title: "适应视图", - 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + onClick: ()=>d3ChartRef.current?.collapseAll(), + title: "折叠全部", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", @@ -2668,11 +2651,28 @@ function TreePage() { lineNumber: 289, 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.fitView(), + title: "适应视图", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 293, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 292, + 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"])("div", { className: "h-px bg-border my-1" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 292, + lineNumber: 295, 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { @@ -2684,18 +2684,18 @@ function TreePage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 294, + lineNumber: 297, columnNumber: 15 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 293, + lineNumber: 296, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 282, + lineNumber: 285, 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", { @@ -2707,24 +2707,24 @@ function TreePage() { onMemberClick: (id)=>router.push(`/members/${id}`) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 299, + lineNumber: 302, columnNumber: 13 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 298, + lineNumber: 301, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 280, + lineNumber: 283, columnNumber: 9 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", - lineNumber: 195, + lineNumber: 198, columnNumber: 5 }, this); } diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js.map b/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js.map index 73d4823a..e180ee3a 100644 --- a/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js.map +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__1c65776d._.js.map @@ -10,5 +10,5 @@ {"offset": {"line": 1281, "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 isRoot?: boolean\n onSelect?: (member: FamilyMember) => void\n isHighlighted?: 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 }: { member: FamilyMember; isRoot?: boolean; isSpouse?: boolean; onSelect?: (member: FamilyMember) => void; isHighlighted?: 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, isRoot, onSelect, isHighlighted }: FamilyNodeProps) {\n if (!spouse) {\n return \n }\n \n // 有配偶时,并排显示\n return (\n
\n \n \n \n
\n )\n}\n"],"names":[],"mappings":";;;;;AAGA;AACA;AACA;AAAA;AAAA;AALA;;;;;AAeA,iBAAiB;AACjB,SAAS,WAAW,UAAmB;IACrC,IAAI,CAAC,YAAY,OAAO;IACxB,MAAM,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE;IACrC,OAAO;AACT;AAEA,OAAO;AACP,SAAS,aAAa,SAAkB,EAAE,SAAkB;IAC1D,IAAI,CAAC,WAAW,OAAO;IAEvB,MAAM,QAAQ,IAAI,KAAK;IACvB,MAAM,MAAM,YAAY,IAAI,KAAK,aAAa,IAAI;IAElD,IAAI,MAAM,IAAI,WAAW,KAAK,MAAM,WAAW;IAC/C,MAAM,YAAY,IAAI,QAAQ,KAAK,MAAM,QAAQ;IAEjD,IAAI,YAAY,KAAM,cAAc,KAAK,IAAI,OAAO,KAAK,MAAM,OAAO,IAAK;QACzE;IACF;IAEA,OAAO;AACT;AAEA,WAAW;AACX,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAsI;IAC3M,MAAM,EAAE,WAAW,aAAa,EAAE,GAAG,IAAA,wMAAc,EAAC,QAAQ;IAE5D,MAAM,YAAY,WAAW,OAAO,SAAS;IAC7C,MAAM,YAAY,WAAW,OAAO,SAAS;IAC7C,MAAM,MAAM,aAAa,OAAO,SAAS,EAAE,OAAO,SAAS;IAE3D,MAAM,WAAW,YACb,YACE,GAAG,UAAU,CAAC,EAAE,WAAW,GAC3B,GAAG,UAAU,CAAC,CAAC,GACjB;IAEJ,MAAM,UAAU,QAAQ,OACpB,OAAO,SAAS,GACd,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GACX,GAAG,IAAI,CAAC,CAAC,GACX;IAEJ,qBACE,oaAAC;QACC,WAAW,IAAA,yKAAE,EACX,0IACA,gBACI,4HACA,SACE,yCACA,WACE,wDACA;QAEV,SAAS,IAAM,WAAW;;0BAE1B,oaAAC;gBAAI,WAAU;;oBACZ,OAAO,UAAU;oBAAC;;;;;;;0BAGrB,oaAAC;gBAAI,WAAU;0BACZ,8BACC,oaAAC;oBACC,KAAK;oBACL,KAAK,OAAO,QAAQ;oBACpB,WAAU;;;;;2BAGZ,OAAO,MAAM,KAAK,yBAChB,oaAAC,8XAAe;oBAAC,WAAU;;;;;yCAE3B,oaAAC,2WAAU;oBAAC,WAAU;;;;;;;;;;;0BAK5B,oaAAC;gBAAI,WAAU;;kCACb,oaAAC;wBAAI,WAAU;;4BAAsD,OAAO,OAAO;4BAAC;4BAAE,OAAO,SAAS;;;;;;;oBACrG,OAAO,YAAY,kBAClB,oaAAC;wBAAI,WAAU;;4BAA2C;4BAAG,OAAO,YAAY;;;;;;;oBAEjF,0BACC,oaAAC;wBAAI,WAAU;kCACZ;;;;;;oBAGJ,yBACC,oaAAC;wBAAI,WAAU;kCACZ;;;;;;oBAGJ,OAAO,KAAK,kBACX,oaAAC;wBAAI,WAAU;;4BAAyD;4BAClE,OAAO,KAAK;;;;;;;;;;;;;YAKrB,OAAO,SAAS,kBACf,oaAAC;gBAAI,WAAU;;;;;;;;;;;;AAIvB;AAEO,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAmB;IAC7F,IAAI,CAAC,QAAQ;QACX,qBAAO,oaAAC;YAAW,QAAQ;YAAQ,QAAQ;YAAQ,UAAU;YAAU,eAAe;;;;;;IACxF;IAEA,YAAY;IACZ,qBACE,oaAAC;QAAI,WAAU;;0BACb,oaAAC;gBAAW,QAAQ;gBAAQ,QAAQ;gBAAQ,UAAU;gBAAU,eAAe;;;;;;0BAC/E,oaAAC,wVAAK;gBAAC,WAAU;;;;;;0BACjB,oaAAC;gBAAW,QAAQ;gBAAQ,UAAU;gBAAM,UAAU;;;;;;;;;;;;AAG5D"}}, {"offset": {"line": 1492, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx"],"sourcesContent":["\"use client\"\nimport type { FamilyMember } from \"@/types/family\"\nimport { FamilyNode } from \"./family-node\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useEffect, useRef, useState, useCallback } from \"react\"\nimport { useRouter } from \"next/navigation\"\n\ninterface TreeLayoutProps {\n rootId: string\n onSelectMember?: (member: FamilyMember) => void\n}\n\ninterface Connection {\n from: { x: number; y: number }\n to: { x: number; y: number }\n type: 'vertical' | 'horizontal'\n}\n\nexport function TreeLayout({ rootId, onSelectMember }: TreeLayoutProps) {\n const { getMember, treeData, highlightedMemberId } = useFamily()\n const root = getMember(rootId)\n const router = useRouter()\n const containerRef = useRef(null)\n const [connections, setConnections] = useState([])\n const nodeRefs = useRef>(new Map())\n\n // 节点间距配置\n const HORIZONTAL_GAP = 32 // 2rem = 32px\n const VERTICAL_GAP = 48 // 3rem = 48px\n const CONNECTOR_HEIGHT = 48 // 连接线垂直高度\n \n // 处理节点点击\n const handleNodeClick = useCallback((member: FamilyMember) => {\n router.push(`/members/${member.id}`)\n }, [router])\n\n // 计算所有连线位置\n const calculateConnections = useCallback(() => {\n const newConnections: Connection[] = []\n const containerRect = containerRef.current?.getBoundingClientRect()\n if (!containerRect) return\n\n // 检查是否有足够的节点已注册\n if (nodeRefs.current.size === 0) return\n\n nodeRefs.current.forEach((nodeElement, nodeId) => {\n const member = getMember(nodeId)\n if (!member || !member.childrenIds || member.childrenIds.length === 0) return\n\n const parentRect = nodeElement.getBoundingClientRect()\n const parentCenterX = parentRect.left + parentRect.width / 2 - containerRect.left\n const parentBottomY = parentRect.bottom - containerRect.top\n\n // 父节点到水平线的垂直连线\n const verticalLineY = parentBottomY + CONNECTOR_HEIGHT / 2\n newConnections.push({\n from: { x: parentCenterX, y: parentBottomY },\n to: { x: parentCenterX, y: verticalLineY },\n type: 'vertical'\n })\n\n // 获取所有子节点的位置\n const childPositions = member.childrenIds\n .map(childId => {\n const childElement = nodeRefs.current.get(childId)\n if (!childElement) return null\n const childRect = childElement.getBoundingClientRect()\n return {\n id: childId,\n centerX: childRect.left + childRect.width / 2 - containerRect.left,\n topY: childRect.top - containerRect.top\n }\n })\n .filter(Boolean) as Array<{ id: string; centerX: number; topY: number }>\n\n if (childPositions.length === 0) return\n\n // 如果有多个子节点,绘制水平连线\n if (childPositions.length > 1) {\n const leftmostX = Math.min(...childPositions.map(p => p.centerX))\n const rightmostX = Math.max(...childPositions.map(p => p.centerX))\n \n newConnections.push({\n from: { x: leftmostX, y: verticalLineY },\n to: { x: rightmostX, y: verticalLineY },\n type: 'horizontal'\n })\n }\n\n // 每个子节点的垂直连线\n childPositions.forEach(child => {\n newConnections.push({\n from: { x: child.centerX, y: verticalLineY },\n to: { x: child.centerX, y: child.topY },\n type: 'vertical'\n })\n })\n })\n\n setConnections(newConnections)\n }, [getMember])\n\n useEffect(() => {\n // 多次尝试计算,确保 DOM 完全渲染\n const timers: NodeJS.Timeout[] = []\n timers.push(setTimeout(calculateConnections, 50))\n timers.push(setTimeout(calculateConnections, 150))\n timers.push(setTimeout(calculateConnections, 300))\n timers.push(setTimeout(calculateConnections, 500))\n \n // 监听窗口大小变化\n window.addEventListener('resize', calculateConnections)\n \n return () => {\n timers.forEach(timer => clearTimeout(timer))\n window.removeEventListener('resize', calculateConnections)\n }\n }, [calculateConnections, treeData])\n\n if (!root) return null\n\n // 递归渲染树节点\n const TreeNode = ({ memberId, isRoot = false }: { memberId: string; isRoot?: boolean }) => {\n const member = getMember(memberId)\n if (!member) return null\n\n const hasChildren = member.childrenIds && member.childrenIds.length > 0\n \n // 获取配偶(取第一个配偶)\n const spouse = member.spouseIds && member.spouseIds.length > 0 \n ? getMember(member.spouseIds[0]) \n : undefined\n\n return (\n
\n {/* 节点本身 */}\n
{\n if (el) {\n nodeRefs.current.set(memberId, el)\n } else {\n nodeRefs.current.delete(memberId)\n }\n }}\n className=\"relative z-10\"\n >\n \n
\n\n {/* 子节点 */}\n {hasChildren && (\n
\n {member.childrenIds.map((childId) => (\n \n ))}\n
\n )}\n
\n )\n }\n\n return (\n
\n
\n {/* 连线层 - 使用 div 绘制 */}\n
\n {connections.map((conn, index) => {\n const isHorizontal = conn.type === 'horizontal'\n // 使用 1px 但通过 transform scale 缩小来实现细线\n const width = isHorizontal ? Math.abs(conn.to.x - conn.from.x) : 1\n const height = isHorizontal ? 1 : Math.abs(conn.to.y - conn.from.y)\n const left = Math.min(conn.from.x, conn.to.x)\n const top = Math.min(conn.from.y, conn.to.y)\n \n // 跳过无效的连线(宽度或高度为0)\n if (width <= 0 || height <= 0) return null\n \n return (\n \n )\n })}\n
\n\n {/* 树节点层 */}\n
\n \n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1774, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState, forwardRef, useImperativeHandle } from \"react\"\nimport * as d3 from \"d3\"\n// @ts-ignore - d3-org-chart没有TypeScript类型定义\nimport { OrgChart } from \"d3-org-chart\"\nimport { Download, FileText } from \"lucide-react\"\nimport type { FamilyMember } from \"@/types/family\"\nimport jsPDF from \"jspdf\"\nimport { db } from \"@/lib/db\"\n\ninterface D3OrgChartFlowProps {\n members: Record\n rootId: string\n onMemberClick?: (memberId: string) => void\n onExport?: () => void\n}\n\nexport interface D3OrgChartRef {\n exportPNG: () => void\n exportPDF: () => void\n expandAll: () => void\n collapseAll: () => void\n fitView: () => void\n}\n\ninterface ChartNode {\n id: string\n parentId: string | null\n name: string\n generation: string\n birthYear: string\n deathYear: string\n birthPlace: string\n gender: string\n avatarImageId: string | null | undefined\n spouseName: string\n spouseId: string | null\n hasChildren: boolean\n ageText: string\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\nexport const D3OrgChartFlow = forwardRef(\n ({ members, rootId, onMemberClick, onExport }, ref) => {\n const chartRef = useRef(null)\n const chartInstanceRef = useRef(null)\n const [isReady, setIsReady] = useState(false)\n const [avatarCache, setAvatarCache] = useState>(new Map())\n\n // 转换数据格式\n const convertToChartData = (): ChartNode[] => {\n const chartNodes: ChartNode[] = []\n \n // 首先找到根节点(没有父节点的节点)\n const rootMember = members[rootId]\n if (!rootMember) return []\n \n // 使用BFS遍历,确保只包含从rootId开始的树\n const visited = new Set()\n const queue: string[] = [rootId]\n \n while (queue.length > 0) {\n const currentId = queue.shift()!\n if (visited.has(currentId)) continue\n \n visited.add(currentId)\n const member = members[currentId]\n if (!member) continue\n \n // 获取配偶信息,确保配偶存在于members中\n let spouse = null\n if (member.spouseIds?.[0] && members[member.spouseIds[0]]) {\n spouse = members[member.spouseIds[0]]\n }\n \n // 确定父节点ID - 只有根节点的parentId为null\n let parentId: string | null = null\n if (currentId !== rootId) {\n // 根据姓氏判断主线,优先选择同姓的父母\n const father = member.fatherId ? members[member.fatherId] : null\n const mother = member.motherId ? members[member.motherId] : null\n \n // 判断父母中谁是家族主线(同姓)\n const isFatherMainLine = father && member.surname === father.surname\n const isMotherMainLine = mother && member.surname === mother.surname\n \n if (isFatherMainLine) {\n parentId = member.fatherId || null\n } else if (isMotherMainLine) {\n parentId = member.motherId || null\n } else if (father) {\n // 如果都不同姓,优先选择父亲\n parentId = member.fatherId || null\n } else if (mother) {\n parentId = member.motherId || null\n }\n }\n \n // 计算年龄文本\n const age = calculateAge(member.birthDate, member.deathDate)\n const ageText = age !== null\n ? member.deathDate\n ? `享年${age}岁`\n : `${age}岁`\n : ''\n \n chartNodes.push({\n id: member.id,\n parentId: parentId,\n name: member.fullName,\n generation: `第${member.generation}世`,\n birthYear: member.birthDate ? new Date(member.birthDate).getFullYear().toString() : '',\n deathYear: member.deathDate ? new Date(member.deathDate).getFullYear().toString() : '',\n birthPlace: member.birthPlace || '',\n gender: member.gender === 'MALE' ? '男' : '女',\n avatarImageId: member.avatarImageId,\n spouseName: spouse?.fullName || '',\n spouseId: spouse?.id || null,\n hasChildren: Object.values(members).some(m => m.fatherId === member.id || m.motherId === member.id),\n ageText: ageText\n })\n \n // 添加子节点到队列\n Object.values(members).forEach(m => {\n if ((m.fatherId === currentId || m.motherId === currentId) && !visited.has(m.id)) {\n queue.push(m.id)\n }\n })\n }\n \n return chartNodes\n }\n\n // 加载所有成员的头像\n useEffect(() => {\n const loadAvatars = async () => {\n const cache = new Map()\n \n for (const member of Object.values(members)) {\n if (member.avatarImageId) {\n try {\n const image = await db.images.get(member.avatarImageId)\n if (image) {\n const url = URL.createObjectURL(image.blob)\n cache.set(member.avatarImageId, url)\n }\n } catch (error) {\n console.error(`Failed to load avatar for ${member.fullName}:`, error)\n }\n }\n }\n \n setAvatarCache(cache)\n }\n \n loadAvatars()\n \n // 清理函数\n return () => {\n avatarCache.forEach(url => URL.revokeObjectURL(url))\n }\n }, [members])\n\n useEffect(() => {\n if (!chartRef.current || !rootId) return\n\n // 清理旧的图表\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n\n const data = convertToChartData()\n \n // 初始化图表\n const chart = new OrgChart()\n .container(chartRef.current)\n .data(data)\n .nodeWidth(() => 160)\n .nodeHeight(() => 120)\n .childrenMargin(() => 50)\n .compactMarginBetween(() => 35)\n .compactMarginPair(() => 35)\n .neighbourMargin(() => 35)\n .siblingsMargin(() => 35)\n .linkUpdate(function (d: any, i: any, arr: any) {\n // 加深连线颜色\n d3.select(arr[i])\n .attr('stroke', '#475569')\n .attr('stroke-width', 2.5)\n })\n .buttonContent(({ node }: any) => {\n return `
${node.children ? `` : ``} ${node.data._directSubordinates || 0}
`\n })\n .nodeContent((d: any) => {\n const node = d.data\n const color = node.gender === '男' ? '#3b82f6' : '#ec4899'\n const bgColor = node.gender === '男' ? '#dbeafe' : '#fce7f3'\n \n // 获取头像URL\n const avatarUrl = node.avatarImageId ? avatarCache.get(node.avatarImageId) : null\n \n return `\n
\n
\n
\n ${avatarUrl \n ? `\"${node.name}\"`\n : node.gender === '女'\n ? ``\n : ``\n }\n
\n
\n
\n ${node.name}\n
\n
\n ${node.generation}\n
\n
\n
\n \n
\n ${node.birthYear ? `
\n ${node.birthYear}${node.deathYear ? ` - ${node.deathYear}` : ''}\n ${node.ageText ? `${node.ageText}` : ''}\n
` : ''}\n ${node.birthPlace ? `
\n ${node.birthPlace}\n
` : ''}\n
\n \n ${node.spouseName && node.spouseId ? `\n
\n 配偶: ${node.spouseName}\n
\n ` : ''}\n \n ${node.deathYear ? `\n
\n ` : ''}\n
\n `\n })\n .onNodeClick((d: any) => {\n if (onMemberClick && d) {\n // d3-org-chart传递的是节点数据对象,需要提取id\n const nodeId = typeof d === 'string' ? d : (d.data?.id || d.id)\n if (nodeId) {\n onMemberClick(nodeId)\n }\n }\n })\n .render()\n .expandAll() // 初始化时展开所有节点\n\n // 添加配偶区域点击事件监听\n setTimeout(() => {\n const spouseAreas = chartRef.current?.querySelectorAll('.spouse-area')\n spouseAreas?.forEach((area) => {\n area.addEventListener('click', (e) => {\n e.stopPropagation() // 阻止事件冒泡到节点\n const spouseId = (area as HTMLElement).getAttribute('data-spouse-id')\n if (spouseId && onMemberClick) {\n onMemberClick(spouseId)\n }\n })\n })\n }, 100)\n\n chartInstanceRef.current = chart\n setIsReady(true)\n\n return () => {\n // 清理\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n }\n }, [members, rootId, onMemberClick, avatarCache])\n\n // 导出PNG\n const handleExportPNG = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: true,\n full: true,\n onLoad: () => {\n onExport?.()\n }\n })\n }\n\n // 导出PDF\n const handleExportPDF = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: false,\n full: true,\n onLoad: (base64: string) => {\n const pdf = new jsPDF({\n orientation: 'landscape',\n unit: 'px',\n format: 'a4'\n })\n \n const img = new Image()\n img.src = base64\n img.onload = function () {\n const imgWidth = img.width\n const imgHeight = img.height\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n \n // 计算缩放比例以适应页面\n const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight)\n const scaledWidth = imgWidth * ratio\n const scaledHeight = imgHeight * ratio\n \n // 居中放置\n const x = (pdfWidth - scaledWidth) / 2\n const y = (pdfHeight - scaledHeight) / 2\n \n pdf.addImage(img, 'PNG', x, y, scaledWidth, scaledHeight)\n pdf.save(`家谱图-${new Date().toISOString().split('T')[0]}.pdf`)\n onExport?.()\n }\n }\n })\n }\n\n // 展开所有节点\n const handleExpandAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.expandAll()\n }\n\n // 折叠所有节点\n const handleCollapseAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.collapseAll()\n }\n\n // 适应视图\n const handleFitView = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.fit()\n }\n\n // 暴露方法给父组件\n useImperativeHandle(ref, () => ({\n exportPNG: handleExportPNG,\n exportPDF: handleExportPDF,\n expandAll: handleExpandAll,\n collapseAll: handleCollapseAll,\n fitView: handleFitView,\n }))\n\n return (\n
\n {/* 图表容器 */}\n
\n
\n )\n})\n\nD3OrgChartFlow.displayName = 'D3OrgChartFlow'\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 2143, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/tree/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\n\nimport { SiteHeader } from \"@/components/site-header\"\nimport { TreeLayout } from \"@/components/tree/tree-layout\"\nimport { D3OrgChartFlow, type D3OrgChartRef } from \"@/components/tree/d3-org-chart-flow\"\nimport { useFamily } from \"@/context/family-context\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { ZoomIn, ZoomOut, Move, Download, LayoutGrid, ChevronDown } from \"lucide-react\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\n\ntype ViewMode = \"traditional\" | \"d3-org-chart\"\n\nexport default function TreePage() {\n const { treeData } = useFamily()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [viewMode, setViewMode] = useState(\"traditional\")\n \n // 从 URL 参数读取视图模式\n useEffect(() => {\n const view = searchParams.get('view')\n if (view === 'd3-org-chart' || view === 'traditional') {\n setViewMode(view)\n }\n }, [searchParams])\n const [scale, setScale] = useState(1)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [isDragging, setIsDragging] = useState(false)\n const [startPos, setStartPos] = useState({ x: 0, y: 0 })\n const [dragStartPos, setDragStartPos] = useState({ x: 0, y: 0 })\n const containerRef = useRef(null)\n const d3ChartRef = useRef(null)\n\n const handleMouseDown = (e: React.MouseEvent) => {\n // 如果点击的是节点卡片,不启动拖拽\n const target = e.target as HTMLElement\n if (target.closest('.family-node-card')) {\n return\n }\n \n setIsDragging(true)\n setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y })\n setDragStartPos({ x: e.clientX, y: e.clientY })\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging) return\n \n // 只有移动超过5px才算拖拽,避免误触\n const deltaX = Math.abs(e.clientX - dragStartPos.x)\n const deltaY = Math.abs(e.clientY - dragStartPos.y)\n if (deltaX < 5 && deltaY < 5) return\n \n setPosition({\n x: e.clientX - startPos.x,\n y: e.clientY - startPos.y,\n })\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleExportImage = async () => {\n if (!containerRef.current) return\n\n try {\n // 临时重置位置和缩放以获取完整视图\n const originalPosition = { ...position }\n const originalScale = scale\n setPosition({ x: 0, y: 0 })\n setScale(1)\n\n // 等待 DOM 更新\n await new Promise(resolve => setTimeout(resolve, 800))\n\n // 找到实际的族谱容器(包含 TreeLayout 的 div)\n const treeContainer = containerRef.current.querySelector('div[style*=\"transform\"]') as HTMLElement\n if (!treeContainer) {\n throw new Error('找不到族谱容器')\n }\n\n // 查找所有连接线(使用更宽泛的选择器)\n const allDivs = treeContainer.querySelectorAll('div')\n const lineElements: HTMLElement[] = []\n \n allDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n // 查找包含 bg-foreground 的元素(连接线)\n if (classes.includes('bg-foreground')) {\n lineElements.push(el)\n }\n })\n \n // 克隆容器用于导出\n const clonedContainer = treeContainer.cloneNode(true) as HTMLElement\n \n // 在克隆的容器中找到对应的连接线并设置样式\n const clonedDivs = clonedContainer.querySelectorAll('div')\n let lineIndex = 0\n clonedDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n if (classes.includes('bg-foreground') && lineElements[lineIndex]) {\n const original = lineElements[lineIndex]\n const computed = window.getComputedStyle(original)\n \n // 直接设置内联样式\n el.style.backgroundColor = computed.backgroundColor\n el.style.width = computed.width\n el.style.height = computed.height\n el.style.position = 'absolute'\n el.style.left = computed.left\n el.style.top = computed.top\n \n lineIndex++\n }\n })\n \n // 移除卡片边框\n clonedContainer.querySelectorAll('*').forEach((child) => {\n const el = child as HTMLElement\n const classes = String(el.className || '')\n \n // 跳过连接线和连接线容器\n if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) {\n return\n }\n \n // 移除其他元素的边框\n el.style.border = 'none'\n el.style.outline = 'none'\n })\n \n // 临时添加到 DOM\n clonedContainer.style.position = 'fixed'\n clonedContainer.style.left = '-9999px'\n clonedContainer.style.top = '0'\n document.body.appendChild(clonedContainer)\n \n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200))\n\n // 动态导入 dom-to-image-more(仅在客户端)\n const domtoimage = await import('dom-to-image-more')\n \n // 使用 toBlob 方法\n const blob = await domtoimage.default.toBlob(clonedContainer, {\n quality: 0.95,\n bgcolor: '#ffffff'\n })\n \n // 清理克隆的容器\n document.body.removeChild(clonedContainer)\n\n // 恢复原始位置和缩放\n setPosition(originalPosition)\n setScale(originalScale)\n\n // 创建下载链接\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`\n link.href = url\n link.click()\n \n // 清理\n setTimeout(() => URL.revokeObjectURL(url), 100)\n } catch (error) {\n console.error('导出图片失败:', error)\n }\n }\n\n // Handle root not found\n if (!treeData.rootId) {\n return (\n
\n \n
暂无家族树数据
\n
\n )\n }\n\n return (\n
\n \n\n {/* 视图切换按钮 */}\n
\n \n \n \n \n \n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'traditional')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'traditional' ? 'bg-accent' : ''}\n >\n
\n 传统家谱视图\n {viewMode === 'traditional' && }\n
\n
\n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'd3-org-chart')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'd3-org-chart' ? 'bg-accent' : ''}\n >\n
\n D3 家谱图\n {viewMode === 'd3-org-chart' && }\n
\n
\n
\n
\n
\n\n {viewMode === 'traditional' ? (\n
\n {/* Toolbar */}\n
\n \n \n \n
\n \n
\n\n {/* Tree Canvas */}\n \n \n \n
\n
\n
\n ) : (\n
\n {/* 统一的控制按钮 */}\n
\n \n \n \n
\n \n
\n \n
\n router.push(`/members/${id}`)}\n />\n
\n
\n )}\n
\n )\n}\n"],"names":[],"mappings":";;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAjBA;;;;;;;;;;;AAqBe,SAAS;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,iMAAS;IAC9B,MAAM,SAAS,IAAA,qUAAS;IACxB,MAAM,eAAe,IAAA,2UAAe;IACpC,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAW;IAEnD,iBAAiB;IACjB,IAAA,wYAAS,EAAC;QACR,MAAM,OAAO,aAAa,GAAG,CAAC;QAC9B,IAAI,SAAS,kBAAkB,SAAS,eAAe;YACrD,YAAY;QACd;IACF,GAAG;QAAC;KAAa;IACjB,MAAM,CAAC,OAAO,SAAS,GAAG,IAAA,uYAAQ,EAAC;IACnC,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IACtD,MAAM,CAAC,YAAY,cAAc,GAAG,IAAA,uYAAQ,EAAC;IAC7C,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IACtD,MAAM,CAAC,cAAc,gBAAgB,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IAC9D,MAAM,eAAe,IAAA,qYAAM,EAAiB;IAC5C,MAAM,aAAa,IAAA,qYAAM,EAAgB;IAEzC,MAAM,kBAAkB,CAAC;QACvB,mBAAmB;QACnB,MAAM,SAAS,EAAE,MAAM;QACvB,IAAI,OAAO,OAAO,CAAC,sBAAsB;YACvC;QACF;QAEA,cAAc;QACd,YAAY;YAAE,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;YAAE,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC;QACnE,gBAAgB;YAAE,GAAG,EAAE,OAAO;YAAE,GAAG,EAAE,OAAO;QAAC;IAC/C;IAEA,MAAM,kBAAkB,CAAC;QACvB,IAAI,CAAC,YAAY;QAEjB,qBAAqB;QACrB,MAAM,SAAS,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;QAClD,MAAM,SAAS,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;QAClD,IAAI,SAAS,KAAK,SAAS,GAAG;QAE9B,YAAY;YACV,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;YACzB,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;QAC3B;IACF;IAEA,MAAM,gBAAgB;QACpB,cAAc;IAChB;IAEA,MAAM,oBAAoB;QACxB,IAAI,CAAC,aAAa,OAAO,EAAE;QAE3B,IAAI;YACF,mBAAmB;YACnB,MAAM,mBAAmB;gBAAE,GAAG,QAAQ;YAAC;YACvC,MAAM,gBAAgB;YACtB,YAAY;gBAAE,GAAG;gBAAG,GAAG;YAAE;YACzB,SAAS;YAET,YAAY;YACZ,MAAM,IAAI,QAAQ,CAAA,UAAW,WAAW,SAAS;YAEjD,iCAAiC;YACjC,MAAM,gBAAgB,aAAa,OAAO,CAAC,aAAa,CAAC;YACzD,IAAI,CAAC,eAAe;gBAClB,MAAM,IAAI,MAAM;YAClB;YAEA,qBAAqB;YACrB,MAAM,UAAU,cAAc,gBAAgB,CAAC;YAC/C,MAAM,eAA8B,EAAE;YAEtC,QAAQ,OAAO,CAAC,CAAA;gBACd,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBACvC,8BAA8B;gBAC9B,IAAI,QAAQ,QAAQ,CAAC,kBAAkB;oBACrC,aAAa,IAAI,CAAC;gBACpB;YACF;YAEA,WAAW;YACX,MAAM,kBAAkB,cAAc,SAAS,CAAC;YAEhD,uBAAuB;YACvB,MAAM,aAAa,gBAAgB,gBAAgB,CAAC;YACpD,IAAI,YAAY;YAChB,WAAW,OAAO,CAAC,CAAA;gBACjB,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBACvC,IAAI,QAAQ,QAAQ,CAAC,oBAAoB,YAAY,CAAC,UAAU,EAAE;oBAChE,MAAM,WAAW,YAAY,CAAC,UAAU;oBACxC,MAAM,WAAW,OAAO,gBAAgB,CAAC;oBAEzC,WAAW;oBACX,GAAG,KAAK,CAAC,eAAe,GAAG,SAAS,eAAe;oBACnD,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,KAAK;oBAC/B,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,MAAM;oBACjC,GAAG,KAAK,CAAC,QAAQ,GAAG;oBACpB,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,IAAI;oBAC7B,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG;oBAE3B;gBACF;YACF;YAEA,SAAS;YACT,gBAAgB,gBAAgB,CAAC,KAAK,OAAO,CAAC,CAAC;gBAC7C,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBAEvC,cAAc;gBACd,IAAI,QAAQ,QAAQ,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,wBAAwB;oBAChF;gBACF;gBAEA,YAAY;gBACZ,GAAG,KAAK,CAAC,MAAM,GAAG;gBAClB,GAAG,KAAK,CAAC,OAAO,GAAG;YACrB;YAEA,YAAY;YACZ,gBAAgB,KAAK,CAAC,QAAQ,GAAG;YACjC,gBAAgB,KAAK,CAAC,IAAI,GAAG;YAC7B,gBAAgB,KAAK,CAAC,GAAG,GAAG;YAC5B,SAAS,IAAI,CAAC,WAAW,CAAC;YAE1B,OAAO;YACP,MAAM,IAAI,QAAQ,CAAA,UAAW,WAAW,SAAS;YAEjD,gCAAgC;YAChC,MAAM,aAAa;YAEnB,eAAe;YACf,MAAM,OAAO,MAAM,WAAW,OAAO,CAAC,MAAM,CAAC,iBAAiB;gBAC5D,SAAS;gBACT,SAAS;YACX;YAEA,UAAU;YACV,SAAS,IAAI,CAAC,WAAW,CAAC;YAE1B,YAAY;YACZ,YAAY;YACZ,SAAS;YAET,SAAS;YACT,MAAM,MAAM,IAAI,eAAe,CAAC;YAChC,MAAM,OAAO,SAAS,aAAa,CAAC;YACpC,KAAK,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,OAAO,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3E,KAAK,IAAI,GAAG;YACZ,KAAK,KAAK;YAEV,KAAK;YACL,WAAW,IAAM,IAAI,eAAe,CAAC,MAAM;QAC7C,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,WAAW;QAC3B;IACF;IAEA,wBAAwB;IACxB,IAAI,CAAC,SAAS,MAAM,EAAE;QACpB,qBACE,oaAAC;YAAI,WAAU;;8BACb,oaAAC,kMAAU;;;;;8BACX,oaAAC;oBAAI,WAAU;8BAAgE;;;;;;;;;;;;IAGrF;IAEA,qBACE,oaAAC;QAAI,WAAU;;0BACb,oaAAC,kMAAU;;;;;0BAGX,oaAAC;gBAAI,WAAU;0BACb,cAAA,oaAAC,4MAAY;;sCACX,oaAAC,mNAAmB;4BAAC,OAAO;sCAC1B,cAAA,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,WAAU;;kDAClC,oaAAC,2WAAU;wCAAC,WAAU;;;;;;oCACrB,aAAa,gBAAgB,SAAS;kDACvC,oaAAC,8WAAW;wCAAC,WAAU;;;;;;;;;;;;;;;;;sCAG3B,oaAAC,mNAAmB;4BAAC,OAAM;4BAAM,WAAU;;8CACzC,oaAAC,gNAAgB;oCACf,SAAS;wCACP,MAAM,SAAS,IAAI,gBAAgB,aAAa,QAAQ;wCACxD,OAAO,GAAG,CAAC,QAAQ;wCACnB,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI;oCAC1C;oCACA,WAAW,aAAa,gBAAgB,cAAc;8CAEtD,cAAA,oaAAC;wCAAI,WAAU;;0DACb,oaAAC;0DAAK;;;;;;4CACL,aAAa,+BAAiB,oaAAC;gDAAK,WAAU;0DAAe;;;;;;;;;;;;;;;;;8CAGlE,oaAAC,gNAAgB;oCACf,SAAS;wCACP,MAAM,SAAS,IAAI,gBAAgB,aAAa,QAAQ;wCACxD,OAAO,GAAG,CAAC,QAAQ;wCACnB,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI;oCAC1C;oCACA,WAAW,aAAa,iBAAiB,cAAc;8CAEvD,cAAA,oaAAC;wCAAI,WAAU;;0DACb,oaAAC;0DAAK;;;;;;4CACL,aAAa,gCAAkB,oaAAC;gDAAK,WAAU;0DAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAOxE,aAAa,8BACZ,oaAAC;gBAAI,WAAU;;kCAEb,oaAAC;wBAAI,WAAU;;0CACb,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,SAAS,CAAC,IAAM,KAAK,GAAG,CAAC,IAAI,KAAK;0CACrF,cAAA,oaAAC,+VAAM;oCAAC,WAAU;;;;;;;;;;;0CAEpB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,SAAS,CAAC,IAAM,KAAK,GAAG,CAAC,IAAI,KAAK;0CACrF,cAAA,oaAAC,kWAAO;oCAAC,WAAU;;;;;;;;;;;0CAErB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,YAAY;wCAAE,GAAG;wCAAG,GAAG;oCAAE;0CAC5E,cAAA,oaAAC,qVAAI;oCAAC,WAAU;;;;;;;;;;;0CAElB,oaAAC;gCAAI,WAAU;;;;;;0CACf,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS;gCAAmB,OAAM;0CACtE,cAAA,oaAAC,iWAAQ;oCAAC,WAAU;;;;;;;;;;;;;;;;;kCAKxB,oaAAC;wBACC,KAAK;wBACL,WAAU;wBACV,aAAa;wBACb,aAAa;wBACb,WAAW;wBACX,cAAc;kCAEd,cAAA,oaAAC;4BACC,OAAO;gCACL,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gCACxE,iBAAiB;gCACjB,YAAY,aAAa,SAAS;4BACpC;4BACA,WAAU;sCAEV,cAAA,oaAAC,0MAAU;gCAAC,QAAQ,SAAS,MAAM;;;;;;;;;;;;;;;;;;;;;qCAKzC,oaAAC;gBAAI,WAAU;;kCAEb,oaAAC;wBAAI,WAAU;;0CACb,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAa,OAAM;0CAC1F,cAAA,oaAAC,+VAAM;oCAAC,WAAU;;;;;;;;;;;0CAEpB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAe,OAAM;0CAC5F,cAAA,oaAAC,kWAAO;oCAAC,WAAU;;;;;;;;;;;0CAErB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAW,OAAM;0CACxF,cAAA,oaAAC,qVAAI;oCAAC,WAAU;;;;;;;;;;;0CAElB,oaAAC;gCAAI,WAAU;;;;;;0CACf,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAa,OAAM;0CAC1F,cAAA,oaAAC,iWAAQ;oCAAC,WAAU;;;;;;;;;;;;;;;;;kCAIxB,oaAAC;wBAAI,WAAU;kCACb,cAAA,oaAAC,0NAAc;4BACb,KAAK;4BACL,SAAS,SAAS,OAAO;4BACzB,QAAQ,SAAS,MAAM;4BACvB,eAAe,CAAC,KAAe,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI;;;;;;;;;;;;;;;;;;;;;;;AAOzE"}}] + {"offset": {"line": 2143, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/tree/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\n\nimport { SiteHeader } from \"@/components/site-header\"\nimport { TreeLayout } from \"@/components/tree/tree-layout\"\nimport { D3OrgChartFlow, type D3OrgChartRef } from \"@/components/tree/d3-org-chart-flow\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRelationship } from \"@/hooks/use-relationship\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"@/components/ui/dialog\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { ZoomIn, ZoomOut, Move, Download, LayoutGrid, ChevronDown, Users } from \"lucide-react\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\n\ntype ViewMode = \"traditional\" | \"d3-org-chart\"\n\nexport default function TreePage() {\n const { treeData } = useFamily()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [viewMode, setViewMode] = useState(\"traditional\")\n \n // 从 URL 参数读取视图模式\n useEffect(() => {\n const view = searchParams.get('view')\n if (view === 'd3-org-chart' || view === 'traditional') {\n setViewMode(view)\n }\n }, [searchParams])\n const [scale, setScale] = useState(1)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [isDragging, setIsDragging] = useState(false)\n const [startPos, setStartPos] = useState({ x: 0, y: 0 })\n const [dragStartPos, setDragStartPos] = useState({ x: 0, y: 0 })\n const containerRef = useRef(null)\n const d3ChartRef = useRef(null)\n\n const handleMouseDown = (e: React.MouseEvent) => {\n // 如果点击的是节点卡片,不启动拖拽\n const target = e.target as HTMLElement\n if (target.closest('.family-node-card')) {\n return\n }\n \n setIsDragging(true)\n setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y })\n setDragStartPos({ x: e.clientX, y: e.clientY })\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging) return\n \n // 只有移动超过5px才算拖拽,避免误触\n const deltaX = Math.abs(e.clientX - dragStartPos.x)\n const deltaY = Math.abs(e.clientY - dragStartPos.y)\n if (deltaX < 5 && deltaY < 5) return\n \n setPosition({\n x: e.clientX - startPos.x,\n y: e.clientY - startPos.y,\n })\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n const handleExportImage = async () => {\n if (!containerRef.current) return\n\n try {\n // 临时重置位置和缩放以获取完整视图\n const originalPosition = { ...position }\n const originalScale = scale\n setPosition({ x: 0, y: 0 })\n setScale(1)\n\n // 等待 DOM 更新\n await new Promise(resolve => setTimeout(resolve, 800))\n\n // 找到实际的族谱容器(包含 TreeLayout 的 div)\n const treeContainer = containerRef.current.querySelector('div[style*=\"transform\"]') as HTMLElement\n if (!treeContainer) {\n throw new Error('找不到族谱容器')\n }\n\n // 查找所有连接线(使用更宽泛的选择器)\n const allDivs = treeContainer.querySelectorAll('div')\n const lineElements: HTMLElement[] = []\n \n allDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n // 查找包含 bg-foreground 的元素(连接线)\n if (classes.includes('bg-foreground')) {\n lineElements.push(el)\n }\n })\n \n // 克隆容器用于导出\n const clonedContainer = treeContainer.cloneNode(true) as HTMLElement\n \n // 在克隆的容器中找到对应的连接线并设置样式\n const clonedDivs = clonedContainer.querySelectorAll('div')\n let lineIndex = 0\n clonedDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n if (classes.includes('bg-foreground') && lineElements[lineIndex]) {\n const original = lineElements[lineIndex]\n const computed = window.getComputedStyle(original)\n \n // 直接设置内联样式\n el.style.backgroundColor = computed.backgroundColor\n el.style.width = computed.width\n el.style.height = computed.height\n el.style.position = 'absolute'\n el.style.left = computed.left\n el.style.top = computed.top\n \n lineIndex++\n }\n })\n \n // 移除卡片边框\n clonedContainer.querySelectorAll('*').forEach((child) => {\n const el = child as HTMLElement\n const classes = String(el.className || '')\n \n // 跳过连接线和连接线容器\n if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) {\n return\n }\n \n // 移除其他元素的边框\n el.style.border = 'none'\n el.style.outline = 'none'\n })\n \n // 临时添加到 DOM\n clonedContainer.style.position = 'fixed'\n clonedContainer.style.left = '-9999px'\n clonedContainer.style.top = '0'\n document.body.appendChild(clonedContainer)\n \n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200))\n\n // 动态导入 dom-to-image-more(仅在客户端)\n const domtoimage = await import('dom-to-image-more')\n \n // 使用 toBlob 方法\n const blob = await domtoimage.default.toBlob(clonedContainer, {\n quality: 0.95,\n bgcolor: '#ffffff'\n })\n \n // 清理克隆的容器\n document.body.removeChild(clonedContainer)\n\n // 恢复原始位置和缩放\n setPosition(originalPosition)\n setScale(originalScale)\n\n // 创建下载链接\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`\n link.href = url\n link.click()\n \n // 清理\n setTimeout(() => URL.revokeObjectURL(url), 100)\n } catch (error) {\n console.error('导出图片失败:', error)\n }\n }\n\n // Handle root not found\n if (!treeData.rootId) {\n return (\n
\n \n
暂无家族树数据
\n
\n )\n }\n\n return (\n
\n \n\n {/* 视图切换按钮 */}\n
\n \n \n \n \n \n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'traditional')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'traditional' ? 'bg-accent' : ''}\n >\n
\n 传统家谱视图\n {viewMode === 'traditional' && }\n
\n
\n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'd3-org-chart')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'd3-org-chart' ? 'bg-accent' : ''}\n >\n
\n D3 家谱图\n {viewMode === 'd3-org-chart' && }\n
\n
\n
\n
\n
\n\n {viewMode === 'traditional' ? (\n
\n {/* Toolbar */}\n
\n \n \n \n
\n \n
\n\n {/* Tree Canvas */}\n \n \n \n
\n
\n
\n ) : (\n
\n {/* 统一的控制按钮 */}\n
\n \n \n \n
\n \n
\n \n
\n router.push(`/members/${id}`)}\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/[root-of-the-server]__297e3b80._.js b/.next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js new file mode 100644 index 00000000..dbd72a28 --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js @@ -0,0 +1,58 @@ +module.exports = [ +"[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("next/dist/shared/lib/no-fallback-error.external.js", () => require("next/dist/shared/lib/no-fallback-error.external.js")); + +module.exports = mod; +}), +"[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/app/layout.tsx [app-rsc] (ecmascript)")); +}), +"[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/app/loading.tsx [app-rsc] (ecmascript)")); +}), +"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (client reference proxy) ", ((__turbopack_context__) => { +"use strict"; + +// This file is generated by next-core EcmascriptClientReferenceModule. +__turbopack_context__.s([ + "default", + ()=>__TURBOPACK__default__export__ +]); +var __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$rsc$2f$react$2d$server$2d$dom$2d$turbopack$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server.js [app-rsc] (ecmascript)"); +; +const __TURBOPACK__default__export__ = (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$rsc$2f$react$2d$server$2d$dom$2d$turbopack$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["registerClientReference"])(function() { + throw new Error("Attempted to call the default export of [project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx from the server, but it's 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."); +}, "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx ", "default"); +}), +"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (client reference proxy)", ((__turbopack_context__) => { +"use strict"; + +// This file is generated by next-core EcmascriptClientReferenceModule. +__turbopack_context__.s([ + "default", + ()=>__TURBOPACK__default__export__ +]); +var __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$rsc$2f$react$2d$server$2d$dom$2d$turbopack$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/rsc/react-server-dom-turbopack-server.js [app-rsc] (ecmascript)"); +; +const __TURBOPACK__default__export__ = (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$rsc$2f$react$2d$server$2d$dom$2d$turbopack$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["registerClientReference"])(function() { + throw new Error("Attempted to call the default export of [project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx from the server, but it's 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."); +}, "[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx", "default"); +}), +"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$client__reference__proxy$29$__$3c$module__evaluation$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (client reference proxy) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$client__reference__proxy$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (client reference proxy)"); +; +__turbopack_context__.n(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$app$2f$relationship$2d$test$2f$page$2e$tsx__$5b$app$2d$rsc$5d$__$28$client__reference__proxy$29$__); +}), +"[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript, Next.js Server Component)", ((__turbopack_context__) => { + +__turbopack_context__.n(__turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx [app-rsc] (ecmascript)")); +}), +]; + +//# sourceMappingURL=%5Broot-of-the-server%5D__297e3b80._.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js.map b/.next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js.map new file mode 100644 index 00000000..be57b52f --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__297e3b80._.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": [], + "sections": [ + {"offset": {"line": 18, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport default registerClientReference(\n function() { throw new Error(\"Attempted to call the default export of [project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx from the server, but it's 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/app/relationship-test/page.tsx \",\n \"default\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;AACvE;;uCACe,IAAA,8bAAuB,EAClC;IAAa,MAAM,IAAI,MAAM;AAAuU,GACpW,qGACA","ignoreList":[0]}}, + {"offset": {"line": 32, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport default registerClientReference(\n function() { throw new Error(\"Attempted to call the default export of [project]/Documents/go-new/chinese-family-tree/app/relationship-test/page.tsx from the server, but it's 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/app/relationship-test/page.tsx\",\n \"default\",\n);\n"],"names":[],"mappings":"AAAA,uEAAuE;;;;;AACvE;;uCACe,IAAA,8bAAuB,EAClC;IAAa,MAAM,IAAI,MAAM;AAAmT,GAChV,iFACA","ignoreList":[0]}}, + {"offset": {"line": 46, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}] +} \ 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 new file mode 100644 index 00000000..fb365b5d --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js @@ -0,0 +1,3986 @@ +module.exports = [ +"[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Avatar", + ()=>Avatar, + "AvatarFallback", + ()=>AvatarFallback, + "AvatarImage", + ()=>AvatarImage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-avatar@1.1.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_3ee3dafa662d71951c1a3d5b289c96d1/node_modules/@radix-ui/react-avatar/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +function Avatar({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "avatar", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('relative flex size-8 shrink-0 overflow-hidden rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 13, + columnNumber: 5 + }, this); +} +function AvatarImage({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Image"], { + "data-slot": "avatar-image", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('aspect-square size-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 29, + columnNumber: 5 + }, this); +} +function AvatarFallback({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Fallback"], { + "data-slot": "avatar-fallback", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-muted flex size-full items-center justify-center rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 42, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "DropdownMenu", + ()=>DropdownMenu, + "DropdownMenuCheckboxItem", + ()=>DropdownMenuCheckboxItem, + "DropdownMenuContent", + ()=>DropdownMenuContent, + "DropdownMenuGroup", + ()=>DropdownMenuGroup, + "DropdownMenuItem", + ()=>DropdownMenuItem, + "DropdownMenuLabel", + ()=>DropdownMenuLabel, + "DropdownMenuPortal", + ()=>DropdownMenuPortal, + "DropdownMenuRadioGroup", + ()=>DropdownMenuRadioGroup, + "DropdownMenuRadioItem", + ()=>DropdownMenuRadioItem, + "DropdownMenuSeparator", + ()=>DropdownMenuSeparator, + "DropdownMenuShortcut", + ()=>DropdownMenuShortcut, + "DropdownMenuSub", + ()=>DropdownMenuSub, + "DropdownMenuSubContent", + ()=>DropdownMenuSubContent, + "DropdownMenuSubTrigger", + ()=>DropdownMenuSubTrigger, + "DropdownMenuTrigger", + ()=>DropdownMenuTrigger +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types_aefad4ac5851d46557f75f368796c888/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-right.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function DropdownMenu({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "dropdown-menu", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function DropdownMenuPortal({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + "data-slot": "dropdown-menu-portal", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 19, + columnNumber: 5 + }, this); +} +function DropdownMenuTrigger({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "dropdown-menu-trigger", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 27, + columnNumber: 5 + }, this); +} +function DropdownMenuContent({ className, sideOffset = 4, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "dropdown-menu-content", + sideOffset: sideOffset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 41, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 40, + columnNumber: 5 + }, this); +} +function DropdownMenuGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "dropdown-menu-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 58, + columnNumber: 5 + }, this); +} +function DropdownMenuItem({ className, inset, variant = 'default', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "dropdown-menu-item", + "data-inset": inset, + "data-variant": variant, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 72, + columnNumber: 5 + }, this); +} +function DropdownMenuCheckboxItem({ className, children, checked, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CheckboxItem"], { + "data-slot": "dropdown-menu-checkbox-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + checked: checked, + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 103, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 102, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 101, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 92, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioGroup"], { + "data-slot": "dropdown-menu-radio-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 115, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioItem"], { + "data-slot": "dropdown-menu-radio-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__["CircleIcon"], { + className: "size-2 fill-current" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 138, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 137, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 136, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 128, + columnNumber: 5 + }, this); +} +function DropdownMenuLabel({ className, inset, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "dropdown-menu-label", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 154, + columnNumber: 5 + }, this); +} +function DropdownMenuSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "dropdown-menu-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 171, + columnNumber: 5 + }, this); +} +function DropdownMenuShortcut({ className, ...props }) { + 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$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", { + "data-slot": "dropdown-menu-shortcut", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground ml-auto text-xs tracking-widest', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 184, + columnNumber: 5 + }, this); +} +function DropdownMenuSub({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Sub"], { + "data-slot": "dropdown-menu-sub", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 198, + columnNumber: 10 + }, this); +} +function DropdownMenuSubTrigger({ className, inset, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubTrigger"], { + "data-slot": "dropdown-menu-sub-trigger", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__["ChevronRightIcon"], { + className: "ml-auto size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 220, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 210, + columnNumber: 5 + }, this); +} +function DropdownMenuSubContent({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubContent"], { + "data-slot": "dropdown-menu-sub-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 230, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "SiteHeader", + ()=>SiteHeader +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[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/client/app-dir/link.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript) "); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/input.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next-auth@4.24.13_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__nodemailer@7_3c43d6bc4ecce810d1d16651fe207b00/node_modules/next-auth/react/index.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +function SiteHeader() { + const { searchMembers, searchResults } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { data: session, status } = (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])(); + const { showAlert, showConfirm, showPrompt } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useDialog"])(); + const pathname = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["usePathname"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [searchQuery, setSearchQuery] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + const [showResults, setShowResults] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [familyTrees, setFamilyTrees] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [currentTree, setCurrentTree] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [deletingTreeId, setDeletingTreeId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const searchRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + // 获取当前视图模式 + const currentViewMode = searchParams.get('view') || 'traditional'; + const isTreePage = pathname === '/tree'; + // 生成带有 treeId 的 URL + const getUrlWithTreeId = (path)=>{ + if (currentTree?.id) { + return `${path}?treeId=${currentTree.id}`; + } + return path; + }; + // 切换视图模式 + const handleViewModeChange = (mode)=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', mode); + if (currentTree?.id) { + params.set('treeId', currentTree.id); + } + router.push(`${pathname}?${params.toString()}`); + }; + const getRoleBadge = (role)=>{ + switch(role){ + case "OWNER": + 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$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] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 border border-purple-200 ml-2", + children: "所有者" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 69, + columnNumber: 16 + }, this); + case "EDITOR": + 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$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] px-1.5 py-0.5 rounded bg-blue-100 text-blue-700 border border-blue-200 ml-2", + children: "编辑" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 71, + columnNumber: 16 + }, this); + case "VIEWER": + 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$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] px-1.5 py-0.5 rounded bg-gray-100 text-gray-700 border border-gray-200 ml-2", + children: "查看" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 73, + columnNumber: 16 + }, this); + default: + return null; + } + }; + const handleSignOut = async ()=>{ + await (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["signOut"])({ + callbackUrl: "/auth/signin" + }); + }; + // 获取用户名首字母作为头像 + const getUserInitial = ()=>{ + if (session?.user?.name) { + return session.user.name.charAt(0).toUpperCase(); + } + if (session?.user?.email) { + return session.user.email.charAt(0).toUpperCase(); + } + return "U"; + }; + // 删除家族树 + const handleDeleteTree = async (tree, e)=>{ + e.stopPropagation(); // 阻止触发选择事件 + // 检查权限 + if (tree.ownerId !== session?.user?.id) { + await showAlert('只有家族树的创建者才能删除', '权限不足'); + return; + } + const confirmText = `确定要删除家族树"${tree.name}"吗?\n\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`; + const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive'); + if (!confirmed) { + return; + } + // 二次确认 + const finalConfirm = await showPrompt(`请输入家族树名称"${tree.name}"以确认删除:`, '', '确认删除'); + if (finalConfirm !== tree.name) { + await showAlert('名称不匹配,删除已取消', '操作已取消'); + return; + } + setDeletingTreeId(tree.id); + try { + const response = await fetch(`/api/trees/${tree.id}`, { + method: 'DELETE' + }); + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error || '删除失败'); + } + // 刷新家族树列表 + await loadFamilyTrees(); + // 如果删除的是当前树,跳转到首页 + if (currentTree?.id === tree.id) { + window.location.href = '/'; + } + } catch (error) { + console.error('删除家族树失败:', error); + await showAlert('删除失败:' + error.message, '错误'); + } finally{ + setDeletingTreeId(null); + } + }; + // 获取家族树列表 + const loadFamilyTrees = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + if (!session?.user?.id || status !== 'authenticated') return; + const controller = new AbortController(); + fetch('/api/trees', { + signal: controller.signal + }).then((res)=>{ + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`); + return res.json(); + }).then((data)=>{ + if (data.trees) { + setFamilyTrees(data.trees); + // 如果 URL 中有 treeId,使用该树,否则使用第一个 + const urlParams = new URLSearchParams(window.location.search); + const treeId = urlParams.get('treeId'); + if (treeId) { + const tree = data.trees.find((t)=>t.id === treeId); + if (tree) { + setCurrentTree(tree); + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } + }).catch((err)=>{ + // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的) + if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') { + console.error('获取家族树列表失败:', err); + } + }); + return ()=>controller.abort(); + }, [ + session?.user?.id, + status + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + loadFamilyTrees(); + }, [ + loadFamilyTrees + ]); + // 监听路由变化,刷新家族树列表 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const handleRouteChange = ()=>{ + loadFamilyTrees(); + }; + window.addEventListener('focus', handleRouteChange); + return ()=>window.removeEventListener('focus', handleRouteChange); + }, [ + loadFamilyTrees + ]); + // 点击外部关闭搜索结果 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + function handleClickOutside(event) { + if (searchRef.current && !searchRef.current.contains(event.target)) { + setShowResults(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return ()=>document.removeEventListener("mousedown", handleClickOutside); + }, []); + const handleSearch = (query)=>{ + setSearchQuery(query); + searchMembers(query); + setShowResults(query.length > 0); + }; + const handleSelectMember = (memberId)=>{ + router.push(`/members/${memberId}`); + setSearchQuery(""); + setShowResults(false); + }; + 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$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"])("header", { + className: "sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", + 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: "container mx-auto flex h-16 items-center px-4", + 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: "mr-8 flex items-center gap-4", + 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"])(__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"], { + href: "/", + className: "flex items-center gap-2", + 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 h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__["BookOpen"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 229, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 228, + 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"])("span", { + className: "text-xl font-serif font-bold tracking-tight", + children: "华夏谱" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 231, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 227, + columnNumber: 11 + }, this), + session && familyTrees.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$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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 min-w-[200px]", + 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: "flex-1 truncate text-left", + children: currentTree?.name || '选择家族树' + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 239, + 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$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-4 w-4 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 240, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 238, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 237, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "start", + className: "w-[var(--radix-dropdown-menu-trigger-width)] min-w-[200px]", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + children: "我的家族树" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 244, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 245, + columnNumber: 17 + }, this), + familyTrees.map((tree)=>/*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + setCurrentTree(tree); + // 保持当前路径,只更新 treeId 参数 + const currentPath = window.location.pathname; + router.push(`${currentPath}?treeId=${tree.id}`); + }, + className: "cursor-pointer flex items-center justify-between group", + 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 overflow-hidden", + 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: "truncate", + children: tree.name + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 258, + columnNumber: 23 + }, this), + getRoleBadge(tree.currentUserRole) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 257, + 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: "flex items-center gap-2", + children: [ + currentTree?.id === tree.id && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 263, + columnNumber: 25 + }, this), + tree.ownerId === session?.user?.id && /*#__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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "sm", + className: "h-6 w-6 p-0 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-destructive hover:text-destructive-foreground", + onClick: (e)=>handleDeleteTree(tree, e), + disabled: deletingTreeId === tree.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$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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__["Trash2"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 273, + columnNumber: 27 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 266, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 261, + columnNumber: 21 + }, this) + ] + }, tree.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>router.push('/trees/new'), + className: "cursor-pointer text-primary", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__["Plus"], { + className: "h-4 w-4 mr-2" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 284, + columnNumber: 19 + }, this), + "创建新家族树" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 280, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 243, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 236, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 226, + 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"])("nav", { + className: "hidden md:flex items-center gap-6 text-sm font-medium text-muted-foreground", + 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"])(__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"], { + href: getUrlWithTreeId("/"), + className: "transition-colors hover:text-foreground data-[active=true]:text-foreground data-[active=true]:font-semibold", + children: "总览 (Overview)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 293, + 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$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"], { + href: getUrlWithTreeId("/tree"), + className: "transition-colors hover:text-foreground", + children: "族谱 (Tree)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 299, + 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$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"], { + href: getUrlWithTreeId("/members"), + className: "transition-colors hover:text-foreground", + children: "成员 (Members)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 302, + 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$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"], { + href: getUrlWithTreeId("/timeline"), + className: "transition-colors hover:text-foreground", + children: "大事记 (Timeline)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 305, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 292, + 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", { + className: "ml-auto flex items-center gap-4", + 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: "relative hidden sm:block", + ref: searchRef, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + 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/components/site-header.tsx", + lineNumber: 312, + 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$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Input"], { + type: "search", + placeholder: "搜索成员...", + value: searchQuery, + onChange: (e)=>handleSearch(e.target.value), + className: "h-9 w-64 rounded-full bg-muted pl-9 text-sm focus-visible:ring-primary" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 313, + columnNumber: 13 + }, this), + showResults && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg max-h-96 overflow-y-auto z-50", + children: searchResults.map((member)=>/*#__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"])("button", { + onClick: ()=>handleSelectMember(member.id), + className: "w-full px-4 py-3 text-left hover:bg-muted transition-colors border-b border-border last:border-0", + 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 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"])("div", { + className: "flex-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 gap-2", + 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: "font-medium", + children: member.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 333, + 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"])("span", { + className: `text-xs px-1.5 py-0.5 rounded ${member.gender === "MALE" ? "bg-blue-100 text-blue-700" : "bg-pink-100 text-pink-700"}`, + children: member.gender === "MALE" ? "男" : "女" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 334, + 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"])("span", { + className: "text-xs text-muted-foreground", + children: [ + "第", + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 337, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 332, + 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"])("p", { + className: "text-xs text-muted-foreground mt-1", + children: [ + member.birthDate && `生于 ${member.birthDate}`, + member.birthPlace && ` · ${member.birthPlace}` + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 339, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 331, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 330, + columnNumber: 21 + }, this) + }, member.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 325, + columnNumber: 19 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 323, + columnNumber: 15 + }, this), + showResults && searchQuery && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg p-4 text-center text-sm text-muted-foreground z-50", + children: "未找到匹配的成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 352, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 311, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__["Bell"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 359, + 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"])("span", { + className: "sr-only", + children: "Notifications" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 360, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 358, + 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$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"], { + href: "/settings", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 365, + 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"])("span", { + className: "sr-only", + children: "Settings" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 366, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 364, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 363, + columnNumber: 11 + }, this), + status === "loading" ? /*#__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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: "..." + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 372, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 371, + columnNumber: 13 + }, this) : session ? /*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + className: "relative h-8 w-8 rounded-full", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarImage"], { + src: undefined, + alt: session.user?.name || "User" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 379, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: getUserInitial() + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 380, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 378, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 377, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 376, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + className: "w-56", + align: "end", + forceMount: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + className: "font-normal", + 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 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"])("p", { + className: "text-sm font-medium leading-none", + children: session.user?.name || "用户" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 387, + 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"])("p", { + className: "text-xs leading-none text-muted-foreground", + children: session.user?.email + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 388, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 386, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 385, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 393, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + asChild: true, + 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"])(__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"], { + href: "/settings", + className: "cursor-pointer", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 396, + 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", { + children: "系统设置" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 397, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 395, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 394, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 400, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: handleSignOut, + className: "cursor-pointer text-red-600", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__["LogOut"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 402, + 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", { + children: "退出登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 403, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 401, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 384, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 375, + 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"], { + href: "/auth/signin", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "default", + size: "sm", + children: "登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 409, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 408, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 310, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 225, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 224, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "FamilyTreeDB", + ()=>FamilyTreeDB, + "db", + ()=>db +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dexie@4.2.1/node_modules/dexie/import-wrapper.mjs [app-ssr] (ecmascript)"); +; +class FamilyTreeDB extends __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] { + members; + settings; + images; + activityLogs; + constructor(){ + super("FamilyTreeDB"); + this.version(1).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id" + }); + this.version(2).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id", + activityLogs: "id, timestamp, action, entityType, entityId" + }); + } +} +const db = new FamilyTreeDB(); +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "clearAvatarCache", + ()=>clearAvatarCache, + "useAvatarCache", + ()=>useAvatarCache +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)"); +; +; +// 全局图片缓存 +const avatarCache = new Map(); +function useAvatarCache(avatarImageId) { + const [avatarUrl, setAvatarUrl] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(avatarImageId ? avatarCache.get(avatarImageId) : undefined); + const [isLoading, setIsLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + if (!avatarImageId) { + setAvatarUrl(undefined); + return; + } + // 如果缓存中已存在,直接使用 + const cached = avatarCache.get(avatarImageId); + if (cached) { + setAvatarUrl(cached); + return; + } + // 从数据库加载 + let isMounted = true; + setIsLoading(true); + __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["db"].images.get(avatarImageId).then((image)=>{ + if (image && isMounted) { + const url = URL.createObjectURL(image.blob); + avatarCache.set(avatarImageId, url); + setAvatarUrl(url); + } + }).catch((error)=>{ + console.error('Failed to load avatar:', error); + }).finally(()=>{ + if (isMounted) { + setIsLoading(false); + } + }); + return ()=>{ + isMounted = false; + }; + }, [ + avatarImageId + ]); + return { + avatarUrl, + isLoading + }; +} +function clearAvatarCache() { + avatarCache.forEach((url)=>URL.revokeObjectURL(url)); + avatarCache.clear(); +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "FamilyNode", + ()=>FamilyNode +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$avatar$2d$cache$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user-round.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$heart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Heart$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/heart.js [app-ssr] (ecmascript) "); +"use client"; +; +; +; +; +// 格式化日期显示(只显示年份) +function formatYear(dateString) { + if (!dateString) return ''; + const year = dateString.split('-')[0]; + return year; +} +// 计算年龄 +function calculateAge(birthDate, deathDate) { + if (!birthDate) return null; + const birth = new Date(birthDate); + const end = deathDate ? new Date(deathDate) : new Date(); + let age = end.getFullYear() - birth.getFullYear(); + const monthDiff = end.getMonth() - birth.getMonth(); + if (monthDiff < 0 || monthDiff === 0 && end.getDate() < birth.getDate()) { + age--; + } + return age; +} +// 单个人员卡片组件 +function PersonCard({ member, isRoot, isSpouse, onSelect, isHighlighted, relationMode, isSelected }) { + const { avatarUrl: avatarBlobUrl } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$avatar$2d$cache$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useAvatarCache"])(member?.avatarImageId); + const birthYear = formatYear(member.birthDate); + const deathYear = formatYear(member.deathDate); + const age = calculateAge(member.birthDate, member.deathDate); + const lifeSpan = birthYear ? deathYear ? `${birthYear}-${deathYear}` : `${birthYear}-` : ''; + const ageText = age !== null ? member.deathDate ? `享年${age}岁` : `${age}岁` : ''; + 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$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: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("family-node-card relative flex flex-col items-center gap-2 p-3 rounded-lg transition-all cursor-pointer hover:scale-105 shadow-sm w-32", isSelected ? "border-4 border-blue-500 bg-blue-50 dark:bg-blue-900/20 ring-4 ring-blue-200 dark:ring-blue-800" : isHighlighted ? "border-4 border-yellow-400 bg-yellow-50 dark:bg-yellow-900/20 ring-4 ring-yellow-200 dark:ring-yellow-800 animate-pulse" : isRoot ? "border-2 border-primary bg-primary/5" : isSpouse ? "border-2 border-dashed border-border/60 bg-muted/30" : "border-2 border-border bg-card", relationMode && "hover:border-blue-400 hover:shadow-lg"), + onClick: ()=>onSelect?.(member), + 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: "absolute -top-3 bg-background border border-border px-2 py-0.5 rounded-full text-[10px] text-muted-foreground font-mono", + children: [ + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 79, + 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: "h-12 w-12 rounded-full bg-muted flex items-center justify-center text-muted-foreground overflow-hidden border border-border/50", + children: avatarBlobUrl ? /*#__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"])("img", { + src: avatarBlobUrl, + alt: member.fullName, + className: "h-full w-full object-cover" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 85, + columnNumber: 11 + }, this) : member.gender === 'female' ? /*#__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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__["CircleUserRound"], { + className: "h-8 w-8 text-pink-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 92, + 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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__["CircleUser"], { + className: "h-8 w-8 text-blue-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 94, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 83, + 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: "text-center w-full", + 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: "font-serif font-bold text-foreground leading-tight", + children: [ + member.surname, + " ", + member.givenName + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 100, + columnNumber: 9 + }, this), + member.courtesyName && /*#__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-[10px] text-muted-foreground mt-0.5", + children: [ + "字 ", + member.courtesyName + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 102, + columnNumber: 11 + }, this), + lifeSpan && /*#__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-[9px] text-muted-foreground/70 mt-1 font-mono", + children: lifeSpan + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 105, + columnNumber: 11 + }, this), + ageText && /*#__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-[9px] text-muted-foreground/60 font-mono", + children: ageText + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 110, + columnNumber: 11 + }, this), + member.phone && /*#__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-[9px] text-muted-foreground/60 font-mono truncate", + children: [ + "📱 ", + member.phone + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 115, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 99, + columnNumber: 7 + }, 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$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-1 -right-1 h-2 w-2 rounded-full bg-neutral-400 ring-2 ring-background" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 122, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 63, + columnNumber: 5 + }, this); +} +function FamilyNode({ member, spouse, isRoot, onSelect, isHighlighted, relationMode, isSelected }) { + if (!spouse) { + 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$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"])(PersonCard, { + member: member, + isRoot: isRoot, + onSelect: onSelect, + isHighlighted: isHighlighted, + relationMode: relationMode, + isSelected: isSelected + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 130, + columnNumber: 12 + }, this); + } + // 有配偶时,并排显示 + 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$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 gap-2", + 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"])(PersonCard, { + member: member, + isRoot: isRoot, + onSelect: onSelect, + isHighlighted: isHighlighted, + relationMode: relationMode, + isSelected: isSelected + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 136, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$heart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Heart$3e$__["Heart"], { + className: "h-4 w-4 text-red-400 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 137, + 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"])(PersonCard, { + member: spouse, + isSpouse: true, + onSelect: onSelect, + relationMode: relationMode + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 138, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 135, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "TreeLayout", + ()=>TreeLayout +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$family$2d$node$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +function TreeLayout({ rootId, onSelectMember, relationMode = false, selectedMembers = [], onMemberClick }) { + const { getMember, treeData, highlightedMemberId } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const root = getMember(rootId); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + const containerRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const [connections, setConnections] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const nodeRefs = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(new Map()); + // 节点间距配置 + const HORIZONTAL_GAP = 32 // 2rem = 32px + ; + const VERTICAL_GAP = 48 // 3rem = 48px + ; + const CONNECTOR_HEIGHT = 48 // 连接线垂直高度 + ; + // 处理节点点击 + const handleNodeClick = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])((member)=>{ + if (relationMode && onMemberClick) { + onMemberClick(member.id); + } else { + router.push(`/members/${member.id}`); + } + }, [ + relationMode, + onMemberClick, + router + ]); + // 计算所有连线位置 + const calculateConnections = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + const newConnections = []; + const containerRect = containerRef.current?.getBoundingClientRect(); + if (!containerRect) return; + // 检查是否有足够的节点已注册 + if (nodeRefs.current.size === 0) return; + nodeRefs.current.forEach((nodeElement, nodeId)=>{ + const member = getMember(nodeId); + if (!member || !member.childrenIds || member.childrenIds.length === 0) return; + const parentRect = nodeElement.getBoundingClientRect(); + const parentCenterX = parentRect.left + parentRect.width / 2 - containerRect.left; + const parentBottomY = parentRect.bottom - containerRect.top; + // 父节点到水平线的垂直连线 + const verticalLineY = parentBottomY + CONNECTOR_HEIGHT / 2; + newConnections.push({ + from: { + x: parentCenterX, + y: parentBottomY + }, + to: { + x: parentCenterX, + y: verticalLineY + }, + type: 'vertical' + }); + // 获取所有子节点的位置 + const childPositions = member.childrenIds.map((childId)=>{ + const childElement = nodeRefs.current.get(childId); + if (!childElement) return null; + const childRect = childElement.getBoundingClientRect(); + return { + id: childId, + centerX: childRect.left + childRect.width / 2 - containerRect.left, + topY: childRect.top - containerRect.top + }; + }).filter(Boolean); + if (childPositions.length === 0) return; + // 如果有多个子节点,绘制水平连线 + if (childPositions.length > 1) { + const leftmostX = Math.min(...childPositions.map((p)=>p.centerX)); + const rightmostX = Math.max(...childPositions.map((p)=>p.centerX)); + newConnections.push({ + from: { + x: leftmostX, + y: verticalLineY + }, + to: { + x: rightmostX, + y: verticalLineY + }, + type: 'horizontal' + }); + } + // 每个子节点的垂直连线 + childPositions.forEach((child)=>{ + newConnections.push({ + from: { + x: child.centerX, + y: verticalLineY + }, + to: { + x: child.centerX, + y: child.topY + }, + type: 'vertical' + }); + }); + }); + setConnections(newConnections); + }, [ + getMember + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + // 多次尝试计算,确保 DOM 完全渲染 + const timers = []; + timers.push(setTimeout(calculateConnections, 50)); + timers.push(setTimeout(calculateConnections, 150)); + timers.push(setTimeout(calculateConnections, 300)); + timers.push(setTimeout(calculateConnections, 500)); + // 监听窗口大小变化 + window.addEventListener('resize', calculateConnections); + return ()=>{ + timers.forEach((timer)=>clearTimeout(timer)); + window.removeEventListener('resize', calculateConnections); + }; + }, [ + calculateConnections, + treeData + ]); + if (!root) return null; + // 递归渲染树节点 + const TreeNode = ({ memberId, isRoot = false })=>{ + const member = getMember(memberId); + if (!member) return null; + const hasChildren = member.childrenIds && member.childrenIds.length > 0; + // 获取配偶(取第一个配偶) + const spouse = member.spouseIds && member.spouseIds.length > 0 ? getMember(member.spouseIds[0]) : undefined; + 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$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 items-center", + 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", { + ref: (el)=>{ + if (el) { + nodeRefs.current.set(memberId, el); + } else { + nodeRefs.current.delete(memberId); + } + }, + className: "relative z-10", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$family$2d$node$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["FamilyNode"], { + member: member, + spouse: spouse, + onSelect: handleNodeClick, + isRoot: isRoot, + isHighlighted: member.id === highlightedMemberId, + relationMode: relationMode, + isSelected: selectedMembers.includes(member.id) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 160, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 150, + columnNumber: 9 + }, this), + hasChildren && /*#__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-start relative", + style: { + marginTop: `${VERTICAL_GAP}px`, + gap: `${HORIZONTAL_GAP}px` + }, + children: member.childrenIds.map((childId)=>/*#__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"])(TreeNode, { + memberId: childId + }, childId, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 181, + columnNumber: 15 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 173, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 148, + columnNumber: 7 + }, this); + }; + 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$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: "relative", + 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", { + ref: containerRef, + className: "p-12 min-w-fit relative", + style: { + minHeight: '100%' + }, + 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: "absolute inset-0 pointer-events-none", + style: { + zIndex: 1 + }, + children: connections.map((conn, index)=>{ + const isHorizontal = conn.type === 'horizontal'; + // 使用 1px 但通过 transform scale 缩小来实现细线 + const width = isHorizontal ? Math.abs(conn.to.x - conn.from.x) : 1; + const height = isHorizontal ? 1 : Math.abs(conn.to.y - conn.from.y); + const left = Math.min(conn.from.x, conn.to.x); + const top = Math.min(conn.from.y, conn.to.y); + // 跳过无效的连线(宽度或高度为0) + if (width <= 0 || height <= 0) return null; + 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$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 bg-foreground/25", + style: { + left: `${left}px`, + top: `${top}px`, + width: `${width}px`, + height: `${height}px`, + transform: isHorizontal ? 'scaleY(0.3)' : 'scaleX(0.3)', + transformOrigin: 'top left' + } + }, index, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 206, + columnNumber: 15 + }, this); + }) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 193, + 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", { + className: "relative", + style: { + zIndex: 10 + }, + 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"])(TreeNode, { + memberId: rootId, + isRoot: true + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 224, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 223, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 191, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 190, + columnNumber: 5 + }, this); +} +}), +"[externals]/fs [external] (fs, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("fs", () => require("fs")); + +module.exports = mod; +}), +"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("path", () => require("path")); + +module.exports = mod; +}), +"[externals]/worker_threads [external] (worker_threads, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("worker_threads", () => require("worker_threads")); + +module.exports = mod; +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "D3OrgChartFlow", + ()=>D3OrgChartFlow +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$40$7$2e$9$2e$0$2f$node_modules$2f$d3$2f$src$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3@7.9.0/node_modules/d3/src/index.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$selection$40$3$2e$0$2e$0$2f$node_modules$2f$d3$2d$selection$2f$src$2f$select$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__select$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js [app-ssr] (ecmascript) "); +// @ts-ignore - d3-org-chart没有TypeScript类型定义 +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$org$2d$chart$40$3$2e$1$2e$1$2f$node_modules$2f$d3$2d$org$2d$chart$2f$src$2f$d3$2d$org$2d$chart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3-org-chart@3.1.1/node_modules/d3-org-chart/src/d3-org-chart.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$jspdf$40$3$2e$0$2e$4$2f$node_modules$2f$jspdf$2f$dist$2f$jspdf$2e$node$2e$min$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/jspdf@3.0.4/node_modules/jspdf/dist/jspdf.node.min.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +// 计算年龄 +function calculateAge(birthDate, deathDate) { + if (!birthDate) return null; + const birth = new Date(birthDate); + const end = deathDate ? new Date(deathDate) : new Date(); + let age = end.getFullYear() - birth.getFullYear(); + const monthDiff = end.getMonth() - birth.getMonth(); + if (monthDiff < 0 || monthDiff === 0 && end.getDate() < birth.getDate()) { + age--; + } + return age; +} +const D3OrgChartFlowComponent = /*#__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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["forwardRef"])(({ members, rootId, onMemberClick, onExport, relationMode = false, selectedMembers = [] }, ref)=>{ + console.log('D3OrgChartFlow render, selectedMembers:', selectedMembers, 'relationMode:', relationMode); + const chartRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const chartInstanceRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const [isReady, setIsReady] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [avatarCache, setAvatarCache] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(new Map()); + // 转换数据格式 + const convertToChartData = ()=>{ + const chartNodes = []; + // 首先找到根节点(没有父节点的节点) + const rootMember = members[rootId]; + if (!rootMember) return []; + // 使用BFS遍历,确保只包含从rootId开始的树 + const visited = new Set(); + const queue = [ + rootId + ]; + while(queue.length > 0){ + const currentId = queue.shift(); + if (visited.has(currentId)) continue; + visited.add(currentId); + const member = members[currentId]; + if (!member) continue; + // 获取配偶信息,确保配偶存在于members中 + let spouse = null; + if (member.spouseIds?.[0] && members[member.spouseIds[0]]) { + spouse = members[member.spouseIds[0]]; + } + // 确定父节点ID - 只有根节点的parentId为null + let parentId = null; + if (currentId !== rootId) { + // 根据姓氏判断主线,优先选择同姓的父母 + const father = member.fatherId ? members[member.fatherId] : null; + const mother = member.motherId ? members[member.motherId] : null; + // 判断父母中谁是家族主线(同姓) + const isFatherMainLine = father && member.surname === father.surname; + const isMotherMainLine = mother && member.surname === mother.surname; + if (isFatherMainLine) { + parentId = member.fatherId || null; + } else if (isMotherMainLine) { + parentId = member.motherId || null; + } else if (father) { + // 如果都不同姓,优先选择父亲 + parentId = member.fatherId || null; + } else if (mother) { + parentId = member.motherId || null; + } + } + // 计算年龄文本 + const age = calculateAge(member.birthDate, member.deathDate); + const ageText = age !== null ? member.deathDate ? `享年${age}岁` : `${age}岁` : ''; + chartNodes.push({ + id: member.id, + parentId: parentId, + name: member.fullName, + generation: `第${member.generation}世`, + birthYear: member.birthDate ? new Date(member.birthDate).getFullYear().toString() : '', + deathYear: member.deathDate ? new Date(member.deathDate).getFullYear().toString() : '', + birthPlace: member.birthPlace || '', + gender: member.gender === 'MALE' ? '男' : '女', + avatarImageId: member.avatarImageId, + spouseName: spouse?.fullName || '', + spouseId: spouse?.id || null, + hasChildren: Object.values(members).some((m)=>m.fatherId === member.id || m.motherId === member.id), + ageText: ageText + }); + // 添加子节点到队列 + Object.values(members).forEach((m)=>{ + if ((m.fatherId === currentId || m.motherId === currentId) && !visited.has(m.id)) { + queue.push(m.id); + } + }); + } + return chartNodes; + }; + // 加载所有成员的头像 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const loadAvatars = async ()=>{ + const cache = new Map(); + for (const member of Object.values(members)){ + if (member.avatarImageId) { + try { + const image = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["db"].images.get(member.avatarImageId); + if (image) { + const url = URL.createObjectURL(image.blob); + cache.set(member.avatarImageId, url); + } + } catch (error) { + console.error(`Failed to load avatar for ${member.fullName}:`, error); + } + } + } + setAvatarCache(cache); + }; + loadAvatars(); + // 清理函数 + return ()=>{ + avatarCache.forEach((url)=>URL.revokeObjectURL(url)); + }; + }, [ + members + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + if (!chartRef.current || !rootId) return; + // 清理旧的图表 + if (chartRef.current) { + chartRef.current.innerHTML = ''; + } + const data = convertToChartData(); + // 初始化图表 + const chart = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$org$2d$chart$40$3$2e$1$2e$1$2f$node_modules$2f$d3$2d$org$2d$chart$2f$src$2f$d3$2d$org$2d$chart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["OrgChart"]().container(chartRef.current).data(data).nodeWidth(()=>160).nodeHeight(()=>120).childrenMargin(()=>50).compactMarginBetween(()=>35).compactMarginPair(()=>35).neighbourMargin(()=>35).siblingsMargin(()=>35).linkUpdate(function(d, i, arr) { + // 加深连线颜色 + __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$selection$40$3$2e$0$2e$0$2f$node_modules$2f$d3$2d$selection$2f$src$2f$select$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__select$3e$__["select"](arr[i]).attr('stroke', '#475569').attr('stroke-width', 2.5); + }).buttonContent(({ node })=>{ + return `
${node.children ? `` : ``} ${node.data._directSubordinates || 0}
`; + }).nodeContent((d)=>{ + const node = d.data; + const color = node.gender === '男' ? '#3b82f6' : '#ec4899'; + const bgColor = node.gender === '男' ? '#dbeafe' : '#fce7f3'; + // 获取头像URL + const avatarUrl = node.avatarImageId ? avatarCache.get(node.avatarImageId) : null; + // 检查是否被选中 + const isSelected = selectedMembers.includes(node.id); + return ` +
+
+
+ ${avatarUrl ? `${node.name}` : node.gender === '女' ? `` : ``} +
+
+
+ ${node.name} + ${isSelected ? `` : ''} +
+
+ ${node.generation} +
+
+
+ +
+ ${node.birthYear ? `
+ ${node.birthYear}${node.deathYear ? ` - ${node.deathYear}` : ''} + ${node.ageText ? `${node.ageText}` : ''} +
` : ''} + ${node.birthPlace ? `
+ ${node.birthPlace} +
` : ''} +
+ + ${node.spouseName && node.spouseId ? ` +
+ 配偶: ${node.spouseName} +
+ ` : ''} + + ${node.deathYear ? ` +
+ ` : ''} +
+ `; + }).onNodeClick((d)=>{ + if (onMemberClick && d) { + // d3-org-chart传递的是节点数据对象,需要提取id + const nodeId = typeof d === 'string' ? d : d.data?.id || d.id; + if (nodeId) { + onMemberClick(nodeId); + } + } + }).render().expandAll() // 初始化时展开所有节点 + ; + // 添加配偶区域点击事件监听 + setTimeout(()=>{ + const spouseAreas = chartRef.current?.querySelectorAll('.spouse-area'); + spouseAreas?.forEach((area)=>{ + area.addEventListener('click', (e)=>{ + e.stopPropagation(); // 阻止事件冒泡到节点 + const spouseId = area.getAttribute('data-spouse-id'); + if (spouseId && onMemberClick) { + onMemberClick(spouseId); + } + }); + }); + }, 100); + chartInstanceRef.current = chart; + setIsReady(true); + return ()=>{ + // 清理 + if (chartRef.current) { + chartRef.current.innerHTML = ''; + } + }; + }, [ + members, + rootId, + onMemberClick, + avatarCache + ]); + // 监听selectedMembers变化,动态显示/隐藏勾选图标 + // 逻辑已移至tree/page.tsx以避免组件重新渲染 + // 导出PNG + const handleExportPNG = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.exportImg({ + save: true, + full: true, + onLoad: ()=>{ + onExport?.(); + } + }); + }; + // 导出PDF + const handleExportPDF = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.exportImg({ + save: false, + full: true, + onLoad: (base64)=>{ + const pdf = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$jspdf$40$3$2e$0$2e$4$2f$node_modules$2f$jspdf$2f$dist$2f$jspdf$2e$node$2e$min$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"]({ + orientation: 'landscape', + unit: 'px', + format: 'a4' + }); + const img = new Image(); + img.src = base64; + img.onload = function() { + const imgWidth = img.width; + const imgHeight = img.height; + const pdfWidth = pdf.internal.pageSize.getWidth(); + const pdfHeight = pdf.internal.pageSize.getHeight(); + // 计算缩放比例以适应页面 + const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight); + const scaledWidth = imgWidth * ratio; + const scaledHeight = imgHeight * ratio; + // 居中放置 + const x = (pdfWidth - scaledWidth) / 2; + const y = (pdfHeight - scaledHeight) / 2; + pdf.addImage(img, 'PNG', x, y, scaledWidth, scaledHeight); + pdf.save(`家谱图-${new Date().toISOString().split('T')[0]}.pdf`); + onExport?.(); + }; + } + }); + }; + // 展开所有节点 + const handleExpandAll = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.expandAll(); + }; + // 折叠所有节点 + const handleCollapseAll = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.collapseAll(); + }; + // 适应视图 + const handleFitView = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.fit(); + }; + // 暴露方法给父组件 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useImperativeHandle"])(ref, ()=>({ + exportPNG: handleExportPNG, + exportPDF: handleExportPDF, + expandAll: handleExpandAll, + collapseAll: handleCollapseAll, + fitView: handleFitView + })); + 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$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: "w-full h-full bg-background rounded-lg border relative", + 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", { + ref: chartRef, + className: "w-full h-full", + style: { + overflow: 'hidden' + } + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx", + lineNumber: 446, + columnNumber: 7 + }, ("TURBOPACK compile-time value", void 0)) + }, `d3-chart-${rootId}`, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx", + lineNumber: 444, + columnNumber: 5 + }, ("TURBOPACK compile-time value", void 0)); +}); +D3OrgChartFlowComponent.displayName = 'D3OrgChartFlow'; +const D3OrgChartFlow = /*#__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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["memo"])(D3OrgChartFlowComponent, (prevProps, nextProps)=>{ + return prevProps.rootId === nextProps.rootId && prevProps.members === nextProps.members; +}); +}), +"[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "RelationshipCalculator", + ()=>RelationshipCalculator +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/relationship.js@1.2.7/node_modules/relationship.js/dist/relationship.min.mjs [app-ssr] (ecmascript)"); +; +class RelationshipCalculator { + members; + constructor(members){ + this.members = new Map(members.map((m)=>[ + m.id, + m + ])); + } + /** + * 计算两个成员之间的关系 + * @param fromId 起始成员ID(成员A) + * @param toId 目标成员ID(成员B) + * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX) + */ getRelationship(fromId, toId) { + if (fromId === toId) { + return { + term: '本人', + path: '', + success: true + }; + } + const fromMember = this.members.get(fromId); + const toMember = this.members.get(toId); + if (!fromMember || !toMember) { + return { + term: '未知', + path: '', + success: false, + error: '成员不存在' + }; + } + // 构建关系路径(从 fromId 到 toId) + const path = this.buildRelationPath(fromId, toId); + if (!path) { + return { + term: '无血缘关系', + path: '', + success: false + }; + } + // 将路径转换为中文 + const chinesePath = this.pathToChineseText(path); + // 使用 relationship.js 计算关系 + try { + // 获取fromId成员的性别(从谁的角度看关系) + const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1; + // 计算关系(toId 对 fromId 的称谓) + const result = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])({ + text: chinesePath, + target: '', + sex: fromMemberGender, + reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓 + }); + const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'; + return { + term, + path: chinesePath, + success: true + }; + } catch (error) { + return { + term: '亲戚', + path: chinesePath, + success: true + }; + } + } + /** + * 构建关系路径字符串 + * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子 + * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹 + */ buildRelationPath(fromId, toId) { + // 使用BFS查找最短路径 + const queue = [ + { + id: fromId, + path: '' + } + ]; + const visited = new Set(); + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + return path; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + queue.push({ + id: member.fatherId, + path: path + 'f' + }); + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + queue.push({ + id: member.motherId, + path: path + 'm' + }); + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const spousePath = member.gender === 'MALE' ? 'w' : 'h'; + queue.push({ + id: spouseId, + path: path + spousePath + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const childPath = child.gender === 'MALE' ? 's' : 'd'; + queue.push({ + id: childId, + path: path + childPath + }); + } + } + } + } + // 兄弟姐妹(通过父母查找) + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹 + const siblingPath = this.getSiblingPath(member, sibling); + queue.push({ + id: siblingId, + path: path + siblingPath + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹 + */ getSiblings(memberId) { + const member = this.members.get(memberId); + if (!member) return []; + const siblings = []; + // 通过父亲查找 + if (member.fatherId) { + const father = this.members.get(member.fatherId); + if (father?.childrenIds) { + siblings.push(...father.childrenIds.filter((id)=>id !== memberId)); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = this.members.get(member.motherId); + if (mother?.childrenIds) { + for (const childId of mother.childrenIds){ + if (childId !== memberId && !siblings.includes(childId)) { + siblings.push(childId); + } + } + } + } + return siblings; + } + /** + * 获取兄弟姐妹关系路径 + */ getSiblingPath(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + // 男性:哥哥(ob) 或 弟弟(lb) + return toAge > fromAge ? 'ob' : 'lb'; + } else { + // 女性:姐姐(os) 或 妹妹(ls) + return toAge > fromAge ? 'os' : 'ls'; + } + } + /** + * 获取年龄(用于比较) + */ getAge(member) { + if (!member.birthDate) return 0; + const birthYear = new Date(member.birthDate).getFullYear(); + return new Date().getFullYear() - birthYear; + } + /** + * 获取关系的详细说明 + */ getRelationshipDetail(fromId, toId) { + const result = this.getRelationship(fromId, toId); + if (!result.success) { + return { + ...result, + description: result.error || '无法计算关系' + }; + } + // 构建带人名的路径(从 fromId 到 toId) + const pathWithNames = this.buildPathWithNames(fromId, toId); + // 只返回关系称谓,不包含完整句子 + return { + ...result, + path: pathWithNames || result.path, + description: result.term + }; + } + /** + * 构建带人名的路径描述 + * @param fromId 起始ID(查询的起点) + * @param toId 目标ID(查询的终点) + */ buildPathWithNames(fromId, toId) { + const queue = [ + { + id: fromId, + path: [] + } + ]; + const visited = new Set(); + // 获取起始成员名字 + const startMember = this.members.get(fromId); + const startName = startMember?.fullName || '未知'; + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + // 构建路径字符串:从起点到终点 + if (path.length === 0) return '本人'; + // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ... + const pathStr = path.map((p)=>`${p.relation}(${p.name})`).join(' → '); + return `${startName} → ${pathStr}`; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + const father = this.members.get(member.fatherId); + if (father) { + queue.push({ + id: member.fatherId, + path: [ + ...path, + { + name: father.fullName, + relation: '父亲' + } + ] + }); + } + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + const mother = this.members.get(member.motherId); + if (mother) { + queue.push({ + id: member.motherId, + path: [ + ...path, + { + name: mother.fullName, + relation: '母亲' + } + ] + }); + } + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const relation = member.gender === 'MALE' ? '妻子' : '丈夫'; + queue.push({ + id: spouseId, + path: [ + ...path, + { + name: spouse.fullName, + relation + } + ] + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const relation = child.gender === 'MALE' ? '儿子' : '女儿'; + queue.push({ + id: childId, + path: [ + ...path, + { + name: child.fullName, + relation + } + ] + }); + } + } + } + } + // 兄弟姐妹 + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + const siblingPath = this.getSiblingRelationName(member, sibling); + queue.push({ + id: siblingId, + path: [ + ...path, + { + name: sibling.fullName, + relation: siblingPath + } + ] + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹关系名称 + */ getSiblingRelationName(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + return toAge > fromAge ? '哥哥' : '弟弟'; + } else { + return toAge > fromAge ? '姐姐' : '妹妹'; + } + } + /** + * 计算路径长度(关系代数) + */ calculatePathLength(path) { + let length = 0; + let i = 0; + while(i < path.length){ + // 两字符的关系 + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if ([ + 'ob', + 'lb', + 'os', + 'ls' + ].includes(twoChar)) { + length++; + i += 2; + continue; + } + } + // 单字符的关系 + length++; + i++; + } + return length; + } + /** + * 将符号路径转换为中文文本 + * 例如:'fm' -> '父亲的母亲' + */ pathToChineseText(path) { + const pathMap = { + 'f': '父亲', + 'm': '母亲', + 'h': '丈夫', + 'w': '妻子', + 's': '儿子', + 'd': '女儿', + 'ob': '哥哥', + 'lb': '弟弟', + 'os': '姐姐', + 'ls': '妹妹' + }; + const parts = []; + let i = 0; + while(i < path.length){ + // 处理两字符的关系(如 ob, lb, os, ls) + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if (pathMap[twoChar]) { + parts.push(pathMap[twoChar]); + i += 2; + continue; + } + } + // 处理单字符的关系 + const oneChar = path[i]; + if (pathMap[oneChar]) { + parts.push(pathMap[oneChar]); + } + i++; + } + return parts.join('的'); + } + /** + * 将路径转换为中文描述(带"的"字) + */ getPathDescription(path) { + const pathMap = { + 'f': '的父亲', + 'm': '的母亲', + 'h': '的丈夫', + 'w': '的妻子', + 's': '的儿子', + 'd': '的女儿', + 'ob': '的哥哥', + 'lb': '的弟弟', + 'os': '的姐姐', + 'ls': '的妹妹' + }; + let description = ''; + for (const char of path){ + description += pathMap[char] || ''; + } + return description || '本人'; + } +} +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "useRelationship", + ()=>useRelationship +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)"); +; +; +; +function useRelationship() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const [loading, setLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + /** + * 计算两个成员之间的关系(客户端计算) + */ const calculateRelationship = (fromId, toId)=>{ + const members = Object.values(treeData.members); + const calculator = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RelationshipCalculator"](members); + return calculator.getRelationshipDetail(fromId, toId); + }; + /** + * 通过API计算关系(服务端计算) + */ const calculateRelationshipAPI = async (treeId, fromId, toId)=>{ + setLoading(true); + try { + const response = await fetch(`/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`); + if (!response.ok) { + throw new Error('计算关系失败'); + } + const data = await response.json(); + return { + term: data.relationship, + path: data.path, + description: data.description, + success: data.success + }; + } catch (error) { + console.error('计算关系失败:', error); + return null; + } finally{ + setLoading(false); + } + }; + /** + * 获取成员的所有直系亲属 + */ const getDirectRelatives = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return null; + const relatives = { + father: member.fatherId ? treeData.members[member.fatherId] : null, + mother: member.motherId ? treeData.members[member.motherId] : null, + spouses: member.spouseIds?.map((id)=>treeData.members[id]).filter(Boolean) || [], + children: member.childrenIds?.map((id)=>treeData.members[id]).filter(Boolean) || [] + }; + return relatives; + }; + /** + * 获取成员的所有兄弟姐妹 + */ const getSiblings = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return []; + const siblings = new Set(); + // 通过父亲查找 + if (member.fatherId) { + const father = treeData.members[member.fatherId]; + if (father?.childrenIds) { + father.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = treeData.members[member.motherId]; + if (mother?.childrenIds) { + mother.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + return Array.from(siblings).map((id)=>treeData.members[id]).filter(Boolean); + }; + /** + * 获取成员的所有祖先 + */ const getAncestors = (memberId, maxGenerations = 10)=>{ + const ancestors = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + ancestors.push({ + ...member, + generationDiff: generation + }); + } + if (member.fatherId) { + queue.push({ + id: member.fatherId, + generation: generation + 1 + }); + } + if (member.motherId) { + queue.push({ + id: member.motherId, + generation: generation + 1 + }); + } + } + return ancestors; + }; + /** + * 获取成员的所有后代 + */ const getDescendants = (memberId, maxGenerations = 10)=>{ + const descendants = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + descendants.push({ + ...member, + generationDiff: generation + }); + } + if (member.childrenIds) { + member.childrenIds.forEach((childId)=>{ + queue.push({ + id: childId, + generation: generation + 1 + }); + }); + } + } + return descendants; + }; + return { + calculateRelationship, + calculateRelationshipAPI, + getDirectRelatives, + getSiblings, + getAncestors, + getDescendants, + loading + }; +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Dialog", + ()=>Dialog, + "DialogClose", + ()=>DialogClose, + "DialogContent", + ()=>DialogContent, + "DialogDescription", + ()=>DialogDescription, + "DialogFooter", + ()=>DialogFooter, + "DialogHeader", + ()=>DialogHeader, + "DialogOverlay", + ()=>DialogOverlay, + "DialogPortal", + ()=>DialogPortal, + "DialogTitle", + ()=>DialogTitle, + "DialogTrigger", + ()=>DialogTrigger +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-dialog@1.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_24233bb12d775a77d542be78e3daa22d/node_modules/@radix-ui/react-dialog/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__XIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/x.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function Dialog({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "dialog", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function DialogTrigger({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "dialog-trigger", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 18, + columnNumber: 10 + }, this); +} +function DialogPortal({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + "data-slot": "dialog-portal", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 24, + columnNumber: 10 + }, this); +} +function DialogClose({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Close"], { + "data-slot": "dialog-close", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 30, + columnNumber: 10 + }, this); +} +function DialogOverlay({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Overlay"], { + "data-slot": "dialog-overlay", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 38, + columnNumber: 5 + }, this); +} +function DialogContent({ className, children, showCloseButton = true, ...props }) { + 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$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"])(DialogPortal, { + "data-slot": "dialog-portal", + 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"])(DialogOverlay, {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 59, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "dialog-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', className), + ...props, + children: [ + children, + showCloseButton && /*#__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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Close"], { + "data-slot": "dialog-close", + className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__XIcon$3e$__["XIcon"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 74, + 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"])("span", { + className: "sr-only", + children: "Close" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 75, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 70, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 60, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 58, + columnNumber: 5 + }, this); +} +function DialogHeader({ className, ...props }) { + 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$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", { + "data-slot": "dialog-header", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex flex-col gap-2 text-center sm:text-left', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 85, + columnNumber: 5 + }, this); +} +function DialogFooter({ className, ...props }) { + 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$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", { + "data-slot": "dialog-footer", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 95, + columnNumber: 5 + }, this); +} +function DialogTitle({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Title"], { + "data-slot": "dialog-title", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-lg leading-none font-semibold', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 111, + columnNumber: 5 + }, this); +} +function DialogDescription({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dialog$40$1$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_24233bb12d775a77d542be78e3daa22d$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dialog$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Description"], { + "data-slot": "dialog-description", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground text-sm', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx", + lineNumber: 124, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Badge", + ()=>Badge, + "badgeVariants", + ()=>badgeVariants +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-slot@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-slot/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$class$2d$variance$2d$authority$40$0$2e$7$2e$1$2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +; +; +; +; +const badgeVariants = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$class$2d$variance$2d$authority$40$0$2e$7$2e$1$2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cva"])('inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', { + variants: { + variant: { + default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + destructive: 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground' + } + }, + defaultVariants: { + variant: 'default' + } +}); +function Badge({ className, variant, asChild = false, ...props }) { + const Comp = asChild ? __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Slot"] : 'span'; + 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$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"])(Comp, { + "data-slot": "badge", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])(badgeVariants({ + variant + }), className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx", + lineNumber: 38, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "default", + ()=>TreePage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$tree$2d$layout$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$d3$2d$org$2d$chart$2d$flow$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dialog$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$badge$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/badge.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/zoom-in.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/zoom-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/move.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/download.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$layout$2d$grid$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LayoutGrid$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/layout-grid.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/users.js [app-ssr] (ecmascript) "); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +; +function TreePage() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { calculateRelationship } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRelationship"])(); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [viewMode, setViewMode] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])("traditional"); + // 关系查询模式 + const [relationMode, setRelationMode] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [selectedMembers, setSelectedMembers] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [relationResult, setRelationResult] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [showRelationDialog, setShowRelationDialog] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + // 使用ref存储最新的relationMode值,避免回调重新创建 + const relationModeRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(relationMode); + const selectedMembersRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(selectedMembers); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + relationModeRef.current = relationMode; + selectedMembersRef.current = selectedMembers; + }, [ + relationMode, + selectedMembers + ]); + // 从 URL 参数读取视图模式 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const view = searchParams.get('view'); + if (view === 'd3-org-chart' || view === 'traditional') { + setViewMode(view); + } + }, [ + searchParams + ]); + const [scale, setScale] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(1); + const [position, setPosition] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const [isDragging, setIsDragging] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [startPos, setStartPos] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const [dragStartPos, setDragStartPos] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const containerRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const d3ChartRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const handleMouseDown = (e)=>{ + // 如果点击的是节点卡片,不启动拖拽 + const target = e.target; + if (target.closest('.family-node-card')) { + return; + } + setIsDragging(true); + setStartPos({ + x: e.clientX - position.x, + y: e.clientY - position.y + }); + setDragStartPos({ + x: e.clientX, + y: e.clientY + }); + }; + const handleMouseMove = (e)=>{ + if (!isDragging) return; + // 只有移动超过5px才算拖拽,避免误触 + const deltaX = Math.abs(e.clientX - dragStartPos.x); + const deltaY = Math.abs(e.clientY - dragStartPos.y); + if (deltaX < 5 && deltaY < 5) return; + setPosition({ + x: e.clientX - startPos.x, + y: e.clientY - startPos.y + }); + }; + const handleMouseUp = ()=>{ + setIsDragging(false); + }; + // 处理成员选择(关系查询模式) + const handleMemberClick = (memberId)=>{ + if (selectedMembers.length === 0) { + // 选择第一个成员 + setSelectedMembers([ + memberId + ]); + } else if (selectedMembers.length === 1) { + // 选择第二个成员,计算关系 + const [firstId] = selectedMembers; + if (firstId === memberId) { + // 点击同一个人,取消选择 + setSelectedMembers([]); + return; + } + const result = calculateRelationship(firstId, memberId); + const firstMember = treeData.members[firstId]; + const secondMember = treeData.members[memberId]; + setRelationResult({ + from: firstMember, + to: secondMember, + relationship: result + }); + setShowRelationDialog(true); + setSelectedMembers([]); + setRelationMode(false); + } + }; + // 切换关系查询模式 + const toggleRelationMode = ()=>{ + setRelationMode(!relationMode); + setSelectedMembers([]); + setRelationResult(null); + }; + // 处理对话框关闭 + const handleDialogClose = (open)=>{ + setShowRelationDialog(open); + if (!open && relationResult) { + // 清除选中样式 + const clearNodeStyle = (nodeId)=>{ + const chartContainer = document.querySelector('.w-full.h-full.bg-background.rounded-lg.border'); + const svg = chartContainer?.querySelector('svg'); + if (!svg) return; + const foreignObjects = svg.querySelectorAll('foreignObject'); + foreignObjects.forEach((fo)=>{ + const nodeData = fo.parentNode?.__data__?.data; + if (nodeData?.id === nodeId) { + const nameDiv = fo.querySelector('div[style*="font-size: 13px"]'); + if (nameDiv) { + // 移除勾选图标 + const checkIcon = nameDiv.querySelector('svg'); + if (checkIcon) { + checkIcon.remove(); + } + } + } + }); + }; + clearNodeStyle(relationResult.from.id); + clearNodeStyle(relationResult.to.id); + } + }; + // 使用useCallback创建稳定的回调,通过ref访问最新的relationMode + const handleD3MemberClick = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])((id)=>{ + console.log('D3 onMemberClick triggered:', id, 'relationMode:', relationModeRef.current); + if (relationModeRef.current) { + console.log('Calling handleMemberClick'); + // 更新节点样式的辅助函数 + const updateNodeStyle = (nodeId, isSelected)=>{ + // 从DOM中查找D3图表容器 + const chartContainer = document.querySelector('.w-full.h-full.bg-background.rounded-lg.border'); + const svg = chartContainer?.querySelector('svg'); + if (!svg) return; + const foreignObjects = svg.querySelectorAll('foreignObject'); + foreignObjects.forEach((fo)=>{ + const nodeData = fo.parentNode?.__data__?.data; + if (nodeData?.id === nodeId) { + const nameDiv = fo.querySelector('div[style*="font-size: 13px"]'); + if (nameDiv) { + if (isSelected) { + // 添加勾选图标 + if (!nameDiv.querySelector('svg')) { + const iconHTML = ``; + nameDiv.style.display = 'flex'; + nameDiv.style.alignItems = 'center'; + nameDiv.insertAdjacentHTML('beforeend', iconHTML); + } + } else { + // 移除勾选图标 + const checkIcon = nameDiv.querySelector('svg'); + if (checkIcon) { + checkIcon.remove(); + } + } + } + } + }); + }; + // 直接处理选择逻辑 + if (selectedMembersRef.current.length === 0) { + updateNodeStyle(id, true); + setSelectedMembers([ + id + ]); + } else if (selectedMembersRef.current.length === 1) { + const [firstId] = selectedMembersRef.current; + if (firstId === id) { + updateNodeStyle(id, false); + setSelectedMembers([]); + return; + } + updateNodeStyle(id, true); + const result = calculateRelationship(firstId, id); + const firstMember = treeData.members[firstId]; + const secondMember = treeData.members[id]; + setRelationResult({ + from: firstMember, + to: secondMember, + relationship: result + }); + setShowRelationDialog(true); + setSelectedMembers([]); + setRelationMode(false); + // 选中样式会在对话框关闭时清除 + } + } else { + console.log('Navigating to member detail'); + router.push(`/members/${id}`); + } + }, [ + router, + calculateRelationship, + treeData.members + ]); + const handleExportImage = async ()=>{ + if (!containerRef.current) return; + try { + // 临时重置位置和缩放以获取完整视图 + const originalPosition = { + ...position + }; + const originalScale = scale; + setPosition({ + x: 0, + y: 0 + }); + setScale(1); + // 等待 DOM 更新 + await new Promise((resolve)=>setTimeout(resolve, 800)); + // 找到实际的族谱容器(包含 TreeLayout 的 div) + const treeContainer = containerRef.current.querySelector('div[style*="transform"]'); + if (!treeContainer) { + throw new Error('找不到族谱容器'); + } + // 查找所有连接线(使用更宽泛的选择器) + const allDivs = treeContainer.querySelectorAll('div'); + const lineElements = []; + allDivs.forEach((div)=>{ + const el = div; + const classes = String(el.className || ''); + // 查找包含 bg-foreground 的元素(连接线) + if (classes.includes('bg-foreground')) { + lineElements.push(el); + } + }); + // 克隆容器用于导出 + const clonedContainer = treeContainer.cloneNode(true); + // 在克隆的容器中找到对应的连接线并设置样式 + const clonedDivs = clonedContainer.querySelectorAll('div'); + let lineIndex = 0; + clonedDivs.forEach((div)=>{ + const el = div; + const classes = String(el.className || ''); + if (classes.includes('bg-foreground') && lineElements[lineIndex]) { + const original = lineElements[lineIndex]; + const computed = window.getComputedStyle(original); + // 直接设置内联样式 + el.style.backgroundColor = computed.backgroundColor; + el.style.width = computed.width; + el.style.height = computed.height; + el.style.position = 'absolute'; + el.style.left = computed.left; + el.style.top = computed.top; + lineIndex++; + } + }); + // 移除卡片边框 + clonedContainer.querySelectorAll('*').forEach((child)=>{ + const el = child; + const classes = String(el.className || ''); + // 跳过连接线和连接线容器 + if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) { + return; + } + // 移除其他元素的边框 + el.style.border = 'none'; + el.style.outline = 'none'; + }); + // 临时添加到 DOM + clonedContainer.style.position = 'fixed'; + clonedContainer.style.left = '-9999px'; + clonedContainer.style.top = '0'; + document.body.appendChild(clonedContainer); + // 等待渲染 + await new Promise((resolve)=>setTimeout(resolve, 200)); + // 动态导入 dom-to-image-more(仅在客户端) + const domtoimage = await __turbopack_context__.A("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dom-to-image-more@3.7.2/node_modules/dom-to-image-more/dist/dom-to-image-more.min.js [app-ssr] (ecmascript, async loader)"); + // 使用 toBlob 方法 + const blob = await domtoimage.default.toBlob(clonedContainer, { + quality: 0.95, + bgcolor: '#ffffff' + }); + // 清理克隆的容器 + document.body.removeChild(clonedContainer); + // 恢复原始位置和缩放 + setPosition(originalPosition); + setScale(originalScale); + // 创建下载链接 + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`; + link.href = url; + link.click(); + // 清理 + setTimeout(()=>URL.revokeObjectURL(url), 100); + } catch (error) { + console.error('导出图片失败:', error); + } + }; + // Handle root not found + if (!treeData.rootId) { + 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$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: "min-h-screen bg-background flex flex-col", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 347, + 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", { + className: "flex-1 flex items-center justify-center text-muted-foreground", + children: "暂无家族树数据" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 348, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 346, + columnNumber: 7 + }, this); + } + 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$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-screen flex flex-col bg-muted/30 overflow-hidden", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 355, + 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 top-20 right-4 z-30 flex gap-2", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: relationMode ? "default" : "outline", + className: "gap-2 shadow-lg", + onClick: toggleRelationMode, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__["Users"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 365, + columnNumber: 11 + }, this), + relationMode ? selectedMembers.length === 0 ? '选择第一个成员' : '选择第二个成员' : '关系查询' + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 360, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 shadow-lg", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$layout$2d$grid$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LayoutGrid$3e$__["LayoutGrid"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 374, + columnNumber: 15 + }, this), + viewMode === 'traditional' ? '传统视图' : 'D3家谱图', + /*#__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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 376, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 373, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 372, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "end", + className: "w-48", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', 'traditional'); + router.push(`/tree?${params.toString()}`); + }, + className: viewMode === 'traditional' ? 'bg-accent' : '', + 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 w-full", + 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", { + children: "传统家谱视图" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 389, + columnNumber: 17 + }, this), + viewMode === 'traditional' && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 390, + columnNumber: 48 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 388, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 380, + 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$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', 'd3-org-chart'); + router.push(`/tree?${params.toString()}`); + }, + className: viewMode === 'd3-org-chart' ? 'bg-accent' : '', + 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 w-full", + 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", { + children: "D3 家谱图" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 402, + columnNumber: 17 + }, this), + viewMode === 'd3-org-chart' && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 403, + columnNumber: 49 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 401, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 393, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 379, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 371, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 358, + columnNumber: 7 + }, this), + viewMode === 'traditional' ? /*#__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-1 relative", + 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: "absolute top-4 left-4 z-20 flex flex-col gap-2 bg-background/80 backdrop-blur p-2 rounded-lg border shadow-sm", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setScale((s)=>Math.min(s + 0.1, 2)), + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__["ZoomIn"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 415, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 414, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setScale((s)=>Math.max(s - 0.1, 0.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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 418, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 417, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setPosition({ + x: 0, + y: 0 + }), + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 421, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 420, + 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"])("div", { + className: "h-px bg-border my-1" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 423, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: handleExportImage, + title: "导出为图片", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__["Download"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 425, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 424, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 413, + 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", { + ref: containerRef, + className: "w-full h-full overflow-hidden cursor-move relative touch-none bg-[url('https://www.transparenttextures.com/patterns/rice-paper.png')] bg-repeat select-none", + onMouseDown: handleMouseDown, + onMouseMove: handleMouseMove, + onMouseUp: handleMouseUp, + onMouseLeave: handleMouseUp, + 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", { + style: { + transform: `translate(${position.x}px, ${position.y}px) scale(${scale})`, + transformOrigin: "top center", + transition: isDragging ? "none" : "transform 0.1s ease-out" + }, + className: "absolute min-w-full min-h-full flex justify-center pt-20 pb-20", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$tree$2d$layout$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TreeLayout"], { + rootId: treeData.rootId, + relationMode: relationMode, + selectedMembers: selectedMembers, + onMemberClick: handleMemberClick + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 446, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 438, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 430, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 411, + 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", { + className: "flex-1 relative", + 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: "absolute top-4 left-4 z-20 flex flex-col gap-2 bg-background/80 backdrop-blur p-2 rounded-lg border shadow-sm", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.expandAll(), + title: "展开全部", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__["ZoomIn"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 460, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 459, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.collapseAll(), + title: "折叠全部", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 463, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 462, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.fitView(), + title: "适应视图", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 466, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 465, + 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"])("div", { + className: "h-px bg-border my-1" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 468, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.exportPNG(), + title: "导出PNG", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__["Download"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 470, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 469, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 458, + 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", { + className: "w-full h-full p-4", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$d3$2d$org$2d$chart$2d$flow$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["D3OrgChartFlow"], { + ref: d3ChartRef, + members: treeData.members, + rootId: treeData.rootId, + relationMode: relationMode, + selectedMembers: selectedMembers, + onMemberClick: handleD3MemberClick + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 475, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 474, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 456, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dialog$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Dialog"], { + open: showRelationDialog, + onOpenChange: handleDialogClose, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dialog$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DialogContent"], { + className: "max-w-2xl", + "aria-describedby": "relation-description", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dialog$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DialogHeader"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dialog$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DialogTitle"], { + children: "关系查询结果" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 491, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 490, + columnNumber: 11 + }, this), + relationResult && /*#__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-4", + 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-4 p-6 bg-muted rounded-lg", + 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: "text-center", + 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: "text-2xl font-bold font-serif mb-1", + children: relationResult.from.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 499, + 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: "text-sm text-muted-foreground", + children: [ + "第", + relationResult.from.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 502, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 498, + 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: "flex flex-col items-center gap-2", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$badge$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Badge"], { + variant: "default", + className: "text-lg px-4 py-2", + children: relationResult.relationship.term + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 508, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 507, + 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", + 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: "text-2xl font-bold font-serif mb-1", + children: relationResult.to.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 514, + 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: "text-sm text-muted-foreground", + children: [ + "第", + relationResult.to.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 517, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 513, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 497, + 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", { + id: "relation-description", + className: "p-4 bg-blue-50 dark:bg-blue-950 rounded-lg", + 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: "text-sm font-medium mb-1", + children: "关系说明:" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 525, + 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-muted-foreground", + 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"])("strong", { + children: relationResult.from.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 527, + 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"])("strong", { + children: relationResult.to.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 527, + columnNumber: 69 + }, 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"])("strong", { + className: "text-primary", + children: relationResult.relationship.term + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 527, + columnNumber: 117 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 526, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 524, + columnNumber: 15 + }, this), + relationResult.relationship.path && /*#__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: "p-4 bg-muted rounded-lg", + 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: "text-sm font-medium mb-2", + children: "关系路径:" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 534, + 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: "text-xs text-muted-foreground break-all", + children: relationResult.relationship.path + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 535, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 533, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 495, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 489, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 488, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 354, + columnNumber: 5 + }, this); +} +}), +]; + +//# sourceMappingURL=%5Broot-of-the-server%5D__a5d92604._.js.map \ No newline at end of file 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 new file mode 100644 index 00000000..fb200c39 --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__a5d92604._.js.map @@ -0,0 +1,18 @@ +{ + "version": 3, + "sources": [], + "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 } 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 {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": 1187, "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": 1220, "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": 1281, "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 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, isRoot, onSelect, isHighlighted, relationMode, isSelected }: FamilyNodeProps) {\n if (!spouse) {\n return \n }\n \n // 有配偶时,并排显示\n return (\n
\n \n \n \n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1497, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx"],"sourcesContent":["\"use client\"\nimport type { FamilyMember } from \"@/types/family\"\nimport { FamilyNode } from \"./family-node\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useEffect, useRef, useState, useCallback } from \"react\"\nimport { useRouter } from \"next/navigation\"\n\ninterface TreeLayoutProps {\n rootId: string\n onSelectMember?: (member: FamilyMember) => void\n relationMode?: boolean\n selectedMembers?: string[]\n onMemberClick?: (memberId: string) => void\n}\n\ninterface Connection {\n from: { x: number; y: number }\n to: { x: number; y: number }\n type: 'vertical' | 'horizontal'\n}\n\nexport function TreeLayout({ \n rootId, \n onSelectMember,\n relationMode = false,\n selectedMembers = [],\n onMemberClick\n}: TreeLayoutProps) {\n const { getMember, treeData, highlightedMemberId } = useFamily()\n const root = getMember(rootId)\n const router = useRouter()\n const containerRef = useRef(null)\n const [connections, setConnections] = useState([])\n const nodeRefs = useRef>(new Map())\n\n // 节点间距配置\n const HORIZONTAL_GAP = 32 // 2rem = 32px\n const VERTICAL_GAP = 48 // 3rem = 48px\n const CONNECTOR_HEIGHT = 48 // 连接线垂直高度\n \n // 处理节点点击\n const handleNodeClick = useCallback((member: FamilyMember) => {\n if (relationMode && onMemberClick) {\n onMemberClick(member.id)\n } else {\n router.push(`/members/${member.id}`)\n }\n }, [relationMode, onMemberClick, router])\n\n // 计算所有连线位置\n const calculateConnections = useCallback(() => {\n const newConnections: Connection[] = []\n const containerRect = containerRef.current?.getBoundingClientRect()\n if (!containerRect) return\n\n // 检查是否有足够的节点已注册\n if (nodeRefs.current.size === 0) return\n\n nodeRefs.current.forEach((nodeElement, nodeId) => {\n const member = getMember(nodeId)\n if (!member || !member.childrenIds || member.childrenIds.length === 0) return\n\n const parentRect = nodeElement.getBoundingClientRect()\n const parentCenterX = parentRect.left + parentRect.width / 2 - containerRect.left\n const parentBottomY = parentRect.bottom - containerRect.top\n\n // 父节点到水平线的垂直连线\n const verticalLineY = parentBottomY + CONNECTOR_HEIGHT / 2\n newConnections.push({\n from: { x: parentCenterX, y: parentBottomY },\n to: { x: parentCenterX, y: verticalLineY },\n type: 'vertical'\n })\n\n // 获取所有子节点的位置\n const childPositions = member.childrenIds\n .map(childId => {\n const childElement = nodeRefs.current.get(childId)\n if (!childElement) return null\n const childRect = childElement.getBoundingClientRect()\n return {\n id: childId,\n centerX: childRect.left + childRect.width / 2 - containerRect.left,\n topY: childRect.top - containerRect.top\n }\n })\n .filter(Boolean) as Array<{ id: string; centerX: number; topY: number }>\n\n if (childPositions.length === 0) return\n\n // 如果有多个子节点,绘制水平连线\n if (childPositions.length > 1) {\n const leftmostX = Math.min(...childPositions.map(p => p.centerX))\n const rightmostX = Math.max(...childPositions.map(p => p.centerX))\n \n newConnections.push({\n from: { x: leftmostX, y: verticalLineY },\n to: { x: rightmostX, y: verticalLineY },\n type: 'horizontal'\n })\n }\n\n // 每个子节点的垂直连线\n childPositions.forEach(child => {\n newConnections.push({\n from: { x: child.centerX, y: verticalLineY },\n to: { x: child.centerX, y: child.topY },\n type: 'vertical'\n })\n })\n })\n\n setConnections(newConnections)\n }, [getMember])\n\n useEffect(() => {\n // 多次尝试计算,确保 DOM 完全渲染\n const timers: NodeJS.Timeout[] = []\n timers.push(setTimeout(calculateConnections, 50))\n timers.push(setTimeout(calculateConnections, 150))\n timers.push(setTimeout(calculateConnections, 300))\n timers.push(setTimeout(calculateConnections, 500))\n \n // 监听窗口大小变化\n window.addEventListener('resize', calculateConnections)\n \n return () => {\n timers.forEach(timer => clearTimeout(timer))\n window.removeEventListener('resize', calculateConnections)\n }\n }, [calculateConnections, treeData])\n\n if (!root) return null\n\n // 递归渲染树节点\n const TreeNode = ({ memberId, isRoot = false }: { memberId: string; isRoot?: boolean }) => {\n const member = getMember(memberId)\n if (!member) return null\n\n const hasChildren = member.childrenIds && member.childrenIds.length > 0\n \n // 获取配偶(取第一个配偶)\n const spouse = member.spouseIds && member.spouseIds.length > 0 \n ? getMember(member.spouseIds[0]) \n : undefined\n\n return (\n
\n {/* 节点本身 */}\n
{\n if (el) {\n nodeRefs.current.set(memberId, el)\n } else {\n nodeRefs.current.delete(memberId)\n }\n }}\n className=\"relative z-10\"\n >\n \n
\n\n {/* 子节点 */}\n {hasChildren && (\n
\n {member.childrenIds.map((childId) => (\n \n ))}\n
\n )}\n
\n )\n }\n\n return (\n
\n
\n {/* 连线层 - 使用 div 绘制 */}\n
\n {connections.map((conn, index) => {\n const isHorizontal = conn.type === 'horizontal'\n // 使用 1px 但通过 transform scale 缩小来实现细线\n const width = isHorizontal ? Math.abs(conn.to.x - conn.from.x) : 1\n const height = isHorizontal ? 1 : Math.abs(conn.to.y - conn.from.y)\n const left = Math.min(conn.from.x, conn.to.x)\n const top = Math.min(conn.from.y, conn.to.y)\n \n // 跳过无效的连线(宽度或高度为0)\n if (width <= 0 || height <= 0) return null\n \n return (\n \n )\n })}\n
\n\n {/* 树节点层 */}\n
\n \n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1787, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState, forwardRef, useImperativeHandle, memo } from \"react\"\nimport * as d3 from \"d3\"\n// @ts-ignore - d3-org-chart没有TypeScript类型定义\nimport { OrgChart } from \"d3-org-chart\"\nimport { Download, FileText } from \"lucide-react\"\nimport type { FamilyMember } from \"@/types/family\"\nimport jsPDF from \"jspdf\"\nimport { db } from \"@/lib/db\"\n\ninterface D3OrgChartFlowProps {\n members: Record\n rootId: string\n onMemberClick?: (memberId: string) => void\n onExport?: () => void\n relationMode?: boolean\n selectedMembers?: string[]\n}\n\nexport interface D3OrgChartRef {\n exportPNG: () => void\n exportPDF: () => void\n expandAll: () => void\n collapseAll: () => void\n fitView: () => void\n}\n\ninterface ChartNode {\n id: string\n parentId: string | null\n name: string\n generation: string\n birthYear: string\n deathYear: string\n birthPlace: string\n gender: string\n avatarImageId: string | null | undefined\n spouseName: string\n spouseId: string | null\n hasChildren: boolean\n ageText: string\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\nconst D3OrgChartFlowComponent = forwardRef(\n ({ members, rootId, onMemberClick, onExport, relationMode = false, selectedMembers = [] }, ref) => {\n console.log('D3OrgChartFlow render, selectedMembers:', selectedMembers, 'relationMode:', relationMode)\n \n const chartRef = useRef(null)\n const chartInstanceRef = useRef(null)\n const [isReady, setIsReady] = useState(false)\n const [avatarCache, setAvatarCache] = useState>(new Map())\n\n // 转换数据格式\n const convertToChartData = (): ChartNode[] => {\n const chartNodes: ChartNode[] = []\n \n // 首先找到根节点(没有父节点的节点)\n const rootMember = members[rootId]\n if (!rootMember) return []\n \n // 使用BFS遍历,确保只包含从rootId开始的树\n const visited = new Set()\n const queue: string[] = [rootId]\n \n while (queue.length > 0) {\n const currentId = queue.shift()!\n if (visited.has(currentId)) continue\n \n visited.add(currentId)\n const member = members[currentId]\n if (!member) continue\n \n // 获取配偶信息,确保配偶存在于members中\n let spouse = null\n if (member.spouseIds?.[0] && members[member.spouseIds[0]]) {\n spouse = members[member.spouseIds[0]]\n }\n \n // 确定父节点ID - 只有根节点的parentId为null\n let parentId: string | null = null\n if (currentId !== rootId) {\n // 根据姓氏判断主线,优先选择同姓的父母\n const father = member.fatherId ? members[member.fatherId] : null\n const mother = member.motherId ? members[member.motherId] : null\n \n // 判断父母中谁是家族主线(同姓)\n const isFatherMainLine = father && member.surname === father.surname\n const isMotherMainLine = mother && member.surname === mother.surname\n \n if (isFatherMainLine) {\n parentId = member.fatherId || null\n } else if (isMotherMainLine) {\n parentId = member.motherId || null\n } else if (father) {\n // 如果都不同姓,优先选择父亲\n parentId = member.fatherId || null\n } else if (mother) {\n parentId = member.motherId || null\n }\n }\n \n // 计算年龄文本\n const age = calculateAge(member.birthDate, member.deathDate)\n const ageText = age !== null\n ? member.deathDate\n ? `享年${age}岁`\n : `${age}岁`\n : ''\n \n chartNodes.push({\n id: member.id,\n parentId: parentId,\n name: member.fullName,\n generation: `第${member.generation}世`,\n birthYear: member.birthDate ? new Date(member.birthDate).getFullYear().toString() : '',\n deathYear: member.deathDate ? new Date(member.deathDate).getFullYear().toString() : '',\n birthPlace: member.birthPlace || '',\n gender: member.gender === 'MALE' ? '男' : '女',\n avatarImageId: member.avatarImageId,\n spouseName: spouse?.fullName || '',\n spouseId: spouse?.id || null,\n hasChildren: Object.values(members).some(m => m.fatherId === member.id || m.motherId === member.id),\n ageText: ageText\n })\n \n // 添加子节点到队列\n Object.values(members).forEach(m => {\n if ((m.fatherId === currentId || m.motherId === currentId) && !visited.has(m.id)) {\n queue.push(m.id)\n }\n })\n }\n \n return chartNodes\n }\n\n // 加载所有成员的头像\n useEffect(() => {\n const loadAvatars = async () => {\n const cache = new Map()\n \n for (const member of Object.values(members)) {\n if (member.avatarImageId) {\n try {\n const image = await db.images.get(member.avatarImageId)\n if (image) {\n const url = URL.createObjectURL(image.blob)\n cache.set(member.avatarImageId, url)\n }\n } catch (error) {\n console.error(`Failed to load avatar for ${member.fullName}:`, error)\n }\n }\n }\n \n setAvatarCache(cache)\n }\n \n loadAvatars()\n \n // 清理函数\n return () => {\n avatarCache.forEach(url => URL.revokeObjectURL(url))\n }\n }, [members])\n\n useEffect(() => {\n if (!chartRef.current || !rootId) return\n\n // 清理旧的图表\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n\n const data = convertToChartData()\n \n // 初始化图表\n const chart = new OrgChart()\n .container(chartRef.current)\n .data(data)\n .nodeWidth(() => 160)\n .nodeHeight(() => 120)\n .childrenMargin(() => 50)\n .compactMarginBetween(() => 35)\n .compactMarginPair(() => 35)\n .neighbourMargin(() => 35)\n .siblingsMargin(() => 35)\n .linkUpdate(function (d: any, i: any, arr: any) {\n // 加深连线颜色\n d3.select(arr[i])\n .attr('stroke', '#475569')\n .attr('stroke-width', 2.5)\n })\n .buttonContent(({ node }: any) => {\n return `
${node.children ? `` : ``} ${node.data._directSubordinates || 0}
`\n })\n .nodeContent((d: any) => {\n const node = d.data\n const color = node.gender === '男' ? '#3b82f6' : '#ec4899'\n const bgColor = node.gender === '男' ? '#dbeafe' : '#fce7f3'\n \n // 获取头像URL\n const avatarUrl = node.avatarImageId ? avatarCache.get(node.avatarImageId) : null\n \n // 检查是否被选中\n const isSelected = selectedMembers.includes(node.id)\n \n return `\n
\n
\n
\n ${avatarUrl \n ? `\"${node.name}\"`\n : node.gender === '女'\n ? ``\n : ``\n }\n
\n
\n
\n ${node.name}\n ${isSelected ? `` : ''}\n
\n
\n ${node.generation}\n
\n
\n
\n \n
\n ${node.birthYear ? `
\n ${node.birthYear}${node.deathYear ? ` - ${node.deathYear}` : ''}\n ${node.ageText ? `${node.ageText}` : ''}\n
` : ''}\n ${node.birthPlace ? `
\n ${node.birthPlace}\n
` : ''}\n
\n \n ${node.spouseName && node.spouseId ? `\n
\n 配偶: ${node.spouseName}\n
\n ` : ''}\n \n ${node.deathYear ? `\n
\n ` : ''}\n
\n `\n })\n .onNodeClick((d: any) => {\n if (onMemberClick && d) {\n // d3-org-chart传递的是节点数据对象,需要提取id\n const nodeId = typeof d === 'string' ? d : (d.data?.id || d.id)\n if (nodeId) {\n onMemberClick(nodeId)\n }\n }\n })\n .render()\n .expandAll() // 初始化时展开所有节点\n\n // 添加配偶区域点击事件监听\n setTimeout(() => {\n const spouseAreas = chartRef.current?.querySelectorAll('.spouse-area')\n spouseAreas?.forEach((area) => {\n area.addEventListener('click', (e) => {\n e.stopPropagation() // 阻止事件冒泡到节点\n const spouseId = (area as HTMLElement).getAttribute('data-spouse-id')\n if (spouseId && onMemberClick) {\n onMemberClick(spouseId)\n }\n })\n })\n }, 100)\n\n chartInstanceRef.current = chart\n setIsReady(true)\n\n return () => {\n // 清理\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n }\n }, [members, rootId, onMemberClick, avatarCache])\n\n // 监听selectedMembers变化,动态显示/隐藏勾选图标\n // 逻辑已移至tree/page.tsx以避免组件重新渲染\n \n // 导出PNG\n const handleExportPNG = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: true,\n full: true,\n onLoad: () => {\n onExport?.()\n }\n })\n }\n\n // 导出PDF\n const handleExportPDF = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: false,\n full: true,\n onLoad: (base64: string) => {\n const pdf = new jsPDF({\n orientation: 'landscape',\n unit: 'px',\n format: 'a4'\n })\n \n const img = new Image()\n img.src = base64\n img.onload = function () {\n const imgWidth = img.width\n const imgHeight = img.height\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n \n // 计算缩放比例以适应页面\n const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight)\n const scaledWidth = imgWidth * ratio\n const scaledHeight = imgHeight * ratio\n \n // 居中放置\n const x = (pdfWidth - scaledWidth) / 2\n const y = (pdfHeight - scaledHeight) / 2\n \n pdf.addImage(img, 'PNG', x, y, scaledWidth, scaledHeight)\n pdf.save(`家谱图-${new Date().toISOString().split('T')[0]}.pdf`)\n onExport?.()\n }\n }\n })\n }\n\n // 展开所有节点\n const handleExpandAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.expandAll()\n }\n\n // 折叠所有节点\n const handleCollapseAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.collapseAll()\n }\n\n // 适应视图\n const handleFitView = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.fit()\n }\n\n // 暴露方法给父组件\n useImperativeHandle(ref, () => ({\n exportPNG: handleExportPNG,\n exportPDF: handleExportPDF,\n expandAll: handleExpandAll,\n collapseAll: handleCollapseAll,\n fitView: handleFitView,\n }))\n\n return (\n
\n {/* 图表容器 */}\n
\n
\n )\n})\n\nD3OrgChartFlowComponent.displayName = 'D3OrgChartFlow'\n\n// 使用memo优化,避免不必要的重新渲染\nexport const D3OrgChartFlow = memo(D3OrgChartFlowComponent, (prevProps, nextProps) => {\n return prevProps.rootId === nextProps.rootId && \n prevProps.members === nextProps.members\n})\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 2166, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts"],"sourcesContent":["import relationship from 'relationship.js'\nimport type { FamilyMember } from '@/types/family'\n\n/**\n * 家族关系计算器\n * 使用 relationship.js 库计算中文亲属关系\n */\nexport class RelationshipCalculator {\n private members: Map\n\n constructor(members: FamilyMember[]) {\n this.members = new Map(members.map(m => [m.id, m]))\n }\n\n /**\n * 计算两个成员之间的关系\n * @param fromId 起始成员ID(成员A)\n * @param toId 目标成员ID(成员B)\n * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX)\n */\n getRelationship(fromId: string, toId: string): RelationshipResult {\n if (fromId === toId) {\n return {\n term: '本人',\n path: '',\n success: true\n }\n }\n\n const fromMember = this.members.get(fromId)\n const toMember = this.members.get(toId)\n\n if (!fromMember || !toMember) {\n return {\n term: '未知',\n path: '',\n success: false,\n error: '成员不存在'\n }\n }\n\n // 构建关系路径(从 fromId 到 toId)\n const path = this.buildRelationPath(fromId, toId)\n \n if (!path) {\n return {\n term: '无血缘关系',\n path: '',\n success: false\n }\n }\n\n // 将路径转换为中文\n const chinesePath = this.pathToChineseText(path)\n \n // 使用 relationship.js 计算关系\n try {\n // 获取fromId成员的性别(从谁的角度看关系)\n const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1\n \n // 计算关系(toId 对 fromId 的称谓)\n const result = relationship({\n text: chinesePath,\n target: '',\n sex: fromMemberGender, // 传入fromId的性别(从谁的角度看)\n reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓\n })\n \n const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'\n \n return {\n term,\n path: chinesePath,\n success: true\n }\n } catch (error) {\n return {\n term: '亲戚',\n path: chinesePath,\n success: true\n }\n }\n }\n\n /**\n * 构建关系路径字符串\n * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子\n * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹\n */\n private buildRelationPath(fromId: string, toId: string): string | null {\n // 使用BFS查找最短路径\n const queue: Array<{ id: string; path: string }> = [{ id: fromId, path: '' }]\n const visited = new Set()\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n return path\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n queue.push({ id: member.fatherId, path: path + 'f' })\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n queue.push({ id: member.motherId, path: path + 'm' })\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const spousePath = member.gender === 'MALE' ? 'w' : 'h'\n queue.push({ id: spouseId, path: path + spousePath })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const childPath = child.gender === 'MALE' ? 's' : 'd'\n queue.push({ id: childId, path: path + childPath })\n }\n }\n }\n }\n\n // 兄弟姐妹(通过父母查找)\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹\n const siblingPath = this.getSiblingPath(member, sibling)\n queue.push({ id: siblingId, path: path + siblingPath })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹\n */\n private getSiblings(memberId: string): string[] {\n const member = this.members.get(memberId)\n if (!member) return []\n\n const siblings: string[] = []\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = this.members.get(member.fatherId)\n if (father?.childrenIds) {\n siblings.push(...father.childrenIds.filter(id => id !== memberId))\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = this.members.get(member.motherId)\n if (mother?.childrenIds) {\n for (const childId of mother.childrenIds) {\n if (childId !== memberId && !siblings.includes(childId)) {\n siblings.push(childId)\n }\n }\n }\n }\n\n return siblings\n }\n\n /**\n * 获取兄弟姐妹关系路径\n */\n private getSiblingPath(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n // 男性:哥哥(ob) 或 弟弟(lb)\n return toAge > fromAge ? 'ob' : 'lb'\n } else {\n // 女性:姐姐(os) 或 妹妹(ls)\n return toAge > fromAge ? 'os' : 'ls'\n }\n }\n\n /**\n * 获取年龄(用于比较)\n */\n private getAge(member: FamilyMember): number {\n if (!member.birthDate) return 0\n const birthYear = new Date(member.birthDate).getFullYear()\n return new Date().getFullYear() - birthYear\n }\n\n /**\n * 获取关系的详细说明\n */\n getRelationshipDetail(fromId: string, toId: string): RelationshipDetail {\n const result = this.getRelationship(fromId, toId)\n \n if (!result.success) {\n return {\n ...result,\n description: result.error || '无法计算关系'\n }\n }\n\n // 构建带人名的路径(从 fromId 到 toId)\n const pathWithNames = this.buildPathWithNames(fromId, toId)\n\n // 只返回关系称谓,不包含完整句子\n return {\n ...result,\n path: pathWithNames || result.path,\n description: result.term\n }\n }\n\n /**\n * 构建带人名的路径描述\n * @param fromId 起始ID(查询的起点)\n * @param toId 目标ID(查询的终点)\n */\n private buildPathWithNames(fromId: string, toId: string): string | null {\n const queue: Array<{ id: string; path: Array<{name: string, relation: string}> }> = [\n { id: fromId, path: [] }\n ]\n const visited = new Set()\n \n // 获取起始成员名字\n const startMember = this.members.get(fromId)\n const startName = startMember?.fullName || '未知'\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n // 构建路径字符串:从起点到终点\n if (path.length === 0) return '本人'\n \n // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ...\n const pathStr = path.map(p => `${p.relation}(${p.name})`).join(' → ')\n return `${startName} → ${pathStr}`\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n const father = this.members.get(member.fatherId)\n if (father) {\n queue.push({\n id: member.fatherId,\n path: [...path, { name: father.fullName, relation: '父亲' }]\n })\n }\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n const mother = this.members.get(member.motherId)\n if (mother) {\n queue.push({\n id: member.motherId,\n path: [...path, { name: mother.fullName, relation: '母亲' }]\n })\n }\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const relation = member.gender === 'MALE' ? '妻子' : '丈夫'\n queue.push({\n id: spouseId,\n path: [...path, { name: spouse.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const relation = child.gender === 'MALE' ? '儿子' : '女儿'\n queue.push({\n id: childId,\n path: [...path, { name: child.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 兄弟姐妹\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n const siblingPath = this.getSiblingRelationName(member, sibling)\n queue.push({\n id: siblingId,\n path: [...path, { name: sibling.fullName, relation: siblingPath }]\n })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹关系名称\n */\n private getSiblingRelationName(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n return toAge > fromAge ? '哥哥' : '弟弟'\n } else {\n return toAge > fromAge ? '姐姐' : '妹妹'\n }\n }\n\n /**\n * 计算路径长度(关系代数)\n */\n private calculatePathLength(path: string): number {\n let length = 0\n let i = 0\n \n while (i < path.length) {\n // 两字符的关系\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (['ob', 'lb', 'os', 'ls'].includes(twoChar)) {\n length++\n i += 2\n continue\n }\n }\n \n // 单字符的关系\n length++\n i++\n }\n \n return length\n }\n\n /**\n * 将符号路径转换为中文文本\n * 例如:'fm' -> '父亲的母亲'\n */\n private pathToChineseText(path: string): string {\n const pathMap: Record = {\n 'f': '父亲',\n 'm': '母亲',\n 'h': '丈夫',\n 'w': '妻子',\n 's': '儿子',\n 'd': '女儿',\n 'ob': '哥哥',\n 'lb': '弟弟',\n 'os': '姐姐',\n 'ls': '妹妹'\n }\n\n const parts: string[] = []\n let i = 0\n \n while (i < path.length) {\n // 处理两字符的关系(如 ob, lb, os, ls)\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (pathMap[twoChar]) {\n parts.push(pathMap[twoChar])\n i += 2\n continue\n }\n }\n \n // 处理单字符的关系\n const oneChar = path[i]\n if (pathMap[oneChar]) {\n parts.push(pathMap[oneChar])\n }\n i++\n }\n\n return parts.join('的')\n }\n\n /**\n * 将路径转换为中文描述(带\"的\"字)\n */\n private getPathDescription(path: string): string {\n const pathMap: Record = {\n 'f': '的父亲',\n 'm': '的母亲',\n 'h': '的丈夫',\n 'w': '的妻子',\n 's': '的儿子',\n 'd': '的女儿',\n 'ob': '的哥哥',\n 'lb': '的弟弟',\n 'os': '的姐姐',\n 'ls': '的妹妹'\n }\n\n let description = ''\n for (const char of path) {\n description += pathMap[char] || ''\n }\n\n return description || '本人'\n }\n}\n\nexport interface RelationshipResult {\n term: string // 关系称谓(如:父亲、堂兄弟)\n path: string // 关系路径(如:f, fbs)\n success: boolean // 是否成功计算\n error?: string // 错误信息\n}\n\nexport interface RelationshipDetail extends RelationshipResult {\n description: string // 关系描述(如:父亲的哥哥的儿子)\n}\n"],"names":[],"mappings":";;;;AAAA;;AAOO,MAAM;IACH,QAAkC;IAE1C,YAAY,OAAuB,CAAE;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAA,IAAK;gBAAC,EAAE,EAAE;gBAAE;aAAE;IACnD;IAEA;;;;;GAKC,GACD,gBAAgB,MAAc,EAAE,IAAY,EAAsB;QAChE,IAAI,WAAW,MAAM;YACnB,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,SAAS;YACX;QACF;QAEA,MAAM,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACpC,MAAM,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAElC,IAAI,CAAC,cAAc,CAAC,UAAU;YAC5B,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,SAAS;gBACT,OAAO;YACT;QACF;QAEA,0BAA0B;QAC1B,MAAM,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ;QAE5C,IAAI,CAAC,MAAM;YACT,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,SAAS;YACX;QACF;QAEA,WAAW;QACX,MAAM,cAAc,IAAI,CAAC,iBAAiB,CAAC;QAE3C,0BAA0B;QAC1B,IAAI;YACF,0BAA0B;YAC1B,MAAM,mBAAmB,WAAW,MAAM,KAAK,WAAW,IAAI;YAE9D,0BAA0B;YAC1B,MAAM,SAAS,IAAA,mSAAY,EAAC;gBAC1B,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,SAAS,KAAM,8BAA8B;YAC/C;YAEA,MAAM,OAAO,MAAM,OAAO,CAAC,WAAW,OAAO,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG;YAEtE,OAAO;gBACL;gBACA,MAAM;gBACN,SAAS;YACX;QACF,EAAE,OAAO,OAAO;YACd,OAAO;gBACL,MAAM;gBACN,MAAM;gBACN,SAAS;YACX;QACF;IACF;IAEA;;;;GAIC,GACD,AAAQ,kBAAkB,MAAc,EAAE,IAAY,EAAiB;QACrE,cAAc;QACd,MAAM,QAA6C;YAAC;gBAAE,IAAI;gBAAQ,MAAM;YAAG;SAAE;QAC7E,MAAM,UAAU,IAAI;QAEpB,MAAO,MAAM,MAAM,GAAG,EAAG;YACvB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK;YAEhC,IAAI,OAAO,MAAM;gBACf,OAAO;YACT;YAEA,IAAI,QAAQ,GAAG,CAAC,KAAK;YACrB,QAAQ,GAAG,CAAC;YAEZ,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,QAAQ;YAEb,QAAQ;YACR,IAAI,OAAO,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG;gBACpD,MAAM,IAAI,CAAC;oBAAE,IAAI,OAAO,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YACrD;YAEA,QAAQ;YACR,IAAI,OAAO,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG;gBACpD,MAAM,IAAI,CAAC;oBAAE,IAAI,OAAO,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YACrD;YAEA,OAAO;YACP,IAAI,OAAO,SAAS,EAAE;gBACpB,KAAK,MAAM,YAAY,OAAO,SAAS,CAAE;oBACvC,IAAI,CAAC,QAAQ,GAAG,CAAC,WAAW;wBAC1B,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBAChC,IAAI,QAAQ;4BACV,MAAM,aAAa,OAAO,MAAM,KAAK,SAAS,MAAM;4BACpD,MAAM,IAAI,CAAC;gCAAE,IAAI;gCAAU,MAAM,OAAO;4BAAW;wBACrD;oBACF;gBACF;YACF;YAEA,QAAQ;YACR,IAAI,OAAO,WAAW,EAAE;gBACtB,KAAK,MAAM,WAAW,OAAO,WAAW,CAAE;oBACxC,IAAI,CAAC,QAAQ,GAAG,CAAC,UAAU;wBACzB,MAAM,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBAC/B,IAAI,OAAO;4BACT,MAAM,YAAY,MAAM,MAAM,KAAK,SAAS,MAAM;4BAClD,MAAM,IAAI,CAAC;gCAAE,IAAI;gCAAS,MAAM,OAAO;4BAAU;wBACnD;oBACF;gBACF;YACF;YAEA,eAAe;YACf,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAQ,EAAE;gBACtC,MAAM,WAAW,IAAI,CAAC,WAAW,CAAC;gBAClC,KAAK,MAAM,aAAa,SAAU;oBAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,YAAY;wBAC3B,MAAM,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBACjC,IAAI,SAAS;4BACX,uBAAuB;4BACvB,MAAM,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ;4BAChD,MAAM,IAAI,CAAC;gCAAE,IAAI;gCAAW,MAAM,OAAO;4BAAY;wBACvD;oBACF;gBACF;YACF;QACF;QAEA,OAAO;IACT;IAEA;;GAEC,GACD,AAAQ,YAAY,QAAgB,EAAY;QAC9C,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,QAAQ,OAAO,EAAE;QAEtB,MAAM,WAAqB,EAAE;QAE7B,SAAS;QACT,IAAI,OAAO,QAAQ,EAAE;YACnB,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ;YAC/C,IAAI,QAAQ,aAAa;gBACvB,SAAS,IAAI,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA,KAAM,OAAO;YAC1D;QACF;QAEA,SAAS;QACT,IAAI,OAAO,QAAQ,EAAE;YACnB,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ;YAC/C,IAAI,QAAQ,aAAa;gBACvB,KAAK,MAAM,WAAW,OAAO,WAAW,CAAE;oBACxC,IAAI,YAAY,YAAY,CAAC,SAAS,QAAQ,CAAC,UAAU;wBACvD,SAAS,IAAI,CAAC;oBAChB;gBACF;YACF;QACF;QAEA,OAAO;IACT;IAEA;;GAEC,GACD,AAAQ,eAAe,IAAkB,EAAE,EAAgB,EAAU;QACnE,MAAM,UAAU,IAAI,CAAC,MAAM,CAAC;QAC5B,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC;QAE1B,IAAI,GAAG,MAAM,KAAK,QAAQ;YACxB,qBAAqB;YACrB,OAAO,QAAQ,UAAU,OAAO;QAClC,OAAO;YACL,qBAAqB;YACrB,OAAO,QAAQ,UAAU,OAAO;QAClC;IACF;IAEA;;GAEC,GACD,AAAQ,OAAO,MAAoB,EAAU;QAC3C,IAAI,CAAC,OAAO,SAAS,EAAE,OAAO;QAC9B,MAAM,YAAY,IAAI,KAAK,OAAO,SAAS,EAAE,WAAW;QACxD,OAAO,IAAI,OAAO,WAAW,KAAK;IACpC;IAEA;;GAEC,GACD,sBAAsB,MAAc,EAAE,IAAY,EAAsB;QACtE,MAAM,SAAS,IAAI,CAAC,eAAe,CAAC,QAAQ;QAE5C,IAAI,CAAC,OAAO,OAAO,EAAE;YACnB,OAAO;gBACL,GAAG,MAAM;gBACT,aAAa,OAAO,KAAK,IAAI;YAC/B;QACF;QAEA,4BAA4B;QAC5B,MAAM,gBAAgB,IAAI,CAAC,kBAAkB,CAAC,QAAQ;QAEtD,kBAAkB;QAClB,OAAO;YACL,GAAG,MAAM;YACT,MAAM,iBAAiB,OAAO,IAAI;YAClC,aAAa,OAAO,IAAI;QAC1B;IACF;IAEA;;;;GAIC,GACD,AAAQ,mBAAmB,MAAc,EAAE,IAAY,EAAiB;QACtE,MAAM,QAA8E;YAClF;gBAAE,IAAI;gBAAQ,MAAM,EAAE;YAAC;SACxB;QACD,MAAM,UAAU,IAAI;QAEpB,WAAW;QACX,MAAM,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACrC,MAAM,YAAY,aAAa,YAAY;QAE3C,MAAO,MAAM,MAAM,GAAG,EAAG;YACvB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK;YAEhC,IAAI,OAAO,MAAM;gBACf,iBAAiB;gBACjB,IAAI,KAAK,MAAM,KAAK,GAAG,OAAO;gBAE9B,oCAAoC;gBACpC,MAAM,UAAU,KAAK,GAAG,CAAC,CAAA,IAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC/D,OAAO,GAAG,UAAU,GAAG,EAAE,SAAS;YACpC;YAEA,IAAI,QAAQ,GAAG,CAAC,KAAK;YACrB,QAAQ,GAAG,CAAC;YAEZ,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,QAAQ;YAEb,QAAQ;YACR,IAAI,OAAO,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG;gBACpD,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ;gBAC/C,IAAI,QAAQ;oBACV,MAAM,IAAI,CAAC;wBACT,IAAI,OAAO,QAAQ;wBACnB,MAAM;+BAAI;4BAAM;gCAAE,MAAM,OAAO,QAAQ;gCAAE,UAAU;4BAAK;yBAAE;oBAC5D;gBACF;YACF;YAEA,QAAQ;YACR,IAAI,OAAO,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG;gBACpD,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ;gBAC/C,IAAI,QAAQ;oBACV,MAAM,IAAI,CAAC;wBACT,IAAI,OAAO,QAAQ;wBACnB,MAAM;+BAAI;4BAAM;gCAAE,MAAM,OAAO,QAAQ;gCAAE,UAAU;4BAAK;yBAAE;oBAC5D;gBACF;YACF;YAEA,OAAO;YACP,IAAI,OAAO,SAAS,EAAE;gBACpB,KAAK,MAAM,YAAY,OAAO,SAAS,CAAE;oBACvC,IAAI,CAAC,QAAQ,GAAG,CAAC,WAAW;wBAC1B,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBAChC,IAAI,QAAQ;4BACV,MAAM,WAAW,OAAO,MAAM,KAAK,SAAS,OAAO;4BACnD,MAAM,IAAI,CAAC;gCACT,IAAI;gCACJ,MAAM;uCAAI;oCAAM;wCAAE,MAAM,OAAO,QAAQ;wCAAE;oCAAS;iCAAE;4BACtD;wBACF;oBACF;gBACF;YACF;YAEA,QAAQ;YACR,IAAI,OAAO,WAAW,EAAE;gBACtB,KAAK,MAAM,WAAW,OAAO,WAAW,CAAE;oBACxC,IAAI,CAAC,QAAQ,GAAG,CAAC,UAAU;wBACzB,MAAM,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBAC/B,IAAI,OAAO;4BACT,MAAM,WAAW,MAAM,MAAM,KAAK,SAAS,OAAO;4BAClD,MAAM,IAAI,CAAC;gCACT,IAAI;gCACJ,MAAM;uCAAI;oCAAM;wCAAE,MAAM,MAAM,QAAQ;wCAAE;oCAAS;iCAAE;4BACrD;wBACF;oBACF;gBACF;YACF;YAEA,OAAO;YACP,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAQ,EAAE;gBACtC,MAAM,WAAW,IAAI,CAAC,WAAW,CAAC;gBAClC,KAAK,MAAM,aAAa,SAAU;oBAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,YAAY;wBAC3B,MAAM,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;wBACjC,IAAI,SAAS;4BACX,MAAM,cAAc,IAAI,CAAC,sBAAsB,CAAC,QAAQ;4BACxD,MAAM,IAAI,CAAC;gCACT,IAAI;gCACJ,MAAM;uCAAI;oCAAM;wCAAE,MAAM,QAAQ,QAAQ;wCAAE,UAAU;oCAAY;iCAAE;4BACpE;wBACF;oBACF;gBACF;YACF;QACF;QAEA,OAAO;IACT;IAEA;;GAEC,GACD,AAAQ,uBAAuB,IAAkB,EAAE,EAAgB,EAAU;QAC3E,MAAM,UAAU,IAAI,CAAC,MAAM,CAAC;QAC5B,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC;QAE1B,IAAI,GAAG,MAAM,KAAK,QAAQ;YACxB,OAAO,QAAQ,UAAU,OAAO;QAClC,OAAO;YACL,OAAO,QAAQ,UAAU,OAAO;QAClC;IACF;IAEA;;GAEC,GACD,AAAQ,oBAAoB,IAAY,EAAU;QAChD,IAAI,SAAS;QACb,IAAI,IAAI;QAER,MAAO,IAAI,KAAK,MAAM,CAAE;YACtB,SAAS;YACT,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE;gBACvB,MAAM,UAAU,KAAK,SAAS,CAAC,GAAG,IAAI;gBACtC,IAAI;oBAAC;oBAAM;oBAAM;oBAAM;iBAAK,CAAC,QAAQ,CAAC,UAAU;oBAC9C;oBACA,KAAK;oBACL;gBACF;YACF;YAEA,SAAS;YACT;YACA;QACF;QAEA,OAAO;IACT;IAEA;;;GAGC,GACD,AAAQ,kBAAkB,IAAY,EAAU;QAC9C,MAAM,UAAkC;YACtC,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;QACR;QAEA,MAAM,QAAkB,EAAE;QAC1B,IAAI,IAAI;QAER,MAAO,IAAI,KAAK,MAAM,CAAE;YACtB,6BAA6B;YAC7B,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE;gBACvB,MAAM,UAAU,KAAK,SAAS,CAAC,GAAG,IAAI;gBACtC,IAAI,OAAO,CAAC,QAAQ,EAAE;oBACpB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAC3B,KAAK;oBACL;gBACF;YACF;YAEA,WAAW;YACX,MAAM,UAAU,IAAI,CAAC,EAAE;YACvB,IAAI,OAAO,CAAC,QAAQ,EAAE;gBACpB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC7B;YACA;QACF;QAEA,OAAO,MAAM,IAAI,CAAC;IACpB;IAEA;;GAEC,GACD,AAAQ,mBAAmB,IAAY,EAAU;QAC/C,MAAM,UAAkC;YACtC,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;QACR;QAEA,IAAI,cAAc;QAClB,KAAK,MAAM,QAAQ,KAAM;YACvB,eAAe,OAAO,CAAC,KAAK,IAAI;QAClC;QAEA,OAAO,eAAe;IACxB;AACF"}}, + {"offset": {"line": 2617, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts"],"sourcesContent":["import { useState } from 'react'\nimport { useFamily } from '@/context/family-context'\nimport { RelationshipCalculator, type RelationshipDetail } from '@/lib/relationship-calculator'\n\n/**\n * 使用家族关系计算的Hook\n */\nexport function useRelationship() {\n const { treeData } = useFamily()\n const [loading, setLoading] = useState(false)\n\n /**\n * 计算两个成员之间的关系(客户端计算)\n */\n const calculateRelationship = (fromId: string, toId: string): RelationshipDetail => {\n const members = Object.values(treeData.members)\n const calculator = new RelationshipCalculator(members)\n return calculator.getRelationshipDetail(fromId, toId)\n }\n\n /**\n * 通过API计算关系(服务端计算)\n */\n const calculateRelationshipAPI = async (\n treeId: string,\n fromId: string,\n toId: string\n ): Promise => {\n setLoading(true)\n try {\n const response = await fetch(\n `/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`\n )\n \n if (!response.ok) {\n throw new Error('计算关系失败')\n }\n\n const data = await response.json()\n return {\n term: data.relationship,\n path: data.path,\n description: data.description,\n success: data.success\n }\n } catch (error) {\n console.error('计算关系失败:', error)\n return null\n } finally {\n setLoading(false)\n }\n }\n\n /**\n * 获取成员的所有直系亲属\n */\n const getDirectRelatives = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return null\n\n const relatives = {\n father: member.fatherId ? treeData.members[member.fatherId] : null,\n mother: member.motherId ? treeData.members[member.motherId] : null,\n spouses: member.spouseIds?.map(id => treeData.members[id]).filter(Boolean) || [],\n children: member.childrenIds?.map(id => treeData.members[id]).filter(Boolean) || []\n }\n\n return relatives\n }\n\n /**\n * 获取成员的所有兄弟姐妹\n */\n const getSiblings = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return []\n\n const siblings = new Set()\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = treeData.members[member.fatherId]\n if (father?.childrenIds) {\n father.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = treeData.members[member.motherId]\n if (mother?.childrenIds) {\n mother.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n return Array.from(siblings).map(id => treeData.members[id]).filter(Boolean)\n }\n\n /**\n * 获取成员的所有祖先\n */\n const getAncestors = (memberId: string, maxGenerations: number = 10) => {\n const ancestors: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n ancestors.push({ ...member, generationDiff: generation })\n }\n\n if (member.fatherId) {\n queue.push({ id: member.fatherId, generation: generation + 1 })\n }\n if (member.motherId) {\n queue.push({ id: member.motherId, generation: generation + 1 })\n }\n }\n\n return ancestors\n }\n\n /**\n * 获取成员的所有后代\n */\n const getDescendants = (memberId: string, maxGenerations: number = 10) => {\n const descendants: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n descendants.push({ ...member, generationDiff: generation })\n }\n\n if (member.childrenIds) {\n member.childrenIds.forEach(childId => {\n queue.push({ id: childId, generation: generation + 1 })\n })\n }\n }\n\n return descendants\n }\n\n return {\n calculateRelationship,\n calculateRelationshipAPI,\n getDirectRelatives,\n getSiblings,\n getAncestors,\n getDescendants,\n loading\n }\n}\n"],"names":[],"mappings":";;;;AAAA;AACA;AACA;;;;AAKO,SAAS;IACd,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,iMAAS;IAC9B,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,uYAAQ,EAAC;IAEvC;;GAEC,GACD,MAAM,wBAAwB,CAAC,QAAgB;QAC7C,MAAM,UAAU,OAAO,MAAM,CAAC,SAAS,OAAO;QAC9C,MAAM,aAAa,IAAI,kNAAsB,CAAC;QAC9C,OAAO,WAAW,qBAAqB,CAAC,QAAQ;IAClD;IAEA;;GAEC,GACD,MAAM,2BAA2B,OAC/B,QACA,QACA;QAEA,WAAW;QACX,IAAI;YACF,MAAM,WAAW,MAAM,MACrB,CAAC,WAAW,EAAE,OAAO,mBAAmB,EAAE,OAAO,IAAI,EAAE,MAAM;YAG/D,IAAI,CAAC,SAAS,EAAE,EAAE;gBAChB,MAAM,IAAI,MAAM;YAClB;YAEA,MAAM,OAAO,MAAM,SAAS,IAAI;YAChC,OAAO;gBACL,MAAM,KAAK,YAAY;gBACvB,MAAM,KAAK,IAAI;gBACf,aAAa,KAAK,WAAW;gBAC7B,SAAS,KAAK,OAAO;YACvB;QACF,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,WAAW;YACzB,OAAO;QACT,SAAU;YACR,WAAW;QACb;IACF;IAEA;;GAEC,GACD,MAAM,qBAAqB,CAAC;QAC1B,MAAM,SAAS,SAAS,OAAO,CAAC,SAAS;QACzC,IAAI,CAAC,QAAQ,OAAO;QAEpB,MAAM,YAAY;YAChB,QAAQ,OAAO,QAAQ,GAAG,SAAS,OAAO,CAAC,OAAO,QAAQ,CAAC,GAAG;YAC9D,QAAQ,OAAO,QAAQ,GAAG,SAAS,OAAO,CAAC,OAAO,QAAQ,CAAC,GAAG;YAC9D,SAAS,OAAO,SAAS,EAAE,IAAI,CAAA,KAAM,SAAS,OAAO,CAAC,GAAG,EAAE,OAAO,YAAY,EAAE;YAChF,UAAU,OAAO,WAAW,EAAE,IAAI,CAAA,KAAM,SAAS,OAAO,CAAC,GAAG,EAAE,OAAO,YAAY,EAAE;QACrF;QAEA,OAAO;IACT;IAEA;;GAEC,GACD,MAAM,cAAc,CAAC;QACnB,MAAM,SAAS,SAAS,OAAO,CAAC,SAAS;QACzC,IAAI,CAAC,QAAQ,OAAO,EAAE;QAEtB,MAAM,WAAW,IAAI;QAErB,SAAS;QACT,IAAI,OAAO,QAAQ,EAAE;YACnB,MAAM,SAAS,SAAS,OAAO,CAAC,OAAO,QAAQ,CAAC;YAChD,IAAI,QAAQ,aAAa;gBACvB,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;oBACzB,IAAI,OAAO,UAAU,SAAS,GAAG,CAAC;gBACpC;YACF;QACF;QAEA,SAAS;QACT,IAAI,OAAO,QAAQ,EAAE;YACnB,MAAM,SAAS,SAAS,OAAO,CAAC,OAAO,QAAQ,CAAC;YAChD,IAAI,QAAQ,aAAa;gBACvB,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;oBACzB,IAAI,OAAO,UAAU,SAAS,GAAG,CAAC;gBACpC;YACF;QACF;QAEA,OAAO,MAAM,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA,KAAM,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;IACrE;IAEA;;GAEC,GACD,MAAM,eAAe,CAAC,UAAkB,iBAAyB,EAAE;QACjE,MAAM,YAAmB,EAAE;QAC3B,MAAM,UAAU,IAAI;QACpB,MAAM,QAAQ;YAAC;gBAAE,IAAI;gBAAU,YAAY;YAAE;SAAE;QAE/C,MAAO,MAAM,MAAM,GAAG,EAAG;YACvB,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK;YAEtC,IAAI,cAAc,kBAAkB,QAAQ,GAAG,CAAC,KAAK;YACrD,QAAQ,GAAG,CAAC;YAEZ,MAAM,SAAS,SAAS,OAAO,CAAC,GAAG;YACnC,IAAI,CAAC,QAAQ;YAEb,IAAI,aAAa,GAAG;gBAClB,UAAU,IAAI,CAAC;oBAAE,GAAG,MAAM;oBAAE,gBAAgB;gBAAW;YACzD;YAEA,IAAI,OAAO,QAAQ,EAAE;gBACnB,MAAM,IAAI,CAAC;oBAAE,IAAI,OAAO,QAAQ;oBAAE,YAAY,aAAa;gBAAE;YAC/D;YACA,IAAI,OAAO,QAAQ,EAAE;gBACnB,MAAM,IAAI,CAAC;oBAAE,IAAI,OAAO,QAAQ;oBAAE,YAAY,aAAa;gBAAE;YAC/D;QACF;QAEA,OAAO;IACT;IAEA;;GAEC,GACD,MAAM,iBAAiB,CAAC,UAAkB,iBAAyB,EAAE;QACnE,MAAM,cAAqB,EAAE;QAC7B,MAAM,UAAU,IAAI;QACpB,MAAM,QAAQ;YAAC;gBAAE,IAAI;gBAAU,YAAY;YAAE;SAAE;QAE/C,MAAO,MAAM,MAAM,GAAG,EAAG;YACvB,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK;YAEtC,IAAI,cAAc,kBAAkB,QAAQ,GAAG,CAAC,KAAK;YACrD,QAAQ,GAAG,CAAC;YAEZ,MAAM,SAAS,SAAS,OAAO,CAAC,GAAG;YACnC,IAAI,CAAC,QAAQ;YAEb,IAAI,aAAa,GAAG;gBAClB,YAAY,IAAI,CAAC;oBAAE,GAAG,MAAM;oBAAE,gBAAgB;gBAAW;YAC3D;YAEA,IAAI,OAAO,WAAW,EAAE;gBACtB,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;oBACzB,MAAM,IAAI,CAAC;wBAAE,IAAI;wBAAS,YAAY,aAAa;oBAAE;gBACvD;YACF;QACF;QAEA,OAAO;IACT;IAEA,OAAO;QACL;QACA;QACA;QACA;QACA;QACA;QACA;IACF;AACF"}}, + {"offset": {"line": 2785, "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": 2967, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/badge.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> &\n VariantProps & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span'\n\n return (\n \n )\n}\n\nexport { Badge, badgeVariants }\n"],"names":[],"mappings":";;;;;;;AACA;AACA;AAEA;;;;;AAEA,MAAM,gBAAgB,IAAA,ySAAG,EACvB,kZACA;IACE,UAAU;QACR,SAAS;YACP,SACE;YACF,WACE;YACF,aACE;YACF,SACE;QACJ;IACF;IACA,iBAAiB;QACf,SAAS;IACX;AACF;AAGF,SAAS,MAAM,EACb,SAAS,EACT,OAAO,EACP,UAAU,KAAK,EACf,GAAG,OAEuD;IAC1D,MAAM,OAAO,UAAU,mWAAI,GAAG;IAE9B,qBACE,oaAAC;QACC,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,cAAc;YAAE;QAAQ,IAAI;QACzC,GAAG,KAAK;;;;;;AAGf"}}, + {"offset": {"line": 3013, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/tree/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\n\nimport { SiteHeader } from \"@/components/site-header\"\nimport { TreeLayout } from \"@/components/tree/tree-layout\"\nimport { D3OrgChartFlow, type D3OrgChartRef } from \"@/components/tree/d3-org-chart-flow\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRelationship } from \"@/hooks/use-relationship\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"@/components/ui/dialog\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { ZoomIn, ZoomOut, Move, Download, LayoutGrid, ChevronDown, Users } from \"lucide-react\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\n\ntype ViewMode = \"traditional\" | \"d3-org-chart\"\n\nexport default function TreePage() {\n const { treeData } = useFamily()\n const { calculateRelationship } = useRelationship()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [viewMode, setViewMode] = useState(\"traditional\")\n \n // 关系查询模式\n const [relationMode, setRelationMode] = useState(false)\n const [selectedMembers, setSelectedMembers] = useState([])\n const [relationResult, setRelationResult] = useState(null)\n const [showRelationDialog, setShowRelationDialog] = useState(false)\n \n // 使用ref存储最新的relationMode值,避免回调重新创建\n const relationModeRef = useRef(relationMode)\n const selectedMembersRef = useRef(selectedMembers)\n \n useEffect(() => {\n relationModeRef.current = relationMode\n selectedMembersRef.current = selectedMembers\n }, [relationMode, selectedMembers])\n \n // 从 URL 参数读取视图模式\n useEffect(() => {\n const view = searchParams.get('view')\n if (view === 'd3-org-chart' || view === 'traditional') {\n setViewMode(view)\n }\n }, [searchParams])\n const [scale, setScale] = useState(1)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [isDragging, setIsDragging] = useState(false)\n const [startPos, setStartPos] = useState({ x: 0, y: 0 })\n const [dragStartPos, setDragStartPos] = useState({ x: 0, y: 0 })\n const containerRef = useRef(null)\n const d3ChartRef = useRef(null)\n\n const handleMouseDown = (e: React.MouseEvent) => {\n // 如果点击的是节点卡片,不启动拖拽\n const target = e.target as HTMLElement\n if (target.closest('.family-node-card')) {\n return\n }\n \n setIsDragging(true)\n setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y })\n setDragStartPos({ x: e.clientX, y: e.clientY })\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging) return\n \n // 只有移动超过5px才算拖拽,避免误触\n const deltaX = Math.abs(e.clientX - dragStartPos.x)\n const deltaY = Math.abs(e.clientY - dragStartPos.y)\n if (deltaX < 5 && deltaY < 5) return\n \n setPosition({\n x: e.clientX - startPos.x,\n y: e.clientY - startPos.y,\n })\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n // 处理成员选择(关系查询模式)\n const handleMemberClick = (memberId: string) => {\n if (selectedMembers.length === 0) {\n // 选择第一个成员\n setSelectedMembers([memberId])\n } else if (selectedMembers.length === 1) {\n // 选择第二个成员,计算关系\n const [firstId] = selectedMembers\n if (firstId === memberId) {\n // 点击同一个人,取消选择\n setSelectedMembers([])\n return\n }\n \n const result = calculateRelationship(firstId, memberId)\n const firstMember = treeData.members[firstId]\n const secondMember = treeData.members[memberId]\n \n setRelationResult({\n from: firstMember,\n to: secondMember,\n relationship: result\n })\n setShowRelationDialog(true)\n setSelectedMembers([])\n setRelationMode(false)\n }\n }\n \n // 切换关系查询模式\n const toggleRelationMode = () => {\n setRelationMode(!relationMode)\n setSelectedMembers([])\n setRelationResult(null)\n }\n \n // 处理对话框关闭\n const handleDialogClose = (open: boolean) => {\n setShowRelationDialog(open)\n if (!open && relationResult) {\n // 清除选中样式\n const clearNodeStyle = (nodeId: string) => {\n const chartContainer = document.querySelector('.w-full.h-full.bg-background.rounded-lg.border')\n const svg = chartContainer?.querySelector('svg')\n if (!svg) return\n \n const foreignObjects = svg.querySelectorAll('foreignObject')\n foreignObjects.forEach((fo: any) => {\n const nodeData = (fo.parentNode as any)?.__data__?.data\n if (nodeData?.id === nodeId) {\n const nameDiv = fo.querySelector('div[style*=\"font-size: 13px\"]') as HTMLElement\n if (nameDiv) {\n // 移除勾选图标\n const checkIcon = nameDiv.querySelector('svg')\n if (checkIcon) {\n checkIcon.remove()\n }\n }\n }\n })\n }\n \n clearNodeStyle(relationResult.from.id)\n clearNodeStyle(relationResult.to.id)\n }\n }\n \n // 使用useCallback创建稳定的回调,通过ref访问最新的relationMode\n const handleD3MemberClick = useCallback((id: string) => {\n console.log('D3 onMemberClick triggered:', id, 'relationMode:', relationModeRef.current)\n if (relationModeRef.current) {\n console.log('Calling handleMemberClick')\n \n // 更新节点样式的辅助函数\n const updateNodeStyle = (nodeId: string, isSelected: boolean) => {\n // 从DOM中查找D3图表容器\n const chartContainer = document.querySelector('.w-full.h-full.bg-background.rounded-lg.border')\n const svg = chartContainer?.querySelector('svg')\n if (!svg) return\n \n const foreignObjects = svg.querySelectorAll('foreignObject')\n foreignObjects.forEach((fo: any) => {\n const nodeData = (fo.parentNode as any)?.__data__?.data\n if (nodeData?.id === nodeId) {\n const nameDiv = fo.querySelector('div[style*=\"font-size: 13px\"]') as HTMLElement\n if (nameDiv) {\n if (isSelected) {\n // 添加勾选图标\n if (!nameDiv.querySelector('svg')) {\n const iconHTML = ``\n nameDiv.style.display = 'flex'\n nameDiv.style.alignItems = 'center'\n nameDiv.insertAdjacentHTML('beforeend', iconHTML)\n }\n } else {\n // 移除勾选图标\n const checkIcon = nameDiv.querySelector('svg')\n if (checkIcon) {\n checkIcon.remove()\n }\n }\n }\n }\n })\n }\n \n // 直接处理选择逻辑\n if (selectedMembersRef.current.length === 0) {\n updateNodeStyle(id, true)\n setSelectedMembers([id])\n } else if (selectedMembersRef.current.length === 1) {\n const [firstId] = selectedMembersRef.current\n if (firstId === id) {\n updateNodeStyle(id, false)\n setSelectedMembers([])\n return\n }\n \n updateNodeStyle(id, true)\n \n const result = calculateRelationship(firstId, id)\n const firstMember = treeData.members[firstId]\n const secondMember = treeData.members[id]\n \n setRelationResult({\n from: firstMember,\n to: secondMember,\n relationship: result\n })\n setShowRelationDialog(true)\n setSelectedMembers([])\n setRelationMode(false)\n // 选中样式会在对话框关闭时清除\n }\n } else {\n console.log('Navigating to member detail')\n router.push(`/members/${id}`)\n }\n }, [router, calculateRelationship, treeData.members])\n\n const handleExportImage = async () => {\n if (!containerRef.current) return\n\n try {\n // 临时重置位置和缩放以获取完整视图\n const originalPosition = { ...position }\n const originalScale = scale\n setPosition({ x: 0, y: 0 })\n setScale(1)\n\n // 等待 DOM 更新\n await new Promise(resolve => setTimeout(resolve, 800))\n\n // 找到实际的族谱容器(包含 TreeLayout 的 div)\n const treeContainer = containerRef.current.querySelector('div[style*=\"transform\"]') as HTMLElement\n if (!treeContainer) {\n throw new Error('找不到族谱容器')\n }\n\n // 查找所有连接线(使用更宽泛的选择器)\n const allDivs = treeContainer.querySelectorAll('div')\n const lineElements: HTMLElement[] = []\n \n allDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n // 查找包含 bg-foreground 的元素(连接线)\n if (classes.includes('bg-foreground')) {\n lineElements.push(el)\n }\n })\n \n // 克隆容器用于导出\n const clonedContainer = treeContainer.cloneNode(true) as HTMLElement\n \n // 在克隆的容器中找到对应的连接线并设置样式\n const clonedDivs = clonedContainer.querySelectorAll('div')\n let lineIndex = 0\n clonedDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n if (classes.includes('bg-foreground') && lineElements[lineIndex]) {\n const original = lineElements[lineIndex]\n const computed = window.getComputedStyle(original)\n \n // 直接设置内联样式\n el.style.backgroundColor = computed.backgroundColor\n el.style.width = computed.width\n el.style.height = computed.height\n el.style.position = 'absolute'\n el.style.left = computed.left\n el.style.top = computed.top\n \n lineIndex++\n }\n })\n \n // 移除卡片边框\n clonedContainer.querySelectorAll('*').forEach((child) => {\n const el = child as HTMLElement\n const classes = String(el.className || '')\n \n // 跳过连接线和连接线容器\n if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) {\n return\n }\n \n // 移除其他元素的边框\n el.style.border = 'none'\n el.style.outline = 'none'\n })\n \n // 临时添加到 DOM\n clonedContainer.style.position = 'fixed'\n clonedContainer.style.left = '-9999px'\n clonedContainer.style.top = '0'\n document.body.appendChild(clonedContainer)\n \n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200))\n\n // 动态导入 dom-to-image-more(仅在客户端)\n const domtoimage = await import('dom-to-image-more')\n \n // 使用 toBlob 方法\n const blob = await domtoimage.default.toBlob(clonedContainer, {\n quality: 0.95,\n bgcolor: '#ffffff'\n })\n \n // 清理克隆的容器\n document.body.removeChild(clonedContainer)\n\n // 恢复原始位置和缩放\n setPosition(originalPosition)\n setScale(originalScale)\n\n // 创建下载链接\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`\n link.href = url\n link.click()\n \n // 清理\n setTimeout(() => URL.revokeObjectURL(url), 100)\n } catch (error) {\n console.error('导出图片失败:', error)\n }\n }\n\n // Handle root not found\n if (!treeData.rootId) {\n return (\n
\n \n
暂无家族树数据
\n
\n )\n }\n\n return (\n
\n \n\n {/* 视图切换和关系查询按钮 */}\n
\n {/* 关系查询按钮 */}\n \n \n \n \n \n \n \n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'traditional')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'traditional' ? 'bg-accent' : ''}\n >\n
\n 传统家谱视图\n {viewMode === 'traditional' && }\n
\n
\n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'd3-org-chart')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'd3-org-chart' ? 'bg-accent' : ''}\n >\n
\n D3 家谱图\n {viewMode === 'd3-org-chart' && }\n
\n
\n
\n
\n
\n\n {viewMode === 'traditional' ? (\n
\n {/* Toolbar */}\n
\n \n \n \n
\n \n
\n\n {/* Tree Canvas */}\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 {relationResult && (\n
\n {/* 成员信息 */}\n
\n
\n
\n {relationResult.from.fullName}\n
\n
\n 第{relationResult.from.generation}世\n
\n
\n\n
\n \n {relationResult.relationship.term}\n \n
\n\n
\n
\n {relationResult.to.fullName}\n
\n
\n 第{relationResult.to.generation}世\n
\n
\n
\n\n {/* 关系说明 */}\n
\n
关系说明:
\n
\n {relationResult.from.fullName}{relationResult.to.fullName}{relationResult.relationship.term}\n
\n
\n\n {/* 关系路径 */}\n {relationResult.relationship.path && (\n
\n
关系路径:
\n
\n {relationResult.relationship.path}\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/[root-of-the-server]__ee197932._.js b/.next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js new file mode 100644 index 00000000..d8207353 --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js @@ -0,0 +1,3418 @@ +module.exports = [ +"[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Avatar", + ()=>Avatar, + "AvatarFallback", + ()=>AvatarFallback, + "AvatarImage", + ()=>AvatarImage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-avatar@1.1.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_3ee3dafa662d71951c1a3d5b289c96d1/node_modules/@radix-ui/react-avatar/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +function Avatar({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "avatar", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('relative flex size-8 shrink-0 overflow-hidden rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 13, + columnNumber: 5 + }, this); +} +function AvatarImage({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Image"], { + "data-slot": "avatar-image", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('aspect-square size-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 29, + columnNumber: 5 + }, this); +} +function AvatarFallback({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$avatar$40$1$2e$1$2e$2_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$react$40$_3ee3dafa662d71951c1a3d5b289c96d1$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$avatar$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Fallback"], { + "data-slot": "avatar-fallback", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-muted flex size-full items-center justify-center rounded-full', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx", + lineNumber: 42, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "DropdownMenu", + ()=>DropdownMenu, + "DropdownMenuCheckboxItem", + ()=>DropdownMenuCheckboxItem, + "DropdownMenuContent", + ()=>DropdownMenuContent, + "DropdownMenuGroup", + ()=>DropdownMenuGroup, + "DropdownMenuItem", + ()=>DropdownMenuItem, + "DropdownMenuLabel", + ()=>DropdownMenuLabel, + "DropdownMenuPortal", + ()=>DropdownMenuPortal, + "DropdownMenuRadioGroup", + ()=>DropdownMenuRadioGroup, + "DropdownMenuRadioItem", + ()=>DropdownMenuRadioItem, + "DropdownMenuSeparator", + ()=>DropdownMenuSeparator, + "DropdownMenuShortcut", + ()=>DropdownMenuShortcut, + "DropdownMenuSub", + ()=>DropdownMenuSub, + "DropdownMenuSubContent", + ()=>DropdownMenuSubContent, + "DropdownMenuSubTrigger", + ()=>DropdownMenuSubTrigger, + "DropdownMenuTrigger", + ()=>DropdownMenuTrigger +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-dropdown-menu@2.1.4_@types+react-dom@19.2.3_@types+react@19.2.6__@types_aefad4ac5851d46557f75f368796c888/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/check.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-right.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +'use client'; +; +; +; +; +function DropdownMenu({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Root"], { + "data-slot": "dropdown-menu", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 12, + columnNumber: 10 + }, this); +} +function DropdownMenuPortal({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + "data-slot": "dropdown-menu-portal", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 19, + columnNumber: 5 + }, this); +} +function DropdownMenuTrigger({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Trigger"], { + "data-slot": "dropdown-menu-trigger", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 27, + columnNumber: 5 + }, this); +} +function DropdownMenuContent({ className, sideOffset = 4, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Portal"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Content"], { + "data-slot": "dropdown-menu-content", + sideOffset: sideOffset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 41, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 40, + columnNumber: 5 + }, this); +} +function DropdownMenuGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Group"], { + "data-slot": "dropdown-menu-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 58, + columnNumber: 5 + }, this); +} +function DropdownMenuItem({ className, inset, variant = 'default', ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Item"], { + "data-slot": "dropdown-menu-item", + "data-inset": inset, + "data-variant": variant, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 72, + columnNumber: 5 + }, this); +} +function DropdownMenuCheckboxItem({ className, children, checked, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["CheckboxItem"], { + "data-slot": "dropdown-menu-checkbox-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + checked: checked, + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$check$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CheckIcon$3e$__["CheckIcon"], { + className: "size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 103, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 102, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 101, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 92, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioGroup({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioGroup"], { + "data-slot": "dropdown-menu-radio-group", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 115, + columnNumber: 5 + }, this); +} +function DropdownMenuRadioItem({ className, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RadioItem"], { + "data-slot": "dropdown-menu-radio-item", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + 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: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["ItemIndicator"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleIcon$3e$__["CircleIcon"], { + className: "size-2 fill-current" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 138, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 137, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 136, + columnNumber: 7 + }, this), + children + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 128, + columnNumber: 5 + }, this); +} +function DropdownMenuLabel({ className, inset, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Label"], { + "data-slot": "dropdown-menu-label", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 154, + columnNumber: 5 + }, this); +} +function DropdownMenuSeparator({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Separator"], { + "data-slot": "dropdown-menu-separator", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-border -mx-1 my-1 h-px', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 171, + columnNumber: 5 + }, this); +} +function DropdownMenuShortcut({ className, ...props }) { + 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$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", { + "data-slot": "dropdown-menu-shortcut", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('text-muted-foreground ml-auto text-xs tracking-widest', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 184, + columnNumber: 5 + }, this); +} +function DropdownMenuSub({ ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Sub"], { + "data-slot": "dropdown-menu-sub", + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 198, + columnNumber: 10 + }, this); +} +function DropdownMenuSubTrigger({ className, inset, children, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubTrigger"], { + "data-slot": "dropdown-menu-sub-trigger", + "data-inset": inset, + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), + ...props, + children: [ + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$right$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronRightIcon$3e$__["ChevronRightIcon"], { + className: "ml-auto size-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 220, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 210, + columnNumber: 5 + }, this); +} +function DropdownMenuSubContent({ className, ...props }) { + 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$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$2f40$radix$2d$ui$2b$react$2d$dropdown$2d$menu$40$2$2e$1$2e$4_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types_aefad4ac5851d46557f75f368796c888$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$dropdown$2d$menu$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["SubContent"], { + "data-slot": "dropdown-menu-sub-content", + className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg', className), + ...props + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx", + lineNumber: 230, + columnNumber: 5 + }, this); +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "SiteHeader", + ()=>SiteHeader +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$__ = __turbopack_context__.i("[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/client/app-dir/link.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript) "); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/input.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next-auth@4.24.13_next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0__nodemailer@7_3c43d6bc4ecce810d1d16651fe207b00/node_modules/next-auth/react/index.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/alert-dialog-custom.tsx [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +; +function SiteHeader() { + const { searchMembers, searchResults } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { data: session, status } = (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])(); + const { showAlert, showConfirm, showPrompt } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$alert$2d$dialog$2d$custom$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useDialog"])(); + const pathname = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["usePathname"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [searchQuery, setSearchQuery] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(""); + const [showResults, setShowResults] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [familyTrees, setFamilyTrees] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [currentTree, setCurrentTree] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [deletingTreeId, setDeletingTreeId] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const searchRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + // 获取当前视图模式 + const currentViewMode = searchParams.get('view') || 'traditional'; + const isTreePage = pathname === '/tree'; + // 生成带有 treeId 的 URL + const getUrlWithTreeId = (path)=>{ + if (currentTree?.id) { + return `${path}?treeId=${currentTree.id}`; + } + return path; + }; + // 切换视图模式 + const handleViewModeChange = (mode)=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', mode); + if (currentTree?.id) { + params.set('treeId', currentTree.id); + } + router.push(`${pathname}?${params.toString()}`); + }; + const getRoleBadge = (role)=>{ + switch(role){ + case "OWNER": + 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$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] px-1.5 py-0.5 rounded bg-purple-100 text-purple-700 border border-purple-200 ml-2", + children: "所有者" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 69, + columnNumber: 16 + }, this); + case "EDITOR": + 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$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] px-1.5 py-0.5 rounded bg-blue-100 text-blue-700 border border-blue-200 ml-2", + children: "编辑" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 71, + columnNumber: 16 + }, this); + case "VIEWER": + 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$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] px-1.5 py-0.5 rounded bg-gray-100 text-gray-700 border border-gray-200 ml-2", + children: "查看" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 73, + columnNumber: 16 + }, this); + default: + return null; + } + }; + const handleSignOut = async ()=>{ + await (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$2d$auth$40$4$2e$24$2e$13_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_$5f$nodemailer$40$7_3c43d6bc4ecce810d1d16651fe207b00$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["signOut"])({ + callbackUrl: "/auth/signin" + }); + }; + // 获取用户名首字母作为头像 + const getUserInitial = ()=>{ + if (session?.user?.name) { + return session.user.name.charAt(0).toUpperCase(); + } + if (session?.user?.email) { + return session.user.email.charAt(0).toUpperCase(); + } + return "U"; + }; + // 删除家族树 + const handleDeleteTree = async (tree, e)=>{ + e.stopPropagation(); // 阻止触发选择事件 + // 检查权限 + if (tree.ownerId !== session?.user?.id) { + await showAlert('只有家族树的创建者才能删除', '权限不足'); + return; + } + const confirmText = `确定要删除家族树"${tree.name}"吗?\n\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`; + const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive'); + if (!confirmed) { + return; + } + // 二次确认 + const finalConfirm = await showPrompt(`请输入家族树名称"${tree.name}"以确认删除:`, '', '确认删除'); + if (finalConfirm !== tree.name) { + await showAlert('名称不匹配,删除已取消', '操作已取消'); + return; + } + setDeletingTreeId(tree.id); + try { + const response = await fetch(`/api/trees/${tree.id}`, { + method: 'DELETE' + }); + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error || '删除失败'); + } + // 刷新家族树列表 + await loadFamilyTrees(); + // 如果删除的是当前树,跳转到首页 + if (currentTree?.id === tree.id) { + window.location.href = '/'; + } + } catch (error) { + console.error('删除家族树失败:', error); + await showAlert('删除失败:' + error.message, '错误'); + } finally{ + setDeletingTreeId(null); + } + }; + // 获取家族树列表 + const loadFamilyTrees = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + if (!session?.user?.id || status !== 'authenticated') return; + const controller = new AbortController(); + fetch('/api/trees', { + signal: controller.signal + }).then((res)=>{ + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`); + return res.json(); + }).then((data)=>{ + if (data.trees) { + setFamilyTrees(data.trees); + // 如果 URL 中有 treeId,使用该树,否则使用第一个 + const urlParams = new URLSearchParams(window.location.search); + const treeId = urlParams.get('treeId'); + if (treeId) { + const tree = data.trees.find((t)=>t.id === treeId); + if (tree) { + setCurrentTree(tree); + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } else if (data.trees.length > 0) { + setCurrentTree(data.trees[0]); + } + } + }).catch((err)=>{ + // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的) + if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') { + console.error('获取家族树列表失败:', err); + } + }); + return ()=>controller.abort(); + }, [ + session?.user?.id, + status + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + loadFamilyTrees(); + }, [ + loadFamilyTrees + ]); + // 监听路由变化,刷新家族树列表 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const handleRouteChange = ()=>{ + loadFamilyTrees(); + }; + window.addEventListener('focus', handleRouteChange); + return ()=>window.removeEventListener('focus', handleRouteChange); + }, [ + loadFamilyTrees + ]); + // 点击外部关闭搜索结果 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + function handleClickOutside(event) { + if (searchRef.current && !searchRef.current.contains(event.target)) { + setShowResults(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return ()=>document.removeEventListener("mousedown", handleClickOutside); + }, []); + const handleSearch = (query)=>{ + setSearchQuery(query); + searchMembers(query); + setShowResults(query.length > 0); + }; + const handleSelectMember = (memberId)=>{ + router.push(`/members/${memberId}`); + setSearchQuery(""); + setShowResults(false); + }; + 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$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"])("header", { + className: "sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", + 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: "container mx-auto flex h-16 items-center px-4", + 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: "mr-8 flex items-center gap-4", + 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"])(__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"], { + href: "/", + className: "flex items-center gap-2", + 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 h-8 w-8 items-center justify-center rounded bg-primary text-primary-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__BookOpen$3e$__["BookOpen"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 229, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 228, + 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"])("span", { + className: "text-xl font-serif font-bold tracking-tight", + children: "华夏谱" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 231, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 227, + columnNumber: 11 + }, this), + session && familyTrees.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$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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 min-w-[200px]", + 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: "flex-1 truncate text-left", + children: currentTree?.name || '选择家族树' + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 239, + 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$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-4 w-4 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 240, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 238, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 237, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "start", + className: "w-[var(--radix-dropdown-menu-trigger-width)] min-w-[200px]", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + children: "我的家族树" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 244, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 245, + columnNumber: 17 + }, this), + familyTrees.map((tree)=>/*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + setCurrentTree(tree); + // 保持当前路径,只更新 treeId 参数 + const currentPath = window.location.pathname; + router.push(`${currentPath}?treeId=${tree.id}`); + }, + className: "cursor-pointer flex items-center justify-between group", + 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 overflow-hidden", + 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: "truncate", + children: tree.name + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 258, + columnNumber: 23 + }, this), + getRoleBadge(tree.currentUserRole) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 257, + 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: "flex items-center gap-2", + children: [ + currentTree?.id === tree.id && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 263, + columnNumber: 25 + }, this), + tree.ownerId === session?.user?.id && /*#__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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "sm", + className: "h-6 w-6 p-0 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-destructive hover:text-destructive-foreground", + onClick: (e)=>handleDeleteTree(tree, e), + disabled: deletingTreeId === tree.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$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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Trash2$3e$__["Trash2"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 273, + columnNumber: 27 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 266, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 261, + columnNumber: 21 + }, this) + ] + }, tree.id, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>router.push('/trees/new'), + className: "cursor-pointer text-primary", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Plus$3e$__["Plus"], { + className: "h-4 w-4 mr-2" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 284, + columnNumber: 19 + }, this), + "创建新家族树" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 280, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 243, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 236, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 226, + 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"])("nav", { + className: "hidden md:flex items-center gap-6 text-sm font-medium text-muted-foreground", + 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"])(__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"], { + href: getUrlWithTreeId("/"), + className: "transition-colors hover:text-foreground data-[active=true]:text-foreground data-[active=true]:font-semibold", + children: "总览 (Overview)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 293, + 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$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"], { + href: getUrlWithTreeId("/tree"), + className: "transition-colors hover:text-foreground", + children: "族谱 (Tree)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 299, + 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$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"], { + href: getUrlWithTreeId("/members"), + className: "transition-colors hover:text-foreground", + children: "成员 (Members)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 302, + 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$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"], { + href: getUrlWithTreeId("/timeline"), + className: "transition-colors hover:text-foreground", + children: "大事记 (Timeline)" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 305, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 292, + 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", { + className: "ml-auto flex items-center gap-4", + 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: "relative hidden sm:block", + ref: searchRef, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Search$3e$__["Search"], { + 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/components/site-header.tsx", + lineNumber: 312, + 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$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Input"], { + type: "search", + placeholder: "搜索成员...", + value: searchQuery, + onChange: (e)=>handleSearch(e.target.value), + className: "h-9 w-64 rounded-full bg-muted pl-9 text-sm focus-visible:ring-primary" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 313, + columnNumber: 13 + }, this), + showResults && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg max-h-96 overflow-y-auto z-50", + children: searchResults.map((member)=>/*#__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"])("button", { + onClick: ()=>handleSelectMember(member.id), + className: "w-full px-4 py-3 text-left hover:bg-muted transition-colors border-b border-border last:border-0", + 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 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"])("div", { + className: "flex-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 gap-2", + 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: "font-medium", + children: member.fullName + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 333, + 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"])("span", { + className: `text-xs px-1.5 py-0.5 rounded ${member.gender === "MALE" ? "bg-blue-100 text-blue-700" : "bg-pink-100 text-pink-700"}`, + children: member.gender === "MALE" ? "男" : "女" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 334, + 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"])("span", { + className: "text-xs text-muted-foreground", + children: [ + "第", + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 337, + columnNumber: 27 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 332, + 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"])("p", { + className: "text-xs text-muted-foreground mt-1", + children: [ + member.birthDate && `生于 ${member.birthDate}`, + member.birthPlace && ` · ${member.birthPlace}` + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 339, + columnNumber: 25 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 331, + columnNumber: 23 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 330, + columnNumber: 21 + }, this) + }, member.id, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 325, + columnNumber: 19 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 323, + columnNumber: 15 + }, this), + showResults && searchQuery && searchResults.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$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-full mt-2 w-full bg-background border border-border rounded-lg shadow-lg p-4 text-center text-sm text-muted-foreground z-50", + children: "未找到匹配的成员" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 352, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 311, + 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$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Bell$3e$__["Bell"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 359, + 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"])("span", { + className: "sr-only", + children: "Notifications" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 360, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 358, + 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$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"], { + href: "/settings", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + size: "icon", + className: "text-muted-foreground", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "h-5 w-5" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 365, + 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"])("span", { + className: "sr-only", + children: "Settings" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 366, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 364, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 363, + columnNumber: 11 + }, this), + status === "loading" ? /*#__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$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: "..." + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 372, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 371, + columnNumber: 13 + }, this) : session ? /*#__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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "ghost", + className: "relative h-8 w-8 rounded-full", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Avatar"], { + className: "h-8 w-8 border border-border", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarImage"], { + src: undefined, + alt: session.user?.name || "User" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 379, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$avatar$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["AvatarFallback"], { + children: getUserInitial() + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 380, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 378, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 377, + columnNumber: 17 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 376, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + className: "w-56", + align: "end", + forceMount: true, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuLabel"], { + className: "font-normal", + 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 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"])("p", { + className: "text-sm font-medium leading-none", + children: session.user?.name || "用户" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 387, + 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"])("p", { + className: "text-xs leading-none text-muted-foreground", + children: session.user?.email + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 388, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 386, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 385, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 393, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + asChild: true, + 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"])(__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"], { + href: "/settings", + className: "cursor-pointer", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Settings$3e$__["Settings"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 396, + 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", { + children: "系统设置" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 397, + columnNumber: 21 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 395, + columnNumber: 19 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 394, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuSeparator"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 400, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: handleSignOut, + className: "cursor-pointer text-red-600", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LogOut$3e$__["LogOut"], { + className: "mr-2 h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 402, + 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", { + children: "退出登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 403, + columnNumber: 19 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 401, + columnNumber: 17 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 384, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 375, + 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"], { + href: "/auth/signin", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "default", + size: "sm", + children: "登录" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 409, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 408, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 310, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 225, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", + lineNumber: 224, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "FamilyTreeDB", + ()=>FamilyTreeDB, + "db", + ()=>db +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dexie@4.2.1/node_modules/dexie/import-wrapper.mjs [app-ssr] (ecmascript)"); +; +class FamilyTreeDB extends __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] { + members; + settings; + images; + activityLogs; + constructor(){ + super("FamilyTreeDB"); + this.version(1).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id" + }); + this.version(2).stores({ + members: "id, fullName, fatherId, motherId, [fatherId+motherId]", + settings: "key", + images: "id", + activityLogs: "id, timestamp, action, entityType, entityId" + }); + } +} +const db = new FamilyTreeDB(); +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "clearAvatarCache", + ()=>clearAvatarCache, + "useAvatarCache", + ()=>useAvatarCache +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)"); +; +; +// 全局图片缓存 +const avatarCache = new Map(); +function useAvatarCache(avatarImageId) { + const [avatarUrl, setAvatarUrl] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(avatarImageId ? avatarCache.get(avatarImageId) : undefined); + const [isLoading, setIsLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + if (!avatarImageId) { + setAvatarUrl(undefined); + return; + } + // 如果缓存中已存在,直接使用 + const cached = avatarCache.get(avatarImageId); + if (cached) { + setAvatarUrl(cached); + return; + } + // 从数据库加载 + let isMounted = true; + setIsLoading(true); + __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["db"].images.get(avatarImageId).then((image)=>{ + if (image && isMounted) { + const url = URL.createObjectURL(image.blob); + avatarCache.set(avatarImageId, url); + setAvatarUrl(url); + } + }).catch((error)=>{ + console.error('Failed to load avatar:', error); + }).finally(()=>{ + if (isMounted) { + setIsLoading(false); + } + }); + return ()=>{ + isMounted = false; + }; + }, [ + avatarImageId + ]); + return { + avatarUrl, + isLoading + }; +} +function clearAvatarCache() { + avatarCache.forEach((url)=>URL.revokeObjectURL(url)); + avatarCache.clear(); +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "FamilyNode", + ()=>FamilyNode +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/utils.ts [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$avatar$2d$cache$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-avatar-cache.ts [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/circle-user-round.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$heart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Heart$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/heart.js [app-ssr] (ecmascript) "); +"use client"; +; +; +; +; +// 格式化日期显示(只显示年份) +function formatYear(dateString) { + if (!dateString) return ''; + const year = dateString.split('-')[0]; + return year; +} +// 计算年龄 +function calculateAge(birthDate, deathDate) { + if (!birthDate) return null; + const birth = new Date(birthDate); + const end = deathDate ? new Date(deathDate) : new Date(); + let age = end.getFullYear() - birth.getFullYear(); + const monthDiff = end.getMonth() - birth.getMonth(); + if (monthDiff < 0 || monthDiff === 0 && end.getDate() < birth.getDate()) { + age--; + } + return age; +} +// 单个人员卡片组件 +function PersonCard({ member, isRoot, isSpouse, onSelect, isHighlighted }) { + const { avatarUrl: avatarBlobUrl } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$avatar$2d$cache$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useAvatarCache"])(member?.avatarImageId); + const birthYear = formatYear(member.birthDate); + const deathYear = formatYear(member.deathDate); + const age = calculateAge(member.birthDate, member.deathDate); + const lifeSpan = birthYear ? deathYear ? `${birthYear}-${deathYear}` : `${birthYear}-` : ''; + const ageText = age !== null ? member.deathDate ? `享年${age}岁` : `${age}岁` : ''; + 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$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: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$utils$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["cn"])("family-node-card relative flex flex-col items-center gap-2 p-3 rounded-lg transition-all cursor-pointer hover:scale-105 shadow-sm w-32", isHighlighted ? "border-4 border-yellow-400 bg-yellow-50 dark:bg-yellow-900/20 ring-4 ring-yellow-200 dark:ring-yellow-800 animate-pulse" : isRoot ? "border-2 border-primary bg-primary/5" : isSpouse ? "border-2 border-dashed border-border/60 bg-muted/30" : "border-2 border-border bg-card"), + onClick: ()=>onSelect?.(member), + 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: "absolute -top-3 bg-background border border-border px-2 py-0.5 rounded-full text-[10px] text-muted-foreground font-mono", + children: [ + member.generation, + "世" + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 74, + 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: "h-12 w-12 rounded-full bg-muted flex items-center justify-center text-muted-foreground overflow-hidden border border-border/50", + children: avatarBlobUrl ? /*#__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"])("img", { + src: avatarBlobUrl, + alt: member.fullName, + className: "h-full w-full object-cover" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 80, + columnNumber: 11 + }, this) : member.gender === 'female' ? /*#__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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2d$round$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUserRound$3e$__["CircleUserRound"], { + className: "h-8 w-8 text-pink-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 87, + 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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$circle$2d$user$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__CircleUser$3e$__["CircleUser"], { + className: "h-8 w-8 text-blue-400" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 89, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 78, + 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: "text-center w-full", + 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: "font-serif font-bold text-foreground leading-tight", + children: [ + member.surname, + " ", + member.givenName + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 95, + columnNumber: 9 + }, this), + member.courtesyName && /*#__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-[10px] text-muted-foreground mt-0.5", + children: [ + "字 ", + member.courtesyName + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 97, + columnNumber: 11 + }, this), + lifeSpan && /*#__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-[9px] text-muted-foreground/70 mt-1 font-mono", + children: lifeSpan + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 100, + columnNumber: 11 + }, this), + ageText && /*#__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-[9px] text-muted-foreground/60 font-mono", + children: ageText + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 105, + columnNumber: 11 + }, this), + member.phone && /*#__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-[9px] text-muted-foreground/60 font-mono truncate", + children: [ + "📱 ", + member.phone + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 110, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 94, + columnNumber: 7 + }, 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$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-1 -right-1 h-2 w-2 rounded-full bg-neutral-400 ring-2 ring-background" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 117, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 61, + columnNumber: 5 + }, this); +} +function FamilyNode({ member, spouse, isRoot, onSelect, isHighlighted }) { + if (!spouse) { + 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$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"])(PersonCard, { + member: member, + isRoot: isRoot, + onSelect: onSelect, + isHighlighted: isHighlighted + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 125, + columnNumber: 12 + }, this); + } + // 有配偶时,并排显示 + 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$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 gap-2", + 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"])(PersonCard, { + member: member, + isRoot: isRoot, + onSelect: onSelect, + isHighlighted: isHighlighted + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 131, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$heart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Heart$3e$__["Heart"], { + className: "h-4 w-4 text-red-400 flex-shrink-0" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 132, + 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"])(PersonCard, { + member: spouse, + isSpouse: true, + onSelect: onSelect + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 133, + columnNumber: 7 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx", + lineNumber: 130, + columnNumber: 5 + }, this); +} +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "TreeLayout", + ()=>TreeLayout +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$family$2d$node$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/family-node.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +function TreeLayout({ rootId, onSelectMember }) { + const { getMember, treeData, highlightedMemberId } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const root = getMember(rootId); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + const containerRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const [connections, setConnections] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const nodeRefs = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(new Map()); + // 节点间距配置 + const HORIZONTAL_GAP = 32 // 2rem = 32px + ; + const VERTICAL_GAP = 48 // 3rem = 48px + ; + const CONNECTOR_HEIGHT = 48 // 连接线垂直高度 + ; + // 处理节点点击 + const handleNodeClick = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])((member)=>{ + router.push(`/members/${member.id}`); + }, [ + router + ]); + // 计算所有连线位置 + const calculateConnections = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])(()=>{ + const newConnections = []; + const containerRect = containerRef.current?.getBoundingClientRect(); + if (!containerRect) return; + // 检查是否有足够的节点已注册 + if (nodeRefs.current.size === 0) return; + nodeRefs.current.forEach((nodeElement, nodeId)=>{ + const member = getMember(nodeId); + if (!member || !member.childrenIds || member.childrenIds.length === 0) return; + const parentRect = nodeElement.getBoundingClientRect(); + const parentCenterX = parentRect.left + parentRect.width / 2 - containerRect.left; + const parentBottomY = parentRect.bottom - containerRect.top; + // 父节点到水平线的垂直连线 + const verticalLineY = parentBottomY + CONNECTOR_HEIGHT / 2; + newConnections.push({ + from: { + x: parentCenterX, + y: parentBottomY + }, + to: { + x: parentCenterX, + y: verticalLineY + }, + type: 'vertical' + }); + // 获取所有子节点的位置 + const childPositions = member.childrenIds.map((childId)=>{ + const childElement = nodeRefs.current.get(childId); + if (!childElement) return null; + const childRect = childElement.getBoundingClientRect(); + return { + id: childId, + centerX: childRect.left + childRect.width / 2 - containerRect.left, + topY: childRect.top - containerRect.top + }; + }).filter(Boolean); + if (childPositions.length === 0) return; + // 如果有多个子节点,绘制水平连线 + if (childPositions.length > 1) { + const leftmostX = Math.min(...childPositions.map((p)=>p.centerX)); + const rightmostX = Math.max(...childPositions.map((p)=>p.centerX)); + newConnections.push({ + from: { + x: leftmostX, + y: verticalLineY + }, + to: { + x: rightmostX, + y: verticalLineY + }, + type: 'horizontal' + }); + } + // 每个子节点的垂直连线 + childPositions.forEach((child)=>{ + newConnections.push({ + from: { + x: child.centerX, + y: verticalLineY + }, + to: { + x: child.centerX, + y: child.topY + }, + type: 'vertical' + }); + }); + }); + setConnections(newConnections); + }, [ + getMember + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + // 多次尝试计算,确保 DOM 完全渲染 + const timers = []; + timers.push(setTimeout(calculateConnections, 50)); + timers.push(setTimeout(calculateConnections, 150)); + timers.push(setTimeout(calculateConnections, 300)); + timers.push(setTimeout(calculateConnections, 500)); + // 监听窗口大小变化 + window.addEventListener('resize', calculateConnections); + return ()=>{ + timers.forEach((timer)=>clearTimeout(timer)); + window.removeEventListener('resize', calculateConnections); + }; + }, [ + calculateConnections, + treeData + ]); + if (!root) return null; + // 递归渲染树节点 + const TreeNode = ({ memberId, isRoot = false })=>{ + const member = getMember(memberId); + if (!member) return null; + const hasChildren = member.childrenIds && member.childrenIds.length > 0; + // 获取配偶(取第一个配偶) + const spouse = member.spouseIds && member.spouseIds.length > 0 ? getMember(member.spouseIds[0]) : undefined; + 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$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 items-center", + 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", { + ref: (el)=>{ + if (el) { + nodeRefs.current.set(memberId, el); + } else { + nodeRefs.current.delete(memberId); + } + }, + className: "relative z-10", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$family$2d$node$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["FamilyNode"], { + member: member, + spouse: spouse, + onSelect: handleNodeClick, + isRoot: isRoot, + isHighlighted: member.id === highlightedMemberId + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 147, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 137, + columnNumber: 9 + }, this), + hasChildren && /*#__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-start relative", + style: { + marginTop: `${VERTICAL_GAP}px`, + gap: `${HORIZONTAL_GAP}px` + }, + children: member.childrenIds.map((childId)=>/*#__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"])(TreeNode, { + memberId: childId + }, childId, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 166, + columnNumber: 15 + }, this)) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 158, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 135, + columnNumber: 7 + }, this); + }; + 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$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: "relative", + 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", { + ref: containerRef, + className: "p-12 min-w-fit relative", + style: { + minHeight: '100%' + }, + 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: "absolute inset-0 pointer-events-none", + style: { + zIndex: 1 + }, + children: connections.map((conn, index)=>{ + const isHorizontal = conn.type === 'horizontal'; + // 使用 1px 但通过 transform scale 缩小来实现细线 + const width = isHorizontal ? Math.abs(conn.to.x - conn.from.x) : 1; + const height = isHorizontal ? 1 : Math.abs(conn.to.y - conn.from.y); + const left = Math.min(conn.from.x, conn.to.x); + const top = Math.min(conn.from.y, conn.to.y); + // 跳过无效的连线(宽度或高度为0) + if (width <= 0 || height <= 0) return null; + 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$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 bg-foreground/25", + style: { + left: `${left}px`, + top: `${top}px`, + width: `${width}px`, + height: `${height}px`, + transform: isHorizontal ? 'scaleY(0.3)' : 'scaleX(0.3)', + transformOrigin: 'top left' + } + }, index, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 191, + columnNumber: 15 + }, this); + }) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 178, + 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", { + className: "relative", + style: { + zIndex: 10 + }, + 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"])(TreeNode, { + memberId: rootId, + isRoot: true + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 209, + columnNumber: 11 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 208, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 176, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx", + lineNumber: 175, + columnNumber: 5 + }, this); +} +}), +"[externals]/fs [external] (fs, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("fs", () => require("fs")); + +module.exports = mod; +}), +"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("path", () => require("path")); + +module.exports = mod; +}), +"[externals]/worker_threads [external] (worker_threads, cjs)", ((__turbopack_context__, module, exports) => { + +const mod = __turbopack_context__.x("worker_threads", () => require("worker_threads")); + +module.exports = mod; +}), +"[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "D3OrgChartFlow", + ()=>D3OrgChartFlow +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$40$7$2e$9$2e$0$2f$node_modules$2f$d3$2f$src$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3@7.9.0/node_modules/d3/src/index.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$selection$40$3$2e$0$2e$0$2f$node_modules$2f$d3$2d$selection$2f$src$2f$select$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__select$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js [app-ssr] (ecmascript) "); +// @ts-ignore - d3-org-chart没有TypeScript类型定义 +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$org$2d$chart$40$3$2e$1$2e$1$2f$node_modules$2f$d3$2d$org$2d$chart$2f$src$2f$d3$2d$org$2d$chart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/d3-org-chart@3.1.1/node_modules/d3-org-chart/src/d3-org-chart.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$jspdf$40$3$2e$0$2e$4$2f$node_modules$2f$jspdf$2f$dist$2f$jspdf$2e$node$2e$min$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/jspdf@3.0.4/node_modules/jspdf/dist/jspdf.node.min.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +// 计算年龄 +function calculateAge(birthDate, deathDate) { + if (!birthDate) return null; + const birth = new Date(birthDate); + const end = deathDate ? new Date(deathDate) : new Date(); + let age = end.getFullYear() - birth.getFullYear(); + const monthDiff = end.getMonth() - birth.getMonth(); + if (monthDiff < 0 || monthDiff === 0 && end.getDate() < birth.getDate()) { + age--; + } + return age; +} +const D3OrgChartFlow = /*#__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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["forwardRef"])(({ members, rootId, onMemberClick, onExport }, ref)=>{ + const chartRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const chartInstanceRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const [isReady, setIsReady] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [avatarCache, setAvatarCache] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(new Map()); + // 转换数据格式 + const convertToChartData = ()=>{ + const chartNodes = []; + // 首先找到根节点(没有父节点的节点) + const rootMember = members[rootId]; + if (!rootMember) return []; + // 使用BFS遍历,确保只包含从rootId开始的树 + const visited = new Set(); + const queue = [ + rootId + ]; + while(queue.length > 0){ + const currentId = queue.shift(); + if (visited.has(currentId)) continue; + visited.add(currentId); + const member = members[currentId]; + if (!member) continue; + // 获取配偶信息,确保配偶存在于members中 + let spouse = null; + if (member.spouseIds?.[0] && members[member.spouseIds[0]]) { + spouse = members[member.spouseIds[0]]; + } + // 确定父节点ID - 只有根节点的parentId为null + let parentId = null; + if (currentId !== rootId) { + // 根据姓氏判断主线,优先选择同姓的父母 + const father = member.fatherId ? members[member.fatherId] : null; + const mother = member.motherId ? members[member.motherId] : null; + // 判断父母中谁是家族主线(同姓) + const isFatherMainLine = father && member.surname === father.surname; + const isMotherMainLine = mother && member.surname === mother.surname; + if (isFatherMainLine) { + parentId = member.fatherId || null; + } else if (isMotherMainLine) { + parentId = member.motherId || null; + } else if (father) { + // 如果都不同姓,优先选择父亲 + parentId = member.fatherId || null; + } else if (mother) { + parentId = member.motherId || null; + } + } + // 计算年龄文本 + const age = calculateAge(member.birthDate, member.deathDate); + const ageText = age !== null ? member.deathDate ? `享年${age}岁` : `${age}岁` : ''; + chartNodes.push({ + id: member.id, + parentId: parentId, + name: member.fullName, + generation: `第${member.generation}世`, + birthYear: member.birthDate ? new Date(member.birthDate).getFullYear().toString() : '', + deathYear: member.deathDate ? new Date(member.deathDate).getFullYear().toString() : '', + birthPlace: member.birthPlace || '', + gender: member.gender === 'MALE' ? '男' : '女', + avatarImageId: member.avatarImageId, + spouseName: spouse?.fullName || '', + spouseId: spouse?.id || null, + hasChildren: Object.values(members).some((m)=>m.fatherId === member.id || m.motherId === member.id), + ageText: ageText + }); + // 添加子节点到队列 + Object.values(members).forEach((m)=>{ + if ((m.fatherId === currentId || m.motherId === currentId) && !visited.has(m.id)) { + queue.push(m.id); + } + }); + } + return chartNodes; + }; + // 加载所有成员的头像 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const loadAvatars = async ()=>{ + const cache = new Map(); + for (const member of Object.values(members)){ + if (member.avatarImageId) { + try { + const image = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["db"].images.get(member.avatarImageId); + if (image) { + const url = URL.createObjectURL(image.blob); + cache.set(member.avatarImageId, url); + } + } catch (error) { + console.error(`Failed to load avatar for ${member.fullName}:`, error); + } + } + } + setAvatarCache(cache); + }; + loadAvatars(); + // 清理函数 + return ()=>{ + avatarCache.forEach((url)=>URL.revokeObjectURL(url)); + }; + }, [ + members + ]); + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + if (!chartRef.current || !rootId) return; + // 清理旧的图表 + if (chartRef.current) { + chartRef.current.innerHTML = ''; + } + const data = convertToChartData(); + // 初始化图表 + const chart = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$org$2d$chart$40$3$2e$1$2e$1$2f$node_modules$2f$d3$2d$org$2d$chart$2f$src$2f$d3$2d$org$2d$chart$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["OrgChart"]().container(chartRef.current).data(data).nodeWidth(()=>160).nodeHeight(()=>120).childrenMargin(()=>50).compactMarginBetween(()=>35).compactMarginPair(()=>35).neighbourMargin(()=>35).siblingsMargin(()=>35).linkUpdate(function(d, i, arr) { + // 加深连线颜色 + __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$d3$2d$selection$40$3$2e$0$2e$0$2f$node_modules$2f$d3$2d$selection$2f$src$2f$select$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__select$3e$__["select"](arr[i]).attr('stroke', '#475569').attr('stroke-width', 2.5); + }).buttonContent(({ node })=>{ + return `
${node.children ? `` : ``} ${node.data._directSubordinates || 0}
`; + }).nodeContent((d)=>{ + const node = d.data; + const color = node.gender === '男' ? '#3b82f6' : '#ec4899'; + const bgColor = node.gender === '男' ? '#dbeafe' : '#fce7f3'; + // 获取头像URL + const avatarUrl = node.avatarImageId ? avatarCache.get(node.avatarImageId) : null; + return ` +
+
+
+ ${avatarUrl ? `${node.name}` : node.gender === '女' ? `` : ``} +
+
+
+ ${node.name} +
+
+ ${node.generation} +
+
+
+ +
+ ${node.birthYear ? `
+ ${node.birthYear}${node.deathYear ? ` - ${node.deathYear}` : ''} + ${node.ageText ? `${node.ageText}` : ''} +
` : ''} + ${node.birthPlace ? `
+ ${node.birthPlace} +
` : ''} +
+ + ${node.spouseName && node.spouseId ? ` +
+ 配偶: ${node.spouseName} +
+ ` : ''} + + ${node.deathYear ? ` +
+ ` : ''} +
+ `; + }).onNodeClick((d)=>{ + if (onMemberClick && d) { + // d3-org-chart传递的是节点数据对象,需要提取id + const nodeId = typeof d === 'string' ? d : d.data?.id || d.id; + if (nodeId) { + onMemberClick(nodeId); + } + } + }).render().expandAll() // 初始化时展开所有节点 + ; + // 添加配偶区域点击事件监听 + setTimeout(()=>{ + const spouseAreas = chartRef.current?.querySelectorAll('.spouse-area'); + spouseAreas?.forEach((area)=>{ + area.addEventListener('click', (e)=>{ + e.stopPropagation(); // 阻止事件冒泡到节点 + const spouseId = area.getAttribute('data-spouse-id'); + if (spouseId && onMemberClick) { + onMemberClick(spouseId); + } + }); + }); + }, 100); + chartInstanceRef.current = chart; + setIsReady(true); + return ()=>{ + // 清理 + if (chartRef.current) { + chartRef.current.innerHTML = ''; + } + }; + }, [ + members, + rootId, + onMemberClick, + avatarCache + ]); + // 导出PNG + const handleExportPNG = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.exportImg({ + save: true, + full: true, + onLoad: ()=>{ + onExport?.(); + } + }); + }; + // 导出PDF + const handleExportPDF = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.exportImg({ + save: false, + full: true, + onLoad: (base64)=>{ + const pdf = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$jspdf$40$3$2e$0$2e$4$2f$node_modules$2f$jspdf$2f$dist$2f$jspdf$2e$node$2e$min$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"]({ + orientation: 'landscape', + unit: 'px', + format: 'a4' + }); + const img = new Image(); + img.src = base64; + img.onload = function() { + const imgWidth = img.width; + const imgHeight = img.height; + const pdfWidth = pdf.internal.pageSize.getWidth(); + const pdfHeight = pdf.internal.pageSize.getHeight(); + // 计算缩放比例以适应页面 + const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight); + const scaledWidth = imgWidth * ratio; + const scaledHeight = imgHeight * ratio; + // 居中放置 + const x = (pdfWidth - scaledWidth) / 2; + const y = (pdfHeight - scaledHeight) / 2; + pdf.addImage(img, 'PNG', x, y, scaledWidth, scaledHeight); + pdf.save(`家谱图-${new Date().toISOString().split('T')[0]}.pdf`); + onExport?.(); + }; + } + }); + }; + // 展开所有节点 + const handleExpandAll = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.expandAll(); + }; + // 折叠所有节点 + const handleCollapseAll = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.collapseAll(); + }; + // 适应视图 + const handleFitView = ()=>{ + if (!chartInstanceRef.current) return; + chartInstanceRef.current.fit(); + }; + // 暴露方法给父组件 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useImperativeHandle"])(ref, ()=>({ + exportPNG: handleExportPNG, + exportPDF: handleExportPDF, + expandAll: handleExpandAll, + collapseAll: handleCollapseAll, + fitView: handleFitView + })); + 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$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: "w-full h-full bg-background rounded-lg border relative", + 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", { + ref: chartRef, + className: "w-full h-full", + style: { + overflow: 'hidden' + } + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx", + lineNumber: 434, + columnNumber: 7 + }, ("TURBOPACK compile-time value", void 0)) + }, `d3-chart-${rootId}`, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx", + lineNumber: 432, + columnNumber: 5 + }, ("TURBOPACK compile-time value", void 0)); +}); +D3OrgChartFlow.displayName = 'D3OrgChartFlow'; +}), +"[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "RelationshipCalculator", + ()=>RelationshipCalculator +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/relationship.js@1.2.7/node_modules/relationship.js/dist/relationship.min.mjs [app-ssr] (ecmascript)"); +; +class RelationshipCalculator { + members; + constructor(members){ + this.members = new Map(members.map((m)=>[ + m.id, + m + ])); + } + /** + * 计算两个成员之间的关系 + * @param fromId 起始成员ID(成员A) + * @param toId 目标成员ID(成员B) + * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX) + */ getRelationship(fromId, toId) { + if (fromId === toId) { + return { + term: '本人', + path: '', + success: true + }; + } + const fromMember = this.members.get(fromId); + const toMember = this.members.get(toId); + if (!fromMember || !toMember) { + return { + term: '未知', + path: '', + success: false, + error: '成员不存在' + }; + } + // 构建关系路径(从 fromId 到 toId) + const path = this.buildRelationPath(fromId, toId); + if (!path) { + return { + term: '无血缘关系', + path: '', + success: false + }; + } + // 将路径转换为中文 + const chinesePath = this.pathToChineseText(path); + // 使用 relationship.js 计算关系 + try { + // 获取fromId成员的性别(从谁的角度看关系) + const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1; + // 计算关系(toId 对 fromId 的称谓) + const result = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$relationship$2e$js$40$1$2e$2$2e$7$2f$node_modules$2f$relationship$2e$js$2f$dist$2f$relationship$2e$min$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])({ + text: chinesePath, + target: '', + sex: fromMemberGender, + reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓 + }); + const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'; + return { + term, + path: chinesePath, + success: true + }; + } catch (error) { + return { + term: '亲戚', + path: chinesePath, + success: true + }; + } + } + /** + * 构建关系路径字符串 + * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子 + * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹 + */ buildRelationPath(fromId, toId) { + // 使用BFS查找最短路径 + const queue = [ + { + id: fromId, + path: '' + } + ]; + const visited = new Set(); + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + return path; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + queue.push({ + id: member.fatherId, + path: path + 'f' + }); + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + queue.push({ + id: member.motherId, + path: path + 'm' + }); + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const spousePath = member.gender === 'MALE' ? 'w' : 'h'; + queue.push({ + id: spouseId, + path: path + spousePath + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const childPath = child.gender === 'MALE' ? 's' : 'd'; + queue.push({ + id: childId, + path: path + childPath + }); + } + } + } + } + // 兄弟姐妹(通过父母查找) + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹 + const siblingPath = this.getSiblingPath(member, sibling); + queue.push({ + id: siblingId, + path: path + siblingPath + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹 + */ getSiblings(memberId) { + const member = this.members.get(memberId); + if (!member) return []; + const siblings = []; + // 通过父亲查找 + if (member.fatherId) { + const father = this.members.get(member.fatherId); + if (father?.childrenIds) { + siblings.push(...father.childrenIds.filter((id)=>id !== memberId)); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = this.members.get(member.motherId); + if (mother?.childrenIds) { + for (const childId of mother.childrenIds){ + if (childId !== memberId && !siblings.includes(childId)) { + siblings.push(childId); + } + } + } + } + return siblings; + } + /** + * 获取兄弟姐妹关系路径 + */ getSiblingPath(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + // 男性:哥哥(ob) 或 弟弟(lb) + return toAge > fromAge ? 'ob' : 'lb'; + } else { + // 女性:姐姐(os) 或 妹妹(ls) + return toAge > fromAge ? 'os' : 'ls'; + } + } + /** + * 获取年龄(用于比较) + */ getAge(member) { + if (!member.birthDate) return 0; + const birthYear = new Date(member.birthDate).getFullYear(); + return new Date().getFullYear() - birthYear; + } + /** + * 获取关系的详细说明 + */ getRelationshipDetail(fromId, toId) { + const result = this.getRelationship(fromId, toId); + if (!result.success) { + return { + ...result, + description: result.error || '无法计算关系' + }; + } + // 构建带人名的路径(从 fromId 到 toId) + const pathWithNames = this.buildPathWithNames(fromId, toId); + // 只返回关系称谓,不包含完整句子 + return { + ...result, + path: pathWithNames || result.path, + description: result.term + }; + } + /** + * 构建带人名的路径描述 + * @param fromId 起始ID(查询的起点) + * @param toId 目标ID(查询的终点) + */ buildPathWithNames(fromId, toId) { + const queue = [ + { + id: fromId, + path: [] + } + ]; + const visited = new Set(); + // 获取起始成员名字 + const startMember = this.members.get(fromId); + const startName = startMember?.fullName || '未知'; + while(queue.length > 0){ + const { id, path } = queue.shift(); + if (id === toId) { + // 构建路径字符串:从起点到终点 + if (path.length === 0) return '本人'; + // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ... + const pathStr = path.map((p)=>`${p.relation}(${p.name})`).join(' → '); + return `${startName} → ${pathStr}`; + } + if (visited.has(id)) continue; + visited.add(id); + const member = this.members.get(id); + if (!member) continue; + // 向上:父亲 + if (member.fatherId && !visited.has(member.fatherId)) { + const father = this.members.get(member.fatherId); + if (father) { + queue.push({ + id: member.fatherId, + path: [ + ...path, + { + name: father.fullName, + relation: '父亲' + } + ] + }); + } + } + // 向上:母亲 + if (member.motherId && !visited.has(member.motherId)) { + const mother = this.members.get(member.motherId); + if (mother) { + queue.push({ + id: member.motherId, + path: [ + ...path, + { + name: mother.fullName, + relation: '母亲' + } + ] + }); + } + } + // 配偶关系 + if (member.spouseIds) { + for (const spouseId of member.spouseIds){ + if (!visited.has(spouseId)) { + const spouse = this.members.get(spouseId); + if (spouse) { + const relation = member.gender === 'MALE' ? '妻子' : '丈夫'; + queue.push({ + id: spouseId, + path: [ + ...path, + { + name: spouse.fullName, + relation + } + ] + }); + } + } + } + } + // 向下:子女 + if (member.childrenIds) { + for (const childId of member.childrenIds){ + if (!visited.has(childId)) { + const child = this.members.get(childId); + if (child) { + const relation = child.gender === 'MALE' ? '儿子' : '女儿'; + queue.push({ + id: childId, + path: [ + ...path, + { + name: child.fullName, + relation + } + ] + }); + } + } + } + } + // 兄弟姐妹 + if (member.fatherId || member.motherId) { + const siblings = this.getSiblings(id); + for (const siblingId of siblings){ + if (!visited.has(siblingId)) { + const sibling = this.members.get(siblingId); + if (sibling) { + const siblingPath = this.getSiblingRelationName(member, sibling); + queue.push({ + id: siblingId, + path: [ + ...path, + { + name: sibling.fullName, + relation: siblingPath + } + ] + }); + } + } + } + } + } + return null; + } + /** + * 获取兄弟姐妹关系名称 + */ getSiblingRelationName(from, to) { + const fromAge = this.getAge(from); + const toAge = this.getAge(to); + if (to.gender === 'MALE') { + return toAge > fromAge ? '哥哥' : '弟弟'; + } else { + return toAge > fromAge ? '姐姐' : '妹妹'; + } + } + /** + * 计算路径长度(关系代数) + */ calculatePathLength(path) { + let length = 0; + let i = 0; + while(i < path.length){ + // 两字符的关系 + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if ([ + 'ob', + 'lb', + 'os', + 'ls' + ].includes(twoChar)) { + length++; + i += 2; + continue; + } + } + // 单字符的关系 + length++; + i++; + } + return length; + } + /** + * 将符号路径转换为中文文本 + * 例如:'fm' -> '父亲的母亲' + */ pathToChineseText(path) { + const pathMap = { + 'f': '父亲', + 'm': '母亲', + 'h': '丈夫', + 'w': '妻子', + 's': '儿子', + 'd': '女儿', + 'ob': '哥哥', + 'lb': '弟弟', + 'os': '姐姐', + 'ls': '妹妹' + }; + const parts = []; + let i = 0; + while(i < path.length){ + // 处理两字符的关系(如 ob, lb, os, ls) + if (i + 1 < path.length) { + const twoChar = path.substring(i, i + 2); + if (pathMap[twoChar]) { + parts.push(pathMap[twoChar]); + i += 2; + continue; + } + } + // 处理单字符的关系 + const oneChar = path[i]; + if (pathMap[oneChar]) { + parts.push(pathMap[oneChar]); + } + i++; + } + return parts.join('的'); + } + /** + * 将路径转换为中文描述(带"的"字) + */ getPathDescription(path) { + const pathMap = { + 'f': '的父亲', + 'm': '的母亲', + 'h': '的丈夫', + 'w': '的妻子', + 's': '的儿子', + 'd': '的女儿', + 'ob': '的哥哥', + 'lb': '的弟弟', + 'os': '的姐姐', + 'ls': '的妹妹' + }; + let description = ''; + for (const char of path){ + description += pathMap[char] || ''; + } + return description || '本人'; + } +} +}), +"[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "useRelationship", + ()=>useRelationship +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts [app-ssr] (ecmascript)"); +; +; +; +function useRelationship() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const [loading, setLoading] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + /** + * 计算两个成员之间的关系(客户端计算) + */ const calculateRelationship = (fromId, toId)=>{ + const members = Object.values(treeData.members); + const calculator = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$relationship$2d$calculator$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["RelationshipCalculator"](members); + return calculator.getRelationshipDetail(fromId, toId); + }; + /** + * 通过API计算关系(服务端计算) + */ const calculateRelationshipAPI = async (treeId, fromId, toId)=>{ + setLoading(true); + try { + const response = await fetch(`/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`); + if (!response.ok) { + throw new Error('计算关系失败'); + } + const data = await response.json(); + return { + term: data.relationship, + path: data.path, + description: data.description, + success: data.success + }; + } catch (error) { + console.error('计算关系失败:', error); + return null; + } finally{ + setLoading(false); + } + }; + /** + * 获取成员的所有直系亲属 + */ const getDirectRelatives = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return null; + const relatives = { + father: member.fatherId ? treeData.members[member.fatherId] : null, + mother: member.motherId ? treeData.members[member.motherId] : null, + spouses: member.spouseIds?.map((id)=>treeData.members[id]).filter(Boolean) || [], + children: member.childrenIds?.map((id)=>treeData.members[id]).filter(Boolean) || [] + }; + return relatives; + }; + /** + * 获取成员的所有兄弟姐妹 + */ const getSiblings = (memberId)=>{ + const member = treeData.members[memberId]; + if (!member) return []; + const siblings = new Set(); + // 通过父亲查找 + if (member.fatherId) { + const father = treeData.members[member.fatherId]; + if (father?.childrenIds) { + father.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + // 通过母亲查找 + if (member.motherId) { + const mother = treeData.members[member.motherId]; + if (mother?.childrenIds) { + mother.childrenIds.forEach((id)=>{ + if (id !== memberId) siblings.add(id); + }); + } + } + return Array.from(siblings).map((id)=>treeData.members[id]).filter(Boolean); + }; + /** + * 获取成员的所有祖先 + */ const getAncestors = (memberId, maxGenerations = 10)=>{ + const ancestors = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + ancestors.push({ + ...member, + generationDiff: generation + }); + } + if (member.fatherId) { + queue.push({ + id: member.fatherId, + generation: generation + 1 + }); + } + if (member.motherId) { + queue.push({ + id: member.motherId, + generation: generation + 1 + }); + } + } + return ancestors; + }; + /** + * 获取成员的所有后代 + */ const getDescendants = (memberId, maxGenerations = 10)=>{ + const descendants = []; + const visited = new Set(); + const queue = [ + { + id: memberId, + generation: 0 + } + ]; + while(queue.length > 0){ + const { id, generation } = queue.shift(); + if (generation >= maxGenerations || visited.has(id)) continue; + visited.add(id); + const member = treeData.members[id]; + if (!member) continue; + if (generation > 0) { + descendants.push({ + ...member, + generationDiff: generation + }); + } + if (member.childrenIds) { + member.childrenIds.forEach((childId)=>{ + queue.push({ + id: childId, + generation: generation + 1 + }); + }); + } + } + return descendants; + }; + return { + calculateRelationship, + calculateRelationshipAPI, + getDirectRelatives, + getSiblings, + getAncestors, + getDescendants, + loading + }; +} +}), +"[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "default", + ()=>TreePage +]); +var __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$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$tree$2d$layout$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$d3$2d$org$2d$chart$2d$flow$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts [app-ssr] (ecmascript)"); +var __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$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/zoom-in.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/zoom-out.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/move.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/download.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$layout$2d$grid$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LayoutGrid$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/layout-grid.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/users.js [app-ssr] (ecmascript) "); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/navigation.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +; +; +; +; +; +function TreePage() { + const { treeData } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$context$2f$family$2d$context$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useFamily"])(); + const { calculateRelationship } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$hooks$2f$use$2d$relationship$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRelationship"])(); + const router = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRouter"])(); + const searchParams = (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$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])(); + const [viewMode, setViewMode] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])("traditional"); + // 关系查询模式 + const [relationMode, setRelationMode] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [selectedMembers, setSelectedMembers] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]); + const [relationResult, setRelationResult] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null); + const [showRelationDialog, setShowRelationDialog] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + // 从 URL 参数读取视图模式 + (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{ + const view = searchParams.get('view'); + if (view === 'd3-org-chart' || view === 'traditional') { + setViewMode(view); + } + }, [ + searchParams + ]); + const [scale, setScale] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(1); + const [position, setPosition] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const [isDragging, setIsDragging] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false); + const [startPos, setStartPos] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const [dragStartPos, setDragStartPos] = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])({ + x: 0, + y: 0 + }); + const containerRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const d3ChartRef = (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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null); + const handleMouseDown = (e)=>{ + // 如果点击的是节点卡片,不启动拖拽 + const target = e.target; + if (target.closest('.family-node-card')) { + return; + } + setIsDragging(true); + setStartPos({ + x: e.clientX - position.x, + y: e.clientY - position.y + }); + setDragStartPos({ + x: e.clientX, + y: e.clientY + }); + }; + const handleMouseMove = (e)=>{ + if (!isDragging) return; + // 只有移动超过5px才算拖拽,避免误触 + const deltaX = Math.abs(e.clientX - dragStartPos.x); + const deltaY = Math.abs(e.clientY - dragStartPos.y); + if (deltaX < 5 && deltaY < 5) return; + setPosition({ + x: e.clientX - startPos.x, + y: e.clientY - startPos.y + }); + }; + const handleMouseUp = ()=>{ + setIsDragging(false); + }; + // 处理成员选择(关系查询模式) + const handleMemberClick = (memberId)=>{ + if (!relationMode) return; + if (selectedMembers.length === 0) { + // 选择第一个成员 + setSelectedMembers([ + memberId + ]); + } else if (selectedMembers.length === 1) { + // 选择第二个成员,计算关系 + const [firstId] = selectedMembers; + if (firstId === memberId) { + // 点击同一个人,取消选择 + setSelectedMembers([]); + return; + } + const result = calculateRelationship(firstId, memberId); + const firstMember = treeData.members[firstId]; + const secondMember = treeData.members[memberId]; + setRelationResult({ + from: firstMember, + to: secondMember, + relationship: result + }); + setShowRelationDialog(true); + setSelectedMembers([]); + setRelationMode(false); + } + }; + // 切换关系查询模式 + const toggleRelationMode = ()=>{ + setRelationMode(!relationMode); + setSelectedMembers([]); + setRelationResult(null); + }; + const handleExportImage = async ()=>{ + if (!containerRef.current) return; + try { + // 临时重置位置和缩放以获取完整视图 + const originalPosition = { + ...position + }; + const originalScale = scale; + setPosition({ + x: 0, + y: 0 + }); + setScale(1); + // 等待 DOM 更新 + await new Promise((resolve)=>setTimeout(resolve, 800)); + // 找到实际的族谱容器(包含 TreeLayout 的 div) + const treeContainer = containerRef.current.querySelector('div[style*="transform"]'); + if (!treeContainer) { + throw new Error('找不到族谱容器'); + } + // 查找所有连接线(使用更宽泛的选择器) + const allDivs = treeContainer.querySelectorAll('div'); + const lineElements = []; + allDivs.forEach((div)=>{ + const el = div; + const classes = String(el.className || ''); + // 查找包含 bg-foreground 的元素(连接线) + if (classes.includes('bg-foreground')) { + lineElements.push(el); + } + }); + // 克隆容器用于导出 + const clonedContainer = treeContainer.cloneNode(true); + // 在克隆的容器中找到对应的连接线并设置样式 + const clonedDivs = clonedContainer.querySelectorAll('div'); + let lineIndex = 0; + clonedDivs.forEach((div)=>{ + const el = div; + const classes = String(el.className || ''); + if (classes.includes('bg-foreground') && lineElements[lineIndex]) { + const original = lineElements[lineIndex]; + const computed = window.getComputedStyle(original); + // 直接设置内联样式 + el.style.backgroundColor = computed.backgroundColor; + el.style.width = computed.width; + el.style.height = computed.height; + el.style.position = 'absolute'; + el.style.left = computed.left; + el.style.top = computed.top; + lineIndex++; + } + }); + // 移除卡片边框 + clonedContainer.querySelectorAll('*').forEach((child)=>{ + const el = child; + const classes = String(el.className || ''); + // 跳过连接线和连接线容器 + if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) { + return; + } + // 移除其他元素的边框 + el.style.border = 'none'; + el.style.outline = 'none'; + }); + // 临时添加到 DOM + clonedContainer.style.position = 'fixed'; + clonedContainer.style.left = '-9999px'; + clonedContainer.style.top = '0'; + document.body.appendChild(clonedContainer); + // 等待渲染 + await new Promise((resolve)=>setTimeout(resolve, 200)); + // 动态导入 dom-to-image-more(仅在客户端) + const domtoimage = await __turbopack_context__.A("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dom-to-image-more@3.7.2/node_modules/dom-to-image-more/dist/dom-to-image-more.min.js [app-ssr] (ecmascript, async loader)"); + // 使用 toBlob 方法 + const blob = await domtoimage.default.toBlob(clonedContainer, { + quality: 0.95, + bgcolor: '#ffffff' + }); + // 清理克隆的容器 + document.body.removeChild(clonedContainer); + // 恢复原始位置和缩放 + setPosition(originalPosition); + setScale(originalScale); + // 创建下载链接 + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`; + link.href = url; + link.click(); + // 清理 + setTimeout(()=>URL.revokeObjectURL(url), 100); + } catch (error) { + console.error('导出图片失败:', error); + } + }; + // Handle root not found + if (!treeData.rootId) { + 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$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: "min-h-screen bg-background flex flex-col", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 236, + 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", { + className: "flex-1 flex items-center justify-center text-muted-foreground", + children: "暂无家族树数据" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 237, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 235, + columnNumber: 7 + }, this); + } + 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$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-screen flex flex-col bg-muted/30 overflow-hidden", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 244, + 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 top-20 right-4 z-30 flex gap-2", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: relationMode ? "default" : "outline", + className: "gap-2 shadow-lg", + onClick: toggleRelationMode, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__["Users"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 254, + columnNumber: 11 + }, this), + relationMode ? selectedMembers.length === 0 ? '选择第一个成员' : '选择第二个成员' : '关系查询' + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 249, + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenu"], { + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuTrigger"], { + asChild: true, + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + className: "gap-2 shadow-lg", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$layout$2d$grid$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__LayoutGrid$3e$__["LayoutGrid"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 263, + columnNumber: 15 + }, this), + viewMode === 'traditional' ? '传统视图' : 'D3家谱图', + /*#__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$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ChevronDown$3e$__["ChevronDown"], { + className: "h-3 w-3" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 265, + columnNumber: 15 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 262, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 261, + 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$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuContent"], { + align: "end", + className: "w-48", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', 'traditional'); + router.push(`/tree?${params.toString()}`); + }, + className: viewMode === 'traditional' ? 'bg-accent' : '', + 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 w-full", + 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", { + children: "传统家谱视图" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 278, + columnNumber: 17 + }, this), + viewMode === 'traditional' && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 279, + columnNumber: 48 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 277, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 269, + 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$components$2f$ui$2f$dropdown$2d$menu$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["DropdownMenuItem"], { + onClick: ()=>{ + const params = new URLSearchParams(searchParams.toString()); + params.set('view', 'd3-org-chart'); + router.push(`/tree?${params.toString()}`); + }, + className: viewMode === 'd3-org-chart' ? 'bg-accent' : '', + 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 w-full", + 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", { + children: "D3 家谱图" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 291, + columnNumber: 17 + }, this), + viewMode === 'd3-org-chart' && /*#__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", + children: "✓" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 292, + columnNumber: 49 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 290, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 282, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 268, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 260, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 247, + columnNumber: 7 + }, this), + viewMode === 'traditional' ? /*#__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-1 relative", + 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: "absolute top-4 left-4 z-20 flex flex-col gap-2 bg-background/80 backdrop-blur p-2 rounded-lg border shadow-sm", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setScale((s)=>Math.min(s + 0.1, 2)), + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__["ZoomIn"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 304, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 303, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setScale((s)=>Math.max(s - 0.1, 0.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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 307, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 306, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>setPosition({ + x: 0, + y: 0 + }), + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 310, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 309, + 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"])("div", { + className: "h-px bg-border my-1" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 312, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: handleExportImage, + title: "导出为图片", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__["Download"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 314, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 313, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 302, + 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", { + ref: containerRef, + className: "w-full h-full overflow-hidden cursor-move relative touch-none bg-[url('https://www.transparenttextures.com/patterns/rice-paper.png')] bg-repeat select-none", + onMouseDown: handleMouseDown, + onMouseMove: handleMouseMove, + onMouseUp: handleMouseUp, + onMouseLeave: handleMouseUp, + 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", { + style: { + transform: `translate(${position.x}px, ${position.y}px) scale(${scale})`, + transformOrigin: "top center", + transition: isDragging ? "none" : "transform 0.1s ease-out" + }, + className: "absolute min-w-full min-h-full flex justify-center pt-20 pb-20", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$tree$2d$layout$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["TreeLayout"], { + rootId: treeData.rootId + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 335, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 327, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 319, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 300, + 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", { + className: "flex-1 relative", + 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: "absolute top-4 left-4 z-20 flex flex-col gap-2 bg-background/80 backdrop-blur p-2 rounded-lg border shadow-sm", + 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"])(__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$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.expandAll(), + title: "展开全部", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$in$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomIn$3e$__["ZoomIn"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 344, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 343, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.collapseAll(), + title: "折叠全部", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zoom$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__ZoomOut$3e$__["ZoomOut"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 347, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 346, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.fitView(), + title: "适应视图", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$move$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Move$3e$__["Move"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 350, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 349, + 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"])("div", { + className: "h-px bg-border my-1" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 352, + 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$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Button"], { + variant: "outline", + size: "icon", + onClick: ()=>d3ChartRef.current?.exportPNG(), + title: "导出PNG", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$download$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Download$3e$__["Download"], { + className: "h-4 w-4" + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 354, + columnNumber: 15 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 353, + columnNumber: 13 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 342, + 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", { + className: "w-full h-full p-4", + 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"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$tree$2f$d3$2d$org$2d$chart$2d$flow$2e$tsx__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["D3OrgChartFlow"], { + ref: d3ChartRef, + members: treeData.members, + rootId: treeData.rootId, + onMemberClick: (id)=>router.push(`/members/${id}`) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 359, + columnNumber: 13 + }, this) + }, void 0, false, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 358, + columnNumber: 11 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 340, + columnNumber: 9 + }, this) + ] + }, void 0, true, { + fileName: "[project]/Documents/go-new/chinese-family-tree/app/tree/page.tsx", + lineNumber: 243, + columnNumber: 5 + }, this); +} +}), +]; + +//# sourceMappingURL=%5Broot-of-the-server%5D__ee197932._.js.map \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js.map b/.next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js.map new file mode 100644 index 00000000..704d29c5 --- /dev/null +++ b/.next/dev/server/chunks/ssr/[root-of-the-server]__ee197932._.js.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "sources": [], + "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 } 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 {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": 1187, "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": 1220, "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": 1281, "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 isRoot?: boolean\n onSelect?: (member: FamilyMember) => void\n isHighlighted?: 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 }: { member: FamilyMember; isRoot?: boolean; isSpouse?: boolean; onSelect?: (member: FamilyMember) => void; isHighlighted?: 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, isRoot, onSelect, isHighlighted }: FamilyNodeProps) {\n if (!spouse) {\n return \n }\n \n // 有配偶时,并排显示\n return (\n
\n \n \n \n
\n )\n}\n"],"names":[],"mappings":";;;;;AAGA;AACA;AACA;AAAA;AAAA;AALA;;;;;AAeA,iBAAiB;AACjB,SAAS,WAAW,UAAmB;IACrC,IAAI,CAAC,YAAY,OAAO;IACxB,MAAM,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE;IACrC,OAAO;AACT;AAEA,OAAO;AACP,SAAS,aAAa,SAAkB,EAAE,SAAkB;IAC1D,IAAI,CAAC,WAAW,OAAO;IAEvB,MAAM,QAAQ,IAAI,KAAK;IACvB,MAAM,MAAM,YAAY,IAAI,KAAK,aAAa,IAAI;IAElD,IAAI,MAAM,IAAI,WAAW,KAAK,MAAM,WAAW;IAC/C,MAAM,YAAY,IAAI,QAAQ,KAAK,MAAM,QAAQ;IAEjD,IAAI,YAAY,KAAM,cAAc,KAAK,IAAI,OAAO,KAAK,MAAM,OAAO,IAAK;QACzE;IACF;IAEA,OAAO;AACT;AAEA,WAAW;AACX,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAsI;IAC3M,MAAM,EAAE,WAAW,aAAa,EAAE,GAAG,IAAA,wMAAc,EAAC,QAAQ;IAE5D,MAAM,YAAY,WAAW,OAAO,SAAS;IAC7C,MAAM,YAAY,WAAW,OAAO,SAAS;IAC7C,MAAM,MAAM,aAAa,OAAO,SAAS,EAAE,OAAO,SAAS;IAE3D,MAAM,WAAW,YACb,YACE,GAAG,UAAU,CAAC,EAAE,WAAW,GAC3B,GAAG,UAAU,CAAC,CAAC,GACjB;IAEJ,MAAM,UAAU,QAAQ,OACpB,OAAO,SAAS,GACd,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GACX,GAAG,IAAI,CAAC,CAAC,GACX;IAEJ,qBACE,oaAAC;QACC,WAAW,IAAA,yKAAE,EACX,0IACA,gBACI,4HACA,SACE,yCACA,WACE,wDACA;QAEV,SAAS,IAAM,WAAW;;0BAE1B,oaAAC;gBAAI,WAAU;;oBACZ,OAAO,UAAU;oBAAC;;;;;;;0BAGrB,oaAAC;gBAAI,WAAU;0BACZ,8BACC,oaAAC;oBACC,KAAK;oBACL,KAAK,OAAO,QAAQ;oBACpB,WAAU;;;;;2BAGZ,OAAO,MAAM,KAAK,yBAChB,oaAAC,8XAAe;oBAAC,WAAU;;;;;yCAE3B,oaAAC,2WAAU;oBAAC,WAAU;;;;;;;;;;;0BAK5B,oaAAC;gBAAI,WAAU;;kCACb,oaAAC;wBAAI,WAAU;;4BAAsD,OAAO,OAAO;4BAAC;4BAAE,OAAO,SAAS;;;;;;;oBACrG,OAAO,YAAY,kBAClB,oaAAC;wBAAI,WAAU;;4BAA2C;4BAAG,OAAO,YAAY;;;;;;;oBAEjF,0BACC,oaAAC;wBAAI,WAAU;kCACZ;;;;;;oBAGJ,yBACC,oaAAC;wBAAI,WAAU;kCACZ;;;;;;oBAGJ,OAAO,KAAK,kBACX,oaAAC;wBAAI,WAAU;;4BAAyD;4BAClE,OAAO,KAAK;;;;;;;;;;;;;YAKrB,OAAO,SAAS,kBACf,oaAAC;gBAAI,WAAU;;;;;;;;;;;;AAIvB;AAEO,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAmB;IAC7F,IAAI,CAAC,QAAQ;QACX,qBAAO,oaAAC;YAAW,QAAQ;YAAQ,QAAQ;YAAQ,UAAU;YAAU,eAAe;;;;;;IACxF;IAEA,YAAY;IACZ,qBACE,oaAAC;QAAI,WAAU;;0BACb,oaAAC;gBAAW,QAAQ;gBAAQ,QAAQ;gBAAQ,UAAU;gBAAU,eAAe;;;;;;0BAC/E,oaAAC,wVAAK;gBAAC,WAAU;;;;;;0BACjB,oaAAC;gBAAW,QAAQ;gBAAQ,UAAU;gBAAM,UAAU;;;;;;;;;;;;AAG5D"}}, + {"offset": {"line": 1492, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/tree-layout.tsx"],"sourcesContent":["\"use client\"\nimport type { FamilyMember } from \"@/types/family\"\nimport { FamilyNode } from \"./family-node\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useEffect, useRef, useState, useCallback } from \"react\"\nimport { useRouter } from \"next/navigation\"\n\ninterface TreeLayoutProps {\n rootId: string\n onSelectMember?: (member: FamilyMember) => void\n}\n\ninterface Connection {\n from: { x: number; y: number }\n to: { x: number; y: number }\n type: 'vertical' | 'horizontal'\n}\n\nexport function TreeLayout({ rootId, onSelectMember }: TreeLayoutProps) {\n const { getMember, treeData, highlightedMemberId } = useFamily()\n const root = getMember(rootId)\n const router = useRouter()\n const containerRef = useRef(null)\n const [connections, setConnections] = useState([])\n const nodeRefs = useRef>(new Map())\n\n // 节点间距配置\n const HORIZONTAL_GAP = 32 // 2rem = 32px\n const VERTICAL_GAP = 48 // 3rem = 48px\n const CONNECTOR_HEIGHT = 48 // 连接线垂直高度\n \n // 处理节点点击\n const handleNodeClick = useCallback((member: FamilyMember) => {\n router.push(`/members/${member.id}`)\n }, [router])\n\n // 计算所有连线位置\n const calculateConnections = useCallback(() => {\n const newConnections: Connection[] = []\n const containerRect = containerRef.current?.getBoundingClientRect()\n if (!containerRect) return\n\n // 检查是否有足够的节点已注册\n if (nodeRefs.current.size === 0) return\n\n nodeRefs.current.forEach((nodeElement, nodeId) => {\n const member = getMember(nodeId)\n if (!member || !member.childrenIds || member.childrenIds.length === 0) return\n\n const parentRect = nodeElement.getBoundingClientRect()\n const parentCenterX = parentRect.left + parentRect.width / 2 - containerRect.left\n const parentBottomY = parentRect.bottom - containerRect.top\n\n // 父节点到水平线的垂直连线\n const verticalLineY = parentBottomY + CONNECTOR_HEIGHT / 2\n newConnections.push({\n from: { x: parentCenterX, y: parentBottomY },\n to: { x: parentCenterX, y: verticalLineY },\n type: 'vertical'\n })\n\n // 获取所有子节点的位置\n const childPositions = member.childrenIds\n .map(childId => {\n const childElement = nodeRefs.current.get(childId)\n if (!childElement) return null\n const childRect = childElement.getBoundingClientRect()\n return {\n id: childId,\n centerX: childRect.left + childRect.width / 2 - containerRect.left,\n topY: childRect.top - containerRect.top\n }\n })\n .filter(Boolean) as Array<{ id: string; centerX: number; topY: number }>\n\n if (childPositions.length === 0) return\n\n // 如果有多个子节点,绘制水平连线\n if (childPositions.length > 1) {\n const leftmostX = Math.min(...childPositions.map(p => p.centerX))\n const rightmostX = Math.max(...childPositions.map(p => p.centerX))\n \n newConnections.push({\n from: { x: leftmostX, y: verticalLineY },\n to: { x: rightmostX, y: verticalLineY },\n type: 'horizontal'\n })\n }\n\n // 每个子节点的垂直连线\n childPositions.forEach(child => {\n newConnections.push({\n from: { x: child.centerX, y: verticalLineY },\n to: { x: child.centerX, y: child.topY },\n type: 'vertical'\n })\n })\n })\n\n setConnections(newConnections)\n }, [getMember])\n\n useEffect(() => {\n // 多次尝试计算,确保 DOM 完全渲染\n const timers: NodeJS.Timeout[] = []\n timers.push(setTimeout(calculateConnections, 50))\n timers.push(setTimeout(calculateConnections, 150))\n timers.push(setTimeout(calculateConnections, 300))\n timers.push(setTimeout(calculateConnections, 500))\n \n // 监听窗口大小变化\n window.addEventListener('resize', calculateConnections)\n \n return () => {\n timers.forEach(timer => clearTimeout(timer))\n window.removeEventListener('resize', calculateConnections)\n }\n }, [calculateConnections, treeData])\n\n if (!root) return null\n\n // 递归渲染树节点\n const TreeNode = ({ memberId, isRoot = false }: { memberId: string; isRoot?: boolean }) => {\n const member = getMember(memberId)\n if (!member) return null\n\n const hasChildren = member.childrenIds && member.childrenIds.length > 0\n \n // 获取配偶(取第一个配偶)\n const spouse = member.spouseIds && member.spouseIds.length > 0 \n ? getMember(member.spouseIds[0]) \n : undefined\n\n return (\n
\n {/* 节点本身 */}\n
{\n if (el) {\n nodeRefs.current.set(memberId, el)\n } else {\n nodeRefs.current.delete(memberId)\n }\n }}\n className=\"relative z-10\"\n >\n \n
\n\n {/* 子节点 */}\n {hasChildren && (\n
\n {member.childrenIds.map((childId) => (\n \n ))}\n
\n )}\n
\n )\n }\n\n return (\n
\n
\n {/* 连线层 - 使用 div 绘制 */}\n
\n {connections.map((conn, index) => {\n const isHorizontal = conn.type === 'horizontal'\n // 使用 1px 但通过 transform scale 缩小来实现细线\n const width = isHorizontal ? Math.abs(conn.to.x - conn.from.x) : 1\n const height = isHorizontal ? 1 : Math.abs(conn.to.y - conn.from.y)\n const left = Math.min(conn.from.x, conn.to.x)\n const top = Math.min(conn.from.y, conn.to.y)\n \n // 跳过无效的连线(宽度或高度为0)\n if (width <= 0 || height <= 0) return null\n \n return (\n \n )\n })}\n
\n\n {/* 树节点层 */}\n
\n \n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 1774, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/tree/d3-org-chart-flow.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState, forwardRef, useImperativeHandle } from \"react\"\nimport * as d3 from \"d3\"\n// @ts-ignore - d3-org-chart没有TypeScript类型定义\nimport { OrgChart } from \"d3-org-chart\"\nimport { Download, FileText } from \"lucide-react\"\nimport type { FamilyMember } from \"@/types/family\"\nimport jsPDF from \"jspdf\"\nimport { db } from \"@/lib/db\"\n\ninterface D3OrgChartFlowProps {\n members: Record\n rootId: string\n onMemberClick?: (memberId: string) => void\n onExport?: () => void\n}\n\nexport interface D3OrgChartRef {\n exportPNG: () => void\n exportPDF: () => void\n expandAll: () => void\n collapseAll: () => void\n fitView: () => void\n}\n\ninterface ChartNode {\n id: string\n parentId: string | null\n name: string\n generation: string\n birthYear: string\n deathYear: string\n birthPlace: string\n gender: string\n avatarImageId: string | null | undefined\n spouseName: string\n spouseId: string | null\n hasChildren: boolean\n ageText: string\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\nexport const D3OrgChartFlow = forwardRef(\n ({ members, rootId, onMemberClick, onExport }, ref) => {\n const chartRef = useRef(null)\n const chartInstanceRef = useRef(null)\n const [isReady, setIsReady] = useState(false)\n const [avatarCache, setAvatarCache] = useState>(new Map())\n\n // 转换数据格式\n const convertToChartData = (): ChartNode[] => {\n const chartNodes: ChartNode[] = []\n \n // 首先找到根节点(没有父节点的节点)\n const rootMember = members[rootId]\n if (!rootMember) return []\n \n // 使用BFS遍历,确保只包含从rootId开始的树\n const visited = new Set()\n const queue: string[] = [rootId]\n \n while (queue.length > 0) {\n const currentId = queue.shift()!\n if (visited.has(currentId)) continue\n \n visited.add(currentId)\n const member = members[currentId]\n if (!member) continue\n \n // 获取配偶信息,确保配偶存在于members中\n let spouse = null\n if (member.spouseIds?.[0] && members[member.spouseIds[0]]) {\n spouse = members[member.spouseIds[0]]\n }\n \n // 确定父节点ID - 只有根节点的parentId为null\n let parentId: string | null = null\n if (currentId !== rootId) {\n // 根据姓氏判断主线,优先选择同姓的父母\n const father = member.fatherId ? members[member.fatherId] : null\n const mother = member.motherId ? members[member.motherId] : null\n \n // 判断父母中谁是家族主线(同姓)\n const isFatherMainLine = father && member.surname === father.surname\n const isMotherMainLine = mother && member.surname === mother.surname\n \n if (isFatherMainLine) {\n parentId = member.fatherId || null\n } else if (isMotherMainLine) {\n parentId = member.motherId || null\n } else if (father) {\n // 如果都不同姓,优先选择父亲\n parentId = member.fatherId || null\n } else if (mother) {\n parentId = member.motherId || null\n }\n }\n \n // 计算年龄文本\n const age = calculateAge(member.birthDate, member.deathDate)\n const ageText = age !== null\n ? member.deathDate\n ? `享年${age}岁`\n : `${age}岁`\n : ''\n \n chartNodes.push({\n id: member.id,\n parentId: parentId,\n name: member.fullName,\n generation: `第${member.generation}世`,\n birthYear: member.birthDate ? new Date(member.birthDate).getFullYear().toString() : '',\n deathYear: member.deathDate ? new Date(member.deathDate).getFullYear().toString() : '',\n birthPlace: member.birthPlace || '',\n gender: member.gender === 'MALE' ? '男' : '女',\n avatarImageId: member.avatarImageId,\n spouseName: spouse?.fullName || '',\n spouseId: spouse?.id || null,\n hasChildren: Object.values(members).some(m => m.fatherId === member.id || m.motherId === member.id),\n ageText: ageText\n })\n \n // 添加子节点到队列\n Object.values(members).forEach(m => {\n if ((m.fatherId === currentId || m.motherId === currentId) && !visited.has(m.id)) {\n queue.push(m.id)\n }\n })\n }\n \n return chartNodes\n }\n\n // 加载所有成员的头像\n useEffect(() => {\n const loadAvatars = async () => {\n const cache = new Map()\n \n for (const member of Object.values(members)) {\n if (member.avatarImageId) {\n try {\n const image = await db.images.get(member.avatarImageId)\n if (image) {\n const url = URL.createObjectURL(image.blob)\n cache.set(member.avatarImageId, url)\n }\n } catch (error) {\n console.error(`Failed to load avatar for ${member.fullName}:`, error)\n }\n }\n }\n \n setAvatarCache(cache)\n }\n \n loadAvatars()\n \n // 清理函数\n return () => {\n avatarCache.forEach(url => URL.revokeObjectURL(url))\n }\n }, [members])\n\n useEffect(() => {\n if (!chartRef.current || !rootId) return\n\n // 清理旧的图表\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n\n const data = convertToChartData()\n \n // 初始化图表\n const chart = new OrgChart()\n .container(chartRef.current)\n .data(data)\n .nodeWidth(() => 160)\n .nodeHeight(() => 120)\n .childrenMargin(() => 50)\n .compactMarginBetween(() => 35)\n .compactMarginPair(() => 35)\n .neighbourMargin(() => 35)\n .siblingsMargin(() => 35)\n .linkUpdate(function (d: any, i: any, arr: any) {\n // 加深连线颜色\n d3.select(arr[i])\n .attr('stroke', '#475569')\n .attr('stroke-width', 2.5)\n })\n .buttonContent(({ node }: any) => {\n return `
${node.children ? `` : ``} ${node.data._directSubordinates || 0}
`\n })\n .nodeContent((d: any) => {\n const node = d.data\n const color = node.gender === '男' ? '#3b82f6' : '#ec4899'\n const bgColor = node.gender === '男' ? '#dbeafe' : '#fce7f3'\n \n // 获取头像URL\n const avatarUrl = node.avatarImageId ? avatarCache.get(node.avatarImageId) : null\n \n return `\n
\n
\n
\n ${avatarUrl \n ? `\"${node.name}\"`\n : node.gender === '女'\n ? ``\n : ``\n }\n
\n
\n
\n ${node.name}\n
\n
\n ${node.generation}\n
\n
\n
\n \n
\n ${node.birthYear ? `
\n ${node.birthYear}${node.deathYear ? ` - ${node.deathYear}` : ''}\n ${node.ageText ? `${node.ageText}` : ''}\n
` : ''}\n ${node.birthPlace ? `
\n ${node.birthPlace}\n
` : ''}\n
\n \n ${node.spouseName && node.spouseId ? `\n
\n 配偶: ${node.spouseName}\n
\n ` : ''}\n \n ${node.deathYear ? `\n
\n ` : ''}\n
\n `\n })\n .onNodeClick((d: any) => {\n if (onMemberClick && d) {\n // d3-org-chart传递的是节点数据对象,需要提取id\n const nodeId = typeof d === 'string' ? d : (d.data?.id || d.id)\n if (nodeId) {\n onMemberClick(nodeId)\n }\n }\n })\n .render()\n .expandAll() // 初始化时展开所有节点\n\n // 添加配偶区域点击事件监听\n setTimeout(() => {\n const spouseAreas = chartRef.current?.querySelectorAll('.spouse-area')\n spouseAreas?.forEach((area) => {\n area.addEventListener('click', (e) => {\n e.stopPropagation() // 阻止事件冒泡到节点\n const spouseId = (area as HTMLElement).getAttribute('data-spouse-id')\n if (spouseId && onMemberClick) {\n onMemberClick(spouseId)\n }\n })\n })\n }, 100)\n\n chartInstanceRef.current = chart\n setIsReady(true)\n\n return () => {\n // 清理\n if (chartRef.current) {\n chartRef.current.innerHTML = ''\n }\n }\n }, [members, rootId, onMemberClick, avatarCache])\n\n // 导出PNG\n const handleExportPNG = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: true,\n full: true,\n onLoad: () => {\n onExport?.()\n }\n })\n }\n\n // 导出PDF\n const handleExportPDF = () => {\n if (!chartInstanceRef.current) return\n\n chartInstanceRef.current.exportImg({\n save: false,\n full: true,\n onLoad: (base64: string) => {\n const pdf = new jsPDF({\n orientation: 'landscape',\n unit: 'px',\n format: 'a4'\n })\n \n const img = new Image()\n img.src = base64\n img.onload = function () {\n const imgWidth = img.width\n const imgHeight = img.height\n const pdfWidth = pdf.internal.pageSize.getWidth()\n const pdfHeight = pdf.internal.pageSize.getHeight()\n \n // 计算缩放比例以适应页面\n const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight)\n const scaledWidth = imgWidth * ratio\n const scaledHeight = imgHeight * ratio\n \n // 居中放置\n const x = (pdfWidth - scaledWidth) / 2\n const y = (pdfHeight - scaledHeight) / 2\n \n pdf.addImage(img, 'PNG', x, y, scaledWidth, scaledHeight)\n pdf.save(`家谱图-${new Date().toISOString().split('T')[0]}.pdf`)\n onExport?.()\n }\n }\n })\n }\n\n // 展开所有节点\n const handleExpandAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.expandAll()\n }\n\n // 折叠所有节点\n const handleCollapseAll = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.collapseAll()\n }\n\n // 适应视图\n const handleFitView = () => {\n if (!chartInstanceRef.current) return\n chartInstanceRef.current.fit()\n }\n\n // 暴露方法给父组件\n useImperativeHandle(ref, () => ({\n exportPNG: handleExportPNG,\n exportPDF: handleExportPDF,\n expandAll: handleExpandAll,\n collapseAll: handleCollapseAll,\n fitView: handleFitView,\n }))\n\n return (\n
\n {/* 图表容器 */}\n
\n
\n )\n})\n\nD3OrgChartFlow.displayName = 'D3OrgChartFlow'\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 2143, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/lib/relationship-calculator.ts"],"sourcesContent":["import relationship from 'relationship.js'\nimport type { FamilyMember } from '@/types/family'\n\n/**\n * 家族关系计算器\n * 使用 relationship.js 库计算中文亲属关系\n */\nexport class RelationshipCalculator {\n private members: Map\n\n constructor(members: FamilyMember[]) {\n this.members = new Map(members.map(m => [m.id, m]))\n }\n\n /**\n * 计算两个成员之间的关系\n * @param fromId 起始成员ID(成员A)\n * @param toId 目标成员ID(成员B)\n * @returns 关系描述(toId 对 fromId 的称谓,即B是A的XXX)\n */\n getRelationship(fromId: string, toId: string): RelationshipResult {\n if (fromId === toId) {\n return {\n term: '本人',\n path: '',\n success: true\n }\n }\n\n const fromMember = this.members.get(fromId)\n const toMember = this.members.get(toId)\n\n if (!fromMember || !toMember) {\n return {\n term: '未知',\n path: '',\n success: false,\n error: '成员不存在'\n }\n }\n\n // 构建关系路径(从 fromId 到 toId)\n const path = this.buildRelationPath(fromId, toId)\n \n if (!path) {\n return {\n term: '无血缘关系',\n path: '',\n success: false\n }\n }\n\n // 将路径转换为中文\n const chinesePath = this.pathToChineseText(path)\n \n // 使用 relationship.js 计算关系\n try {\n // 获取fromId成员的性别(从谁的角度看关系)\n const fromMemberGender = fromMember.gender === 'FEMALE' ? 0 : 1\n \n // 计算关系(toId 对 fromId 的称谓)\n const result = relationship({\n text: chinesePath,\n target: '',\n sex: fromMemberGender, // 传入fromId的性别(从谁的角度看)\n reverse: true // 使用反向,因为路径是从A到B,但我们要的是B对A的称谓\n })\n \n const term = Array.isArray(result) && result.length > 0 ? result[0] : '亲戚'\n \n return {\n term,\n path: chinesePath,\n success: true\n }\n } catch (error) {\n return {\n term: '亲戚',\n path: chinesePath,\n success: true\n }\n }\n }\n\n /**\n * 构建关系路径字符串\n * 例如:'f' = 父亲, 'm' = 母亲, 'h' = 丈夫, 'w' = 妻子\n * 'ob' = 哥哥, 'lb' = 弟弟, 'os' = 姐姐, 'ls' = 妹妹\n */\n private buildRelationPath(fromId: string, toId: string): string | null {\n // 使用BFS查找最短路径\n const queue: Array<{ id: string; path: string }> = [{ id: fromId, path: '' }]\n const visited = new Set()\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n return path\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n queue.push({ id: member.fatherId, path: path + 'f' })\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n queue.push({ id: member.motherId, path: path + 'm' })\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const spousePath = member.gender === 'MALE' ? 'w' : 'h'\n queue.push({ id: spouseId, path: path + spousePath })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const childPath = child.gender === 'MALE' ? 's' : 'd'\n queue.push({ id: childId, path: path + childPath })\n }\n }\n }\n }\n\n // 兄弟姐妹(通过父母查找)\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n // 需要比较年龄确定是哥哥/弟弟/姐姐/妹妹\n const siblingPath = this.getSiblingPath(member, sibling)\n queue.push({ id: siblingId, path: path + siblingPath })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹\n */\n private getSiblings(memberId: string): string[] {\n const member = this.members.get(memberId)\n if (!member) return []\n\n const siblings: string[] = []\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = this.members.get(member.fatherId)\n if (father?.childrenIds) {\n siblings.push(...father.childrenIds.filter(id => id !== memberId))\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = this.members.get(member.motherId)\n if (mother?.childrenIds) {\n for (const childId of mother.childrenIds) {\n if (childId !== memberId && !siblings.includes(childId)) {\n siblings.push(childId)\n }\n }\n }\n }\n\n return siblings\n }\n\n /**\n * 获取兄弟姐妹关系路径\n */\n private getSiblingPath(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n // 男性:哥哥(ob) 或 弟弟(lb)\n return toAge > fromAge ? 'ob' : 'lb'\n } else {\n // 女性:姐姐(os) 或 妹妹(ls)\n return toAge > fromAge ? 'os' : 'ls'\n }\n }\n\n /**\n * 获取年龄(用于比较)\n */\n private getAge(member: FamilyMember): number {\n if (!member.birthDate) return 0\n const birthYear = new Date(member.birthDate).getFullYear()\n return new Date().getFullYear() - birthYear\n }\n\n /**\n * 获取关系的详细说明\n */\n getRelationshipDetail(fromId: string, toId: string): RelationshipDetail {\n const result = this.getRelationship(fromId, toId)\n \n if (!result.success) {\n return {\n ...result,\n description: result.error || '无法计算关系'\n }\n }\n\n // 构建带人名的路径(从 fromId 到 toId)\n const pathWithNames = this.buildPathWithNames(fromId, toId)\n\n // 只返回关系称谓,不包含完整句子\n return {\n ...result,\n path: pathWithNames || result.path,\n description: result.term\n }\n }\n\n /**\n * 构建带人名的路径描述\n * @param fromId 起始ID(查询的起点)\n * @param toId 目标ID(查询的终点)\n */\n private buildPathWithNames(fromId: string, toId: string): string | null {\n const queue: Array<{ id: string; path: Array<{name: string, relation: string}> }> = [\n { id: fromId, path: [] }\n ]\n const visited = new Set()\n \n // 获取起始成员名字\n const startMember = this.members.get(fromId)\n const startName = startMember?.fullName || '未知'\n\n while (queue.length > 0) {\n const { id, path } = queue.shift()!\n\n if (id === toId) {\n // 构建路径字符串:从起点到终点\n if (path.length === 0) return '本人'\n \n // 格式:起点 → 关系1(人名1) → 关系2(人名2) → ...\n const pathStr = path.map(p => `${p.relation}(${p.name})`).join(' → ')\n return `${startName} → ${pathStr}`\n }\n\n if (visited.has(id)) continue\n visited.add(id)\n\n const member = this.members.get(id)\n if (!member) continue\n\n // 向上:父亲\n if (member.fatherId && !visited.has(member.fatherId)) {\n const father = this.members.get(member.fatherId)\n if (father) {\n queue.push({\n id: member.fatherId,\n path: [...path, { name: father.fullName, relation: '父亲' }]\n })\n }\n }\n\n // 向上:母亲\n if (member.motherId && !visited.has(member.motherId)) {\n const mother = this.members.get(member.motherId)\n if (mother) {\n queue.push({\n id: member.motherId,\n path: [...path, { name: mother.fullName, relation: '母亲' }]\n })\n }\n }\n\n // 配偶关系\n if (member.spouseIds) {\n for (const spouseId of member.spouseIds) {\n if (!visited.has(spouseId)) {\n const spouse = this.members.get(spouseId)\n if (spouse) {\n const relation = member.gender === 'MALE' ? '妻子' : '丈夫'\n queue.push({\n id: spouseId,\n path: [...path, { name: spouse.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 向下:子女\n if (member.childrenIds) {\n for (const childId of member.childrenIds) {\n if (!visited.has(childId)) {\n const child = this.members.get(childId)\n if (child) {\n const relation = child.gender === 'MALE' ? '儿子' : '女儿'\n queue.push({\n id: childId,\n path: [...path, { name: child.fullName, relation }]\n })\n }\n }\n }\n }\n\n // 兄弟姐妹\n if (member.fatherId || member.motherId) {\n const siblings = this.getSiblings(id)\n for (const siblingId of siblings) {\n if (!visited.has(siblingId)) {\n const sibling = this.members.get(siblingId)\n if (sibling) {\n const siblingPath = this.getSiblingRelationName(member, sibling)\n queue.push({\n id: siblingId,\n path: [...path, { name: sibling.fullName, relation: siblingPath }]\n })\n }\n }\n }\n }\n }\n\n return null\n }\n\n /**\n * 获取兄弟姐妹关系名称\n */\n private getSiblingRelationName(from: FamilyMember, to: FamilyMember): string {\n const fromAge = this.getAge(from)\n const toAge = this.getAge(to)\n\n if (to.gender === 'MALE') {\n return toAge > fromAge ? '哥哥' : '弟弟'\n } else {\n return toAge > fromAge ? '姐姐' : '妹妹'\n }\n }\n\n /**\n * 计算路径长度(关系代数)\n */\n private calculatePathLength(path: string): number {\n let length = 0\n let i = 0\n \n while (i < path.length) {\n // 两字符的关系\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (['ob', 'lb', 'os', 'ls'].includes(twoChar)) {\n length++\n i += 2\n continue\n }\n }\n \n // 单字符的关系\n length++\n i++\n }\n \n return length\n }\n\n /**\n * 将符号路径转换为中文文本\n * 例如:'fm' -> '父亲的母亲'\n */\n private pathToChineseText(path: string): string {\n const pathMap: Record = {\n 'f': '父亲',\n 'm': '母亲',\n 'h': '丈夫',\n 'w': '妻子',\n 's': '儿子',\n 'd': '女儿',\n 'ob': '哥哥',\n 'lb': '弟弟',\n 'os': '姐姐',\n 'ls': '妹妹'\n }\n\n const parts: string[] = []\n let i = 0\n \n while (i < path.length) {\n // 处理两字符的关系(如 ob, lb, os, ls)\n if (i + 1 < path.length) {\n const twoChar = path.substring(i, i + 2)\n if (pathMap[twoChar]) {\n parts.push(pathMap[twoChar])\n i += 2\n continue\n }\n }\n \n // 处理单字符的关系\n const oneChar = path[i]\n if (pathMap[oneChar]) {\n parts.push(pathMap[oneChar])\n }\n i++\n }\n\n return parts.join('的')\n }\n\n /**\n * 将路径转换为中文描述(带\"的\"字)\n */\n private getPathDescription(path: string): string {\n const pathMap: Record = {\n 'f': '的父亲',\n 'm': '的母亲',\n 'h': '的丈夫',\n 'w': '的妻子',\n 's': '的儿子',\n 'd': '的女儿',\n 'ob': '的哥哥',\n 'lb': '的弟弟',\n 'os': '的姐姐',\n 'ls': '的妹妹'\n }\n\n let description = ''\n for (const char of path) {\n description += pathMap[char] || ''\n }\n\n return description || '本人'\n }\n}\n\nexport interface RelationshipResult {\n term: string // 关系称谓(如:父亲、堂兄弟)\n path: string // 关系路径(如:f, fbs)\n success: boolean // 是否成功计算\n error?: string // 错误信息\n}\n\nexport interface RelationshipDetail extends RelationshipResult {\n description: string // 关系描述(如:父亲的哥哥的儿子)\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 2594, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/hooks/use-relationship.ts"],"sourcesContent":["import { useState } from 'react'\nimport { useFamily } from '@/context/family-context'\nimport { RelationshipCalculator, type RelationshipDetail } from '@/lib/relationship-calculator'\n\n/**\n * 使用家族关系计算的Hook\n */\nexport function useRelationship() {\n const { treeData } = useFamily()\n const [loading, setLoading] = useState(false)\n\n /**\n * 计算两个成员之间的关系(客户端计算)\n */\n const calculateRelationship = (fromId: string, toId: string): RelationshipDetail => {\n const members = Object.values(treeData.members)\n const calculator = new RelationshipCalculator(members)\n return calculator.getRelationshipDetail(fromId, toId)\n }\n\n /**\n * 通过API计算关系(服务端计算)\n */\n const calculateRelationshipAPI = async (\n treeId: string,\n fromId: string,\n toId: string\n ): Promise => {\n setLoading(true)\n try {\n const response = await fetch(\n `/api/trees/${treeId}/relationship?from=${fromId}&to=${toId}`\n )\n \n if (!response.ok) {\n throw new Error('计算关系失败')\n }\n\n const data = await response.json()\n return {\n term: data.relationship,\n path: data.path,\n description: data.description,\n success: data.success\n }\n } catch (error) {\n console.error('计算关系失败:', error)\n return null\n } finally {\n setLoading(false)\n }\n }\n\n /**\n * 获取成员的所有直系亲属\n */\n const getDirectRelatives = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return null\n\n const relatives = {\n father: member.fatherId ? treeData.members[member.fatherId] : null,\n mother: member.motherId ? treeData.members[member.motherId] : null,\n spouses: member.spouseIds?.map(id => treeData.members[id]).filter(Boolean) || [],\n children: member.childrenIds?.map(id => treeData.members[id]).filter(Boolean) || []\n }\n\n return relatives\n }\n\n /**\n * 获取成员的所有兄弟姐妹\n */\n const getSiblings = (memberId: string) => {\n const member = treeData.members[memberId]\n if (!member) return []\n\n const siblings = new Set()\n\n // 通过父亲查找\n if (member.fatherId) {\n const father = treeData.members[member.fatherId]\n if (father?.childrenIds) {\n father.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n // 通过母亲查找\n if (member.motherId) {\n const mother = treeData.members[member.motherId]\n if (mother?.childrenIds) {\n mother.childrenIds.forEach(id => {\n if (id !== memberId) siblings.add(id)\n })\n }\n }\n\n return Array.from(siblings).map(id => treeData.members[id]).filter(Boolean)\n }\n\n /**\n * 获取成员的所有祖先\n */\n const getAncestors = (memberId: string, maxGenerations: number = 10) => {\n const ancestors: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n ancestors.push({ ...member, generationDiff: generation })\n }\n\n if (member.fatherId) {\n queue.push({ id: member.fatherId, generation: generation + 1 })\n }\n if (member.motherId) {\n queue.push({ id: member.motherId, generation: generation + 1 })\n }\n }\n\n return ancestors\n }\n\n /**\n * 获取成员的所有后代\n */\n const getDescendants = (memberId: string, maxGenerations: number = 10) => {\n const descendants: any[] = []\n const visited = new Set()\n const queue = [{ id: memberId, generation: 0 }]\n\n while (queue.length > 0) {\n const { id, generation } = queue.shift()!\n\n if (generation >= maxGenerations || visited.has(id)) continue\n visited.add(id)\n\n const member = treeData.members[id]\n if (!member) continue\n\n if (generation > 0) {\n descendants.push({ ...member, generationDiff: generation })\n }\n\n if (member.childrenIds) {\n member.childrenIds.forEach(childId => {\n queue.push({ id: childId, generation: generation + 1 })\n })\n }\n }\n\n return descendants\n }\n\n return {\n calculateRelationship,\n calculateRelationshipAPI,\n getDirectRelatives,\n getSiblings,\n getAncestors,\n getDescendants,\n loading\n }\n}\n"],"names":[],"mappings":"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"}}, + {"offset": {"line": 2762, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/tree/page.tsx"],"sourcesContent":["\"use client\"\n\nimport type React from \"react\"\n\nimport { SiteHeader } from \"@/components/site-header\"\nimport { TreeLayout } from \"@/components/tree/tree-layout\"\nimport { D3OrgChartFlow, type D3OrgChartRef } from \"@/components/tree/d3-org-chart-flow\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRelationship } from \"@/hooks/use-relationship\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"@/components/ui/dialog\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { ZoomIn, ZoomOut, Move, Download, LayoutGrid, ChevronDown, Users } from \"lucide-react\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\n\ntype ViewMode = \"traditional\" | \"d3-org-chart\"\n\nexport default function TreePage() {\n const { treeData } = useFamily()\n const { calculateRelationship } = useRelationship()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [viewMode, setViewMode] = useState(\"traditional\")\n \n // 关系查询模式\n const [relationMode, setRelationMode] = useState(false)\n const [selectedMembers, setSelectedMembers] = useState([])\n const [relationResult, setRelationResult] = useState(null)\n const [showRelationDialog, setShowRelationDialog] = useState(false)\n \n // 从 URL 参数读取视图模式\n useEffect(() => {\n const view = searchParams.get('view')\n if (view === 'd3-org-chart' || view === 'traditional') {\n setViewMode(view)\n }\n }, [searchParams])\n const [scale, setScale] = useState(1)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [isDragging, setIsDragging] = useState(false)\n const [startPos, setStartPos] = useState({ x: 0, y: 0 })\n const [dragStartPos, setDragStartPos] = useState({ x: 0, y: 0 })\n const containerRef = useRef(null)\n const d3ChartRef = useRef(null)\n\n const handleMouseDown = (e: React.MouseEvent) => {\n // 如果点击的是节点卡片,不启动拖拽\n const target = e.target as HTMLElement\n if (target.closest('.family-node-card')) {\n return\n }\n \n setIsDragging(true)\n setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y })\n setDragStartPos({ x: e.clientX, y: e.clientY })\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging) return\n \n // 只有移动超过5px才算拖拽,避免误触\n const deltaX = Math.abs(e.clientX - dragStartPos.x)\n const deltaY = Math.abs(e.clientY - dragStartPos.y)\n if (deltaX < 5 && deltaY < 5) return\n \n setPosition({\n x: e.clientX - startPos.x,\n y: e.clientY - startPos.y,\n })\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n }\n\n // 处理成员选择(关系查询模式)\n const handleMemberClick = (memberId: string) => {\n if (!relationMode) return\n \n if (selectedMembers.length === 0) {\n // 选择第一个成员\n setSelectedMembers([memberId])\n } else if (selectedMembers.length === 1) {\n // 选择第二个成员,计算关系\n const [firstId] = selectedMembers\n if (firstId === memberId) {\n // 点击同一个人,取消选择\n setSelectedMembers([])\n return\n }\n \n const result = calculateRelationship(firstId, memberId)\n const firstMember = treeData.members[firstId]\n const secondMember = treeData.members[memberId]\n \n setRelationResult({\n from: firstMember,\n to: secondMember,\n relationship: result\n })\n setShowRelationDialog(true)\n setSelectedMembers([])\n setRelationMode(false)\n }\n }\n \n // 切换关系查询模式\n const toggleRelationMode = () => {\n setRelationMode(!relationMode)\n setSelectedMembers([])\n setRelationResult(null)\n }\n\n const handleExportImage = async () => {\n if (!containerRef.current) return\n\n try {\n // 临时重置位置和缩放以获取完整视图\n const originalPosition = { ...position }\n const originalScale = scale\n setPosition({ x: 0, y: 0 })\n setScale(1)\n\n // 等待 DOM 更新\n await new Promise(resolve => setTimeout(resolve, 800))\n\n // 找到实际的族谱容器(包含 TreeLayout 的 div)\n const treeContainer = containerRef.current.querySelector('div[style*=\"transform\"]') as HTMLElement\n if (!treeContainer) {\n throw new Error('找不到族谱容器')\n }\n\n // 查找所有连接线(使用更宽泛的选择器)\n const allDivs = treeContainer.querySelectorAll('div')\n const lineElements: HTMLElement[] = []\n \n allDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n // 查找包含 bg-foreground 的元素(连接线)\n if (classes.includes('bg-foreground')) {\n lineElements.push(el)\n }\n })\n \n // 克隆容器用于导出\n const clonedContainer = treeContainer.cloneNode(true) as HTMLElement\n \n // 在克隆的容器中找到对应的连接线并设置样式\n const clonedDivs = clonedContainer.querySelectorAll('div')\n let lineIndex = 0\n clonedDivs.forEach(div => {\n const el = div as HTMLElement\n const classes = String(el.className || '')\n if (classes.includes('bg-foreground') && lineElements[lineIndex]) {\n const original = lineElements[lineIndex]\n const computed = window.getComputedStyle(original)\n \n // 直接设置内联样式\n el.style.backgroundColor = computed.backgroundColor\n el.style.width = computed.width\n el.style.height = computed.height\n el.style.position = 'absolute'\n el.style.left = computed.left\n el.style.top = computed.top\n \n lineIndex++\n }\n })\n \n // 移除卡片边框\n clonedContainer.querySelectorAll('*').forEach((child) => {\n const el = child as HTMLElement\n const classes = String(el.className || '')\n \n // 跳过连接线和连接线容器\n if (classes.includes('bg-foreground') || classes.includes('pointer-events-none')) {\n return\n }\n \n // 移除其他元素的边框\n el.style.border = 'none'\n el.style.outline = 'none'\n })\n \n // 临时添加到 DOM\n clonedContainer.style.position = 'fixed'\n clonedContainer.style.left = '-9999px'\n clonedContainer.style.top = '0'\n document.body.appendChild(clonedContainer)\n \n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200))\n\n // 动态导入 dom-to-image-more(仅在客户端)\n const domtoimage = await import('dom-to-image-more')\n \n // 使用 toBlob 方法\n const blob = await domtoimage.default.toBlob(clonedContainer, {\n quality: 0.95,\n bgcolor: '#ffffff'\n })\n \n // 清理克隆的容器\n document.body.removeChild(clonedContainer)\n\n // 恢复原始位置和缩放\n setPosition(originalPosition)\n setScale(originalScale)\n\n // 创建下载链接\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.download = `family-tree-${new Date().toISOString().split('T')[0]}.png`\n link.href = url\n link.click()\n \n // 清理\n setTimeout(() => URL.revokeObjectURL(url), 100)\n } catch (error) {\n console.error('导出图片失败:', error)\n }\n }\n\n // Handle root not found\n if (!treeData.rootId) {\n return (\n
\n \n
暂无家族树数据
\n
\n )\n }\n\n return (\n
\n \n\n {/* 视图切换和关系查询按钮 */}\n
\n {/* 关系查询按钮 */}\n \n \n \n \n \n \n \n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'traditional')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'traditional' ? 'bg-accent' : ''}\n >\n
\n 传统家谱视图\n {viewMode === 'traditional' && }\n
\n
\n {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', 'd3-org-chart')\n router.push(`/tree?${params.toString()}`)\n }}\n className={viewMode === 'd3-org-chart' ? 'bg-accent' : ''}\n >\n
\n D3 家谱图\n {viewMode === 'd3-org-chart' && }\n
\n
\n
\n
\n
\n\n {viewMode === 'traditional' ? (\n
\n {/* Toolbar */}\n
\n \n \n \n
\n \n
\n\n {/* Tree Canvas */}\n \n \n \n
\n
\n
\n ) : (\n
\n {/* 统一的控制按钮 */}\n
\n \n \n \n
\n \n
\n \n
\n router.push(`/members/${id}`)}\n />\n
\n
\n )}\n
\n )\n}\n"],"names":[],"mappings":";;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AApBA;;;;;;;;;;;;AAwBe,SAAS;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,iMAAS;IAC9B,MAAM,EAAE,qBAAqB,EAAE,GAAG,IAAA,sMAAe;IACjD,MAAM,SAAS,IAAA,qUAAS;IACxB,MAAM,eAAe,IAAA,2UAAe;IACpC,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAW;IAEnD,SAAS;IACT,MAAM,CAAC,cAAc,gBAAgB,GAAG,IAAA,uYAAQ,EAAC;IACjD,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,IAAA,uYAAQ,EAAW,EAAE;IACnE,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,IAAA,uYAAQ,EAAM;IAC1D,MAAM,CAAC,oBAAoB,sBAAsB,GAAG,IAAA,uYAAQ,EAAC;IAE7D,iBAAiB;IACjB,IAAA,wYAAS,EAAC;QACR,MAAM,OAAO,aAAa,GAAG,CAAC;QAC9B,IAAI,SAAS,kBAAkB,SAAS,eAAe;YACrD,YAAY;QACd;IACF,GAAG;QAAC;KAAa;IACjB,MAAM,CAAC,OAAO,SAAS,GAAG,IAAA,uYAAQ,EAAC;IACnC,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IACtD,MAAM,CAAC,YAAY,cAAc,GAAG,IAAA,uYAAQ,EAAC;IAC7C,MAAM,CAAC,UAAU,YAAY,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IACtD,MAAM,CAAC,cAAc,gBAAgB,GAAG,IAAA,uYAAQ,EAAC;QAAE,GAAG;QAAG,GAAG;IAAE;IAC9D,MAAM,eAAe,IAAA,qYAAM,EAAiB;IAC5C,MAAM,aAAa,IAAA,qYAAM,EAAgB;IAEzC,MAAM,kBAAkB,CAAC;QACvB,mBAAmB;QACnB,MAAM,SAAS,EAAE,MAAM;QACvB,IAAI,OAAO,OAAO,CAAC,sBAAsB;YACvC;QACF;QAEA,cAAc;QACd,YAAY;YAAE,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;YAAE,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC;QACnE,gBAAgB;YAAE,GAAG,EAAE,OAAO;YAAE,GAAG,EAAE,OAAO;QAAC;IAC/C;IAEA,MAAM,kBAAkB,CAAC;QACvB,IAAI,CAAC,YAAY;QAEjB,qBAAqB;QACrB,MAAM,SAAS,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;QAClD,MAAM,SAAS,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;QAClD,IAAI,SAAS,KAAK,SAAS,GAAG;QAE9B,YAAY;YACV,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;YACzB,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;QAC3B;IACF;IAEA,MAAM,gBAAgB;QACpB,cAAc;IAChB;IAEA,iBAAiB;IACjB,MAAM,oBAAoB,CAAC;QACzB,IAAI,CAAC,cAAc;QAEnB,IAAI,gBAAgB,MAAM,KAAK,GAAG;YAChC,UAAU;YACV,mBAAmB;gBAAC;aAAS;QAC/B,OAAO,IAAI,gBAAgB,MAAM,KAAK,GAAG;YACvC,eAAe;YACf,MAAM,CAAC,QAAQ,GAAG;YAClB,IAAI,YAAY,UAAU;gBACxB,cAAc;gBACd,mBAAmB,EAAE;gBACrB;YACF;YAEA,MAAM,SAAS,sBAAsB,SAAS;YAC9C,MAAM,cAAc,SAAS,OAAO,CAAC,QAAQ;YAC7C,MAAM,eAAe,SAAS,OAAO,CAAC,SAAS;YAE/C,kBAAkB;gBAChB,MAAM;gBACN,IAAI;gBACJ,cAAc;YAChB;YACA,sBAAsB;YACtB,mBAAmB,EAAE;YACrB,gBAAgB;QAClB;IACF;IAEA,WAAW;IACX,MAAM,qBAAqB;QACzB,gBAAgB,CAAC;QACjB,mBAAmB,EAAE;QACrB,kBAAkB;IACpB;IAEA,MAAM,oBAAoB;QACxB,IAAI,CAAC,aAAa,OAAO,EAAE;QAE3B,IAAI;YACF,mBAAmB;YACnB,MAAM,mBAAmB;gBAAE,GAAG,QAAQ;YAAC;YACvC,MAAM,gBAAgB;YACtB,YAAY;gBAAE,GAAG;gBAAG,GAAG;YAAE;YACzB,SAAS;YAET,YAAY;YACZ,MAAM,IAAI,QAAQ,CAAA,UAAW,WAAW,SAAS;YAEjD,iCAAiC;YACjC,MAAM,gBAAgB,aAAa,OAAO,CAAC,aAAa,CAAC;YACzD,IAAI,CAAC,eAAe;gBAClB,MAAM,IAAI,MAAM;YAClB;YAEA,qBAAqB;YACrB,MAAM,UAAU,cAAc,gBAAgB,CAAC;YAC/C,MAAM,eAA8B,EAAE;YAEtC,QAAQ,OAAO,CAAC,CAAA;gBACd,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBACvC,8BAA8B;gBAC9B,IAAI,QAAQ,QAAQ,CAAC,kBAAkB;oBACrC,aAAa,IAAI,CAAC;gBACpB;YACF;YAEA,WAAW;YACX,MAAM,kBAAkB,cAAc,SAAS,CAAC;YAEhD,uBAAuB;YACvB,MAAM,aAAa,gBAAgB,gBAAgB,CAAC;YACpD,IAAI,YAAY;YAChB,WAAW,OAAO,CAAC,CAAA;gBACjB,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBACvC,IAAI,QAAQ,QAAQ,CAAC,oBAAoB,YAAY,CAAC,UAAU,EAAE;oBAChE,MAAM,WAAW,YAAY,CAAC,UAAU;oBACxC,MAAM,WAAW,OAAO,gBAAgB,CAAC;oBAEzC,WAAW;oBACX,GAAG,KAAK,CAAC,eAAe,GAAG,SAAS,eAAe;oBACnD,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,KAAK;oBAC/B,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,MAAM;oBACjC,GAAG,KAAK,CAAC,QAAQ,GAAG;oBACpB,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,IAAI;oBAC7B,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG;oBAE3B;gBACF;YACF;YAEA,SAAS;YACT,gBAAgB,gBAAgB,CAAC,KAAK,OAAO,CAAC,CAAC;gBAC7C,MAAM,KAAK;gBACX,MAAM,UAAU,OAAO,GAAG,SAAS,IAAI;gBAEvC,cAAc;gBACd,IAAI,QAAQ,QAAQ,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,wBAAwB;oBAChF;gBACF;gBAEA,YAAY;gBACZ,GAAG,KAAK,CAAC,MAAM,GAAG;gBAClB,GAAG,KAAK,CAAC,OAAO,GAAG;YACrB;YAEA,YAAY;YACZ,gBAAgB,KAAK,CAAC,QAAQ,GAAG;YACjC,gBAAgB,KAAK,CAAC,IAAI,GAAG;YAC7B,gBAAgB,KAAK,CAAC,GAAG,GAAG;YAC5B,SAAS,IAAI,CAAC,WAAW,CAAC;YAE1B,OAAO;YACP,MAAM,IAAI,QAAQ,CAAA,UAAW,WAAW,SAAS;YAEjD,gCAAgC;YAChC,MAAM,aAAa;YAEnB,eAAe;YACf,MAAM,OAAO,MAAM,WAAW,OAAO,CAAC,MAAM,CAAC,iBAAiB;gBAC5D,SAAS;gBACT,SAAS;YACX;YAEA,UAAU;YACV,SAAS,IAAI,CAAC,WAAW,CAAC;YAE1B,YAAY;YACZ,YAAY;YACZ,SAAS;YAET,SAAS;YACT,MAAM,MAAM,IAAI,eAAe,CAAC;YAChC,MAAM,OAAO,SAAS,aAAa,CAAC;YACpC,KAAK,QAAQ,GAAG,CAAC,YAAY,EAAE,IAAI,OAAO,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3E,KAAK,IAAI,GAAG;YACZ,KAAK,KAAK;YAEV,KAAK;YACL,WAAW,IAAM,IAAI,eAAe,CAAC,MAAM;QAC7C,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,WAAW;QAC3B;IACF;IAEA,wBAAwB;IACxB,IAAI,CAAC,SAAS,MAAM,EAAE;QACpB,qBACE,oaAAC;YAAI,WAAU;;8BACb,oaAAC,kMAAU;;;;;8BACX,oaAAC;oBAAI,WAAU;8BAAgE;;;;;;;;;;;;IAGrF;IAEA,qBACE,oaAAC;QAAI,WAAU;;0BACb,oaAAC,kMAAU;;;;;0BAGX,oaAAC;gBAAI,WAAU;;kCAEb,oaAAC,4LAAM;wBACL,SAAS,eAAe,YAAY;wBACpC,WAAU;wBACV,SAAS;;0CAET,oaAAC,wVAAK;gCAAC,WAAU;;;;;;4BAChB,eACC,gBAAgB,MAAM,KAAK,IAAI,YAAY,YACzC;;;;;;;kCAGN,oaAAC,4MAAY;;0CACX,oaAAC,mNAAmB;gCAAC,OAAO;0CAC1B,cAAA,oaAAC,4LAAM;oCAAC,SAAQ;oCAAU,WAAU;;sDAClC,oaAAC,2WAAU;4CAAC,WAAU;;;;;;wCACrB,aAAa,gBAAgB,SAAS;sDACvC,oaAAC,8WAAW;4CAAC,WAAU;;;;;;;;;;;;;;;;;0CAG3B,oaAAC,mNAAmB;gCAAC,OAAM;gCAAM,WAAU;;kDACzC,oaAAC,gNAAgB;wCACf,SAAS;4CACP,MAAM,SAAS,IAAI,gBAAgB,aAAa,QAAQ;4CACxD,OAAO,GAAG,CAAC,QAAQ;4CACnB,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI;wCAC1C;wCACA,WAAW,aAAa,gBAAgB,cAAc;kDAEtD,cAAA,oaAAC;4CAAI,WAAU;;8DACb,oaAAC;8DAAK;;;;;;gDACL,aAAa,+BAAiB,oaAAC;oDAAK,WAAU;8DAAe;;;;;;;;;;;;;;;;;kDAGlE,oaAAC,gNAAgB;wCACf,SAAS;4CACP,MAAM,SAAS,IAAI,gBAAgB,aAAa,QAAQ;4CACxD,OAAO,GAAG,CAAC,QAAQ;4CACnB,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,QAAQ,IAAI;wCAC1C;wCACA,WAAW,aAAa,iBAAiB,cAAc;kDAEvD,cAAA,oaAAC;4CAAI,WAAU;;8DACb,oaAAC;8DAAK;;;;;;gDACL,aAAa,gCAAkB,oaAAC;oDAAK,WAAU;8DAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAOxE,aAAa,8BACZ,oaAAC;gBAAI,WAAU;;kCAEb,oaAAC;wBAAI,WAAU;;0CACb,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,SAAS,CAAC,IAAM,KAAK,GAAG,CAAC,IAAI,KAAK;0CACrF,cAAA,oaAAC,+VAAM;oCAAC,WAAU;;;;;;;;;;;0CAEpB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,SAAS,CAAC,IAAM,KAAK,GAAG,CAAC,IAAI,KAAK;0CACrF,cAAA,oaAAC,kWAAO;oCAAC,WAAU;;;;;;;;;;;0CAErB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,YAAY;wCAAE,GAAG;wCAAG,GAAG;oCAAE;0CAC5E,cAAA,oaAAC,qVAAI;oCAAC,WAAU;;;;;;;;;;;0CAElB,oaAAC;gCAAI,WAAU;;;;;;0CACf,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS;gCAAmB,OAAM;0CACtE,cAAA,oaAAC,iWAAQ;oCAAC,WAAU;;;;;;;;;;;;;;;;;kCAKxB,oaAAC;wBACC,KAAK;wBACL,WAAU;wBACV,aAAa;wBACb,aAAa;wBACb,WAAW;wBACX,cAAc;kCAEd,cAAA,oaAAC;4BACC,OAAO;gCACL,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gCACxE,iBAAiB;gCACjB,YAAY,aAAa,SAAS;4BACpC;4BACA,WAAU;sCAEV,cAAA,oaAAC,0MAAU;gCAAC,QAAQ,SAAS,MAAM;;;;;;;;;;;;;;;;;;;;;qCAKzC,oaAAC;gBAAI,WAAU;;kCAEb,oaAAC;wBAAI,WAAU;;0CACb,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAa,OAAM;0CAC1F,cAAA,oaAAC,+VAAM;oCAAC,WAAU;;;;;;;;;;;0CAEpB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAe,OAAM;0CAC5F,cAAA,oaAAC,kWAAO;oCAAC,WAAU;;;;;;;;;;;0CAErB,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAW,OAAM;0CACxF,cAAA,oaAAC,qVAAI;oCAAC,WAAU;;;;;;;;;;;0CAElB,oaAAC;gCAAI,WAAU;;;;;;0CACf,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;gCAAO,SAAS,IAAM,WAAW,OAAO,EAAE;gCAAa,OAAM;0CAC1F,cAAA,oaAAC,iWAAQ;oCAAC,WAAU;;;;;;;;;;;;;;;;;kCAIxB,oaAAC;wBAAI,WAAU;kCACb,cAAA,oaAAC,0NAAc;4BACb,KAAK;4BACL,SAAS,SAAS,OAAO;4BACzB,QAAQ,SAAS,MAAM;4BACvB,eAAe,CAAC,KAAe,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI;;;;;;;;;;;;;;;;;;;;;;;AAOzE"}}] +} \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/a0629__pnpm_4871c6a1._.js b/.next/dev/server/chunks/ssr/a0629__pnpm_4871c6a1._.js new file mode 100644 index 00000000..e701db3e --- /dev/null +++ b/.next/dev/server/chunks/ssr/a0629__pnpm_4871c6a1._.js @@ -0,0 +1,22102 @@ +module.exports = [ +"[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/shared/lib/router/utils/querystring.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + assign: null, + searchParamsToUrlQuery: null, + urlQueryToSearchParams: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + assign: function() { + return assign; + }, + searchParamsToUrlQuery: function() { + return searchParamsToUrlQuery; + }, + urlQueryToSearchParams: function() { + return urlQueryToSearchParams; + } +}); +function searchParamsToUrlQuery(searchParams) { + const query = {}; + for (const [key, value] of searchParams.entries()){ + const existing = query[key]; + if (typeof existing === 'undefined') { + query[key] = value; + } else if (Array.isArray(existing)) { + existing.push(value); + } else { + query[key] = [ + existing, + value + ]; + } + } + return query; +} +function stringifyUrlQueryParam(param) { + if (typeof param === 'string') { + return param; + } + if (typeof param === 'number' && !isNaN(param) || typeof param === 'boolean') { + return String(param); + } else { + return ''; + } +} +function urlQueryToSearchParams(query) { + const searchParams = new URLSearchParams(); + for (const [key, value] of Object.entries(query)){ + if (Array.isArray(value)) { + for (const item of value){ + searchParams.append(key, stringifyUrlQueryParam(item)); + } + } else { + searchParams.set(key, stringifyUrlQueryParam(value)); + } + } + return searchParams; +} +function assign(target, ...searchParamsList) { + for (const searchParams of searchParamsList){ + for (const key of searchParams.keys()){ + target.delete(key); + } + for (const [key, value] of searchParams.entries()){ + target.append(key, value); + } + } + return target; +} //# sourceMappingURL=querystring.js.map +}), +"[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/shared/lib/router/utils/format-url.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +// Format function modified from nodejs +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + formatUrl: null, + formatWithValidation: null, + urlObjectKeys: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + formatUrl: function() { + return formatUrl; + }, + formatWithValidation: function() { + return formatWithValidation; + }, + urlObjectKeys: function() { + return urlObjectKeys; + } +}); +const _interop_require_wildcard = __turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs [app-ssr] (ecmascript)"); +const _querystring = /*#__PURE__*/ _interop_require_wildcard._(__turbopack_context__.r("[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/shared/lib/router/utils/querystring.js [app-ssr] (ecmascript)")); +const slashedProtocols = /https?|ftp|gopher|file/; +function formatUrl(urlObj) { + let { auth, hostname } = urlObj; + let protocol = urlObj.protocol || ''; + let pathname = urlObj.pathname || ''; + let hash = urlObj.hash || ''; + let query = urlObj.query || ''; + let host = false; + auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : ''; + if (urlObj.host) { + host = auth + urlObj.host; + } else if (hostname) { + host = auth + (~hostname.indexOf(':') ? `[${hostname}]` : hostname); + if (urlObj.port) { + host += ':' + urlObj.port; + } + } + if (query && typeof query === 'object') { + query = String(_querystring.urlQueryToSearchParams(query)); + } + let search = urlObj.search || query && `?${query}` || ''; + if (protocol && !protocol.endsWith(':')) protocol += ':'; + if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname[0] !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + if (hash && hash[0] !== '#') hash = '#' + hash; + if (search && search[0] !== '?') search = '?' + search; + pathname = pathname.replace(/[?#]/g, encodeURIComponent); + search = search.replace('#', '%23'); + return `${protocol}${host}${pathname}${search}${hash}`; +} +const urlObjectKeys = [ + 'auth', + 'hash', + 'host', + 'hostname', + 'href', + 'path', + 'pathname', + 'port', + 'protocol', + 'query', + 'search', + 'slashes' +]; +function formatWithValidation(url) { + if ("TURBOPACK compile-time truthy", 1) { + if (url !== null && typeof url === 'object') { + Object.keys(url).forEach((key)=>{ + if (!urlObjectKeys.includes(key)) { + console.warn(`Unknown key passed via urlObject into url.format: ${key}`); + } + }); + } + } + return formatUrl(url); +} //# sourceMappingURL=format-url.js.map +}), +"[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/client/use-merged-ref.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "useMergedRef", { + enumerable: true, + get: function() { + return useMergedRef; + } +}); +const _react = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +function useMergedRef(refA, refB) { + const cleanupA = (0, _react.useRef)(null); + const cleanupB = (0, _react.useRef)(null); + // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null. + // (this happens often if the user doesn't pass a ref to Link/Form/Image) + // But this can cause us to leak a cleanup-ref into user code (previously via ``), + // and the user might pass that ref into ref-merging library that doesn't support cleanup refs + // (because it hasn't been updated for React 19) + // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`. + // So in practice, it's safer to be defensive and always wrap the ref, even on React 19. + return (0, _react.useCallback)((current)=>{ + if (current === null) { + const cleanupFnA = cleanupA.current; + if (cleanupFnA) { + cleanupA.current = null; + cleanupFnA(); + } + const cleanupFnB = cleanupB.current; + if (cleanupFnB) { + cleanupB.current = null; + cleanupFnB(); + } + } else { + if (refA) { + cleanupA.current = applyRef(refA, current); + } + if (refB) { + cleanupB.current = applyRef(refB, current); + } + } + }, [ + refA, + refB + ]); +} +function applyRef(refA, current) { + if (typeof refA === 'function') { + const cleanup = refA(current); + if (typeof cleanup === 'function') { + return cleanup; + } else { + return ()=>refA(null); + } + } else { + refA.current = current; + return ()=>{ + refA.current = null; + }; + } +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=use-merged-ref.js.map +}), +"[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/shared/lib/utils.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + DecodeError: null, + MiddlewareNotFoundError: null, + MissingStaticPage: null, + NormalizeError: null, + PageNotFoundError: null, + SP: null, + ST: null, + WEB_VITALS: null, + execOnce: null, + getDisplayName: null, + getLocationOrigin: null, + getURL: null, + isAbsoluteUrl: null, + isResSent: null, + loadGetInitialProps: null, + normalizeRepeatedSlashes: null, + stringifyError: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + DecodeError: function() { + return DecodeError; + }, + MiddlewareNotFoundError: function() { + return MiddlewareNotFoundError; + }, + MissingStaticPage: function() { + return MissingStaticPage; + }, + NormalizeError: function() { + return NormalizeError; + }, + PageNotFoundError: function() { + return PageNotFoundError; + }, + SP: function() { + return SP; + }, + ST: function() { + return ST; + }, + WEB_VITALS: function() { + return WEB_VITALS; + }, + execOnce: function() { + return execOnce; + }, + getDisplayName: function() { + return getDisplayName; + }, + getLocationOrigin: function() { + return getLocationOrigin; + }, + getURL: function() { + return getURL; + }, + isAbsoluteUrl: function() { + return isAbsoluteUrl; + }, + isResSent: function() { + return isResSent; + }, + loadGetInitialProps: function() { + return loadGetInitialProps; + }, + normalizeRepeatedSlashes: function() { + return normalizeRepeatedSlashes; + }, + stringifyError: function() { + return stringifyError; + } +}); +const WEB_VITALS = [ + 'CLS', + 'FCP', + 'FID', + 'INP', + 'LCP', + 'TTFB' +]; +function execOnce(fn) { + let used = false; + let result; + return (...args)=>{ + if (!used) { + used = true; + result = fn(...args); + } + return result; + }; +} +// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 +// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 +const ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/; +const isAbsoluteUrl = (url)=>ABSOLUTE_URL_REGEX.test(url); +function getLocationOrigin() { + const { protocol, hostname, port } = window.location; + return `${protocol}//${hostname}${port ? ':' + port : ''}`; +} +function getURL() { + const { href } = window.location; + const origin = getLocationOrigin(); + return href.substring(origin.length); +} +function getDisplayName(Component) { + return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown'; +} +function isResSent(res) { + return res.finished || res.headersSent; +} +function normalizeRepeatedSlashes(url) { + const urlParts = url.split('?'); + const urlNoQuery = urlParts[0]; + return urlNoQuery // first we replace any non-encoded backslashes with forward + // then normalize repeated forward slashes + .replace(/\\/g, '/').replace(/\/\/+/g, '/') + (urlParts[1] ? `?${urlParts.slice(1).join('?')}` : ''); +} +async function loadGetInitialProps(App, ctx) { + if ("TURBOPACK compile-time truthy", 1) { + if (App.prototype?.getInitialProps) { + const message = `"${getDisplayName(App)}.getInitialProps()" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E394", + enumerable: false, + configurable: true + }); + } + } + // when called from _app `ctx` is nested in `ctx` + const res = ctx.res || ctx.ctx && ctx.ctx.res; + if (!App.getInitialProps) { + if (ctx.ctx && ctx.Component) { + // @ts-ignore pageProps default + return { + pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx) + }; + } + return {}; + } + const props = await App.getInitialProps(ctx); + if (res && isResSent(res)) { + return props; + } + if (!props) { + const message = `"${getDisplayName(App)}.getInitialProps()" should resolve to an object. But found "${props}" instead.`; + throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", { + value: "E394", + enumerable: false, + configurable: true + }); + } + if ("TURBOPACK compile-time truthy", 1) { + if (Object.keys(props).length === 0 && !ctx.ctx) { + console.warn(`${getDisplayName(App)} returned an empty object from \`getInitialProps\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`); + } + } + return props; +} +const SP = typeof performance !== 'undefined'; +const ST = SP && [ + 'mark', + 'measure', + 'getEntriesByName' +].every((method)=>typeof performance[method] === 'function'); +class DecodeError extends Error { +} +class NormalizeError extends Error { +} +class PageNotFoundError extends Error { + constructor(page){ + super(); + this.code = 'ENOENT'; + this.name = 'PageNotFoundError'; + this.message = `Cannot find module for page: ${page}`; + } +} +class MissingStaticPage extends Error { + constructor(page, message){ + super(); + this.message = `Failed to load static file for page: ${page} ${message}`; + } +} +class MiddlewareNotFoundError extends Error { + constructor(){ + super(); + this.code = 'ENOENT'; + this.message = `Cannot find the middleware module`; + } +} +function stringifyError(error) { + return JSON.stringify({ + message: error.message, + stack: error.stack + }); +} //# sourceMappingURL=utils.js.map +}), +"[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/shared/lib/router/utils/parse-path.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * Given a path this function will find the pathname, query and hash and return + * them. This is useful to parse full paths on the client side. + * @param path A path to parse e.g. /foo/bar?id=1#hash + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "parsePath", { + enumerable: true, + get: function() { + return parsePath; + } +}); +function parsePath(path) { + const hashIndex = path.indexOf('#'); + const queryIndex = path.indexOf('?'); + const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex); + if (hasQuery || hashIndex > -1) { + return { + pathname: path.substring(0, hasQuery ? queryIndex : hashIndex), + query: hasQuery ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined) : '', + hash: hashIndex > -1 ? path.slice(hashIndex) : '' + }; + } + return { + pathname: path, + query: '', + hash: '' + }; +} //# sourceMappingURL=parse-path.js.map +}), +"[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/shared/lib/router/utils/add-path-prefix.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "addPathPrefix", { + enumerable: true, + get: function() { + return addPathPrefix; + } +}); +const _parsepath = __turbopack_context__.r("[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/shared/lib/router/utils/parse-path.js [app-ssr] (ecmascript)"); +function addPathPrefix(path, prefix) { + if (!path.startsWith('/') || !prefix) { + return path; + } + const { pathname, query, hash } = (0, _parsepath.parsePath)(path); + return `${prefix}${pathname}${query}${hash}`; +} //# sourceMappingURL=add-path-prefix.js.map +}), +"[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/shared/lib/router/utils/remove-trailing-slash.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * Removes the trailing slash for a given route or page path. Preserves the + * root page. Examples: + * - `/foo/bar/` -> `/foo/bar` + * - `/foo/bar` -> `/foo/bar` + * - `/` -> `/` + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "removeTrailingSlash", { + enumerable: true, + get: function() { + return removeTrailingSlash; + } +}); +function removeTrailingSlash(route) { + return route.replace(/\/$/, '') || '/'; +} //# sourceMappingURL=remove-trailing-slash.js.map +}), +"[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/client/normalize-trailing-slash.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "normalizePathTrailingSlash", { + enumerable: true, + get: function() { + return normalizePathTrailingSlash; + } +}); +const _removetrailingslash = __turbopack_context__.r("[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/shared/lib/router/utils/remove-trailing-slash.js [app-ssr] (ecmascript)"); +const _parsepath = __turbopack_context__.r("[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/shared/lib/router/utils/parse-path.js [app-ssr] (ecmascript)"); +const normalizePathTrailingSlash = (path)=>{ + if (!path.startsWith('/') || ("TURBOPACK compile-time value", void 0)) { + return path; + } + const { pathname, query, hash } = (0, _parsepath.parsePath)(path); + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + return `${(0, _removetrailingslash.removeTrailingSlash)(pathname)}${query}${hash}`; +}; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=normalize-trailing-slash.js.map +}), +"[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/client/add-base-path.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "addBasePath", { + enumerable: true, + get: function() { + return addBasePath; + } +}); +const _addpathprefix = __turbopack_context__.r("[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/shared/lib/router/utils/add-path-prefix.js [app-ssr] (ecmascript)"); +const _normalizetrailingslash = __turbopack_context__.r("[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/client/normalize-trailing-slash.js [app-ssr] (ecmascript)"); +const basePath = ("TURBOPACK compile-time value", "") || ''; +function addBasePath(path, required) { + return (0, _normalizetrailingslash.normalizePathTrailingSlash)(("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : (0, _addpathprefix.addPathPrefix)(path, basePath)); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=add-base-path.js.map +}), +"[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/shared/lib/utils/warn-once.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "warnOnce", { + enumerable: true, + get: function() { + return warnOnce; + } +}); +let warnOnce = (_)=>{}; +if ("TURBOPACK compile-time truthy", 1) { + const warnings = new Set(); + warnOnce = (msg)=>{ + if (!warnings.has(msg)) { + console.warn(msg); + } + warnings.add(msg); + }; +} //# sourceMappingURL=warn-once.js.map +}), +"[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * Shared types and constants for the Segment Cache. + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + FetchStrategy: null, + NavigationResultTag: null, + PrefetchPriority: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + FetchStrategy: function() { + return FetchStrategy; + }, + NavigationResultTag: function() { + return NavigationResultTag; + }, + PrefetchPriority: function() { + return PrefetchPriority; + } +}); +var NavigationResultTag = /*#__PURE__*/ function(NavigationResultTag) { + NavigationResultTag[NavigationResultTag["MPA"] = 0] = "MPA"; + NavigationResultTag[NavigationResultTag["Success"] = 1] = "Success"; + NavigationResultTag[NavigationResultTag["NoOp"] = 2] = "NoOp"; + NavigationResultTag[NavigationResultTag["Async"] = 3] = "Async"; + return NavigationResultTag; +}({}); +var PrefetchPriority = /*#__PURE__*/ function(PrefetchPriority) { + /** + * Assigned to the most recently hovered/touched link. Special network + * bandwidth is reserved for this task only. There's only ever one Intent- + * priority task at a time; when a new Intent task is scheduled, the previous + * one is bumped down to Default. + */ PrefetchPriority[PrefetchPriority["Intent"] = 2] = "Intent"; + /** + * The default priority for prefetch tasks. + */ PrefetchPriority[PrefetchPriority["Default"] = 1] = "Default"; + /** + * Assigned to tasks when they spawn non-blocking background work, like + * revalidating a partially cached entry to see if more data is available. + */ PrefetchPriority[PrefetchPriority["Background"] = 0] = "Background"; + return PrefetchPriority; +}({}); +var FetchStrategy = /*#__PURE__*/ function(FetchStrategy) { + // Deliberately ordered so we can easily compare two segments + // and determine if one segment is "more specific" than another + // (i.e. if it's likely that it contains more data) + FetchStrategy[FetchStrategy["LoadingBoundary"] = 0] = "LoadingBoundary"; + FetchStrategy[FetchStrategy["PPR"] = 1] = "PPR"; + FetchStrategy[FetchStrategy["PPRRuntime"] = 2] = "PPRRuntime"; + FetchStrategy[FetchStrategy["Full"] = 3] = "Full"; + return FetchStrategy; +}({}); +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=types.js.map +}), +"[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/client/components/segment-cache/cache-key.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +// TypeScript trick to simulate opaque types, like in Flow. +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "createCacheKey", { + enumerable: true, + get: function() { + return createCacheKey; + } +}); +function createCacheKey(originalHref, nextUrl) { + const originalUrl = new URL(originalHref); + const cacheKey = { + pathname: originalUrl.pathname, + search: originalUrl.search, + nextUrl: nextUrl + }; + return cacheKey; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=cache-key.js.map +}), +"[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/shared/lib/app-router-types.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * App Router types - Client-safe types for the Next.js App Router + * + * This file contains type definitions that can be safely imported + * by both client-side and server-side code without circular dependencies. + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "HasLoadingBoundary", { + enumerable: true, + get: function() { + return HasLoadingBoundary; + } +}); +var HasLoadingBoundary = /*#__PURE__*/ function(HasLoadingBoundary) { + // There is a loading boundary in this particular segment + HasLoadingBoundary[HasLoadingBoundary["SegmentHasLoadingBoundary"] = 1] = "SegmentHasLoadingBoundary"; + // There is a loading boundary somewhere in the subtree (but not in + // this segment) + HasLoadingBoundary[HasLoadingBoundary["SubtreeHasLoadingBoundary"] = 2] = "SubtreeHasLoadingBoundary"; + // There is no loading boundary in this segment or any of its descendants + HasLoadingBoundary[HasLoadingBoundary["SubtreeHasNoLoadingBoundary"] = 3] = "SubtreeHasNoLoadingBoundary"; + return HasLoadingBoundary; +}({}); //# sourceMappingURL=app-router-types.js.map +}), +"[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/client/components/match-segments.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "matchSegment", { + enumerable: true, + get: function() { + return matchSegment; + } +}); +const matchSegment = (existingSegment, segment)=>{ + // segment is either Array or string + if (typeof existingSegment === 'string') { + if (typeof segment === 'string') { + // Common case: segment is just a string + return existingSegment === segment; + } + return false; + } + if (typeof segment === 'string') { + return false; + } + return existingSegment[0] === segment[0] && existingSegment[1] === segment[1]; +}; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=match-segments.js.map +}), +"[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/client/components/app-router-headers.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + ACTION_HEADER: null, + FLIGHT_HEADERS: null, + NEXT_ACTION_NOT_FOUND_HEADER: null, + NEXT_DID_POSTPONE_HEADER: null, + NEXT_HMR_REFRESH_HASH_COOKIE: null, + NEXT_HMR_REFRESH_HEADER: null, + NEXT_HTML_REQUEST_ID_HEADER: null, + NEXT_IS_PRERENDER_HEADER: null, + NEXT_REQUEST_ID_HEADER: null, + NEXT_REWRITTEN_PATH_HEADER: null, + NEXT_REWRITTEN_QUERY_HEADER: null, + NEXT_ROUTER_PREFETCH_HEADER: null, + NEXT_ROUTER_SEGMENT_PREFETCH_HEADER: null, + NEXT_ROUTER_STALE_TIME_HEADER: null, + NEXT_ROUTER_STATE_TREE_HEADER: null, + NEXT_RSC_UNION_QUERY: null, + NEXT_URL: null, + RSC_CONTENT_TYPE_HEADER: null, + RSC_HEADER: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + ACTION_HEADER: function() { + return ACTION_HEADER; + }, + FLIGHT_HEADERS: function() { + return FLIGHT_HEADERS; + }, + NEXT_ACTION_NOT_FOUND_HEADER: function() { + return NEXT_ACTION_NOT_FOUND_HEADER; + }, + NEXT_DID_POSTPONE_HEADER: function() { + return NEXT_DID_POSTPONE_HEADER; + }, + NEXT_HMR_REFRESH_HASH_COOKIE: function() { + return NEXT_HMR_REFRESH_HASH_COOKIE; + }, + NEXT_HMR_REFRESH_HEADER: function() { + return NEXT_HMR_REFRESH_HEADER; + }, + NEXT_HTML_REQUEST_ID_HEADER: function() { + return NEXT_HTML_REQUEST_ID_HEADER; + }, + NEXT_IS_PRERENDER_HEADER: function() { + return NEXT_IS_PRERENDER_HEADER; + }, + NEXT_REQUEST_ID_HEADER: function() { + return NEXT_REQUEST_ID_HEADER; + }, + NEXT_REWRITTEN_PATH_HEADER: function() { + return NEXT_REWRITTEN_PATH_HEADER; + }, + NEXT_REWRITTEN_QUERY_HEADER: function() { + return NEXT_REWRITTEN_QUERY_HEADER; + }, + NEXT_ROUTER_PREFETCH_HEADER: function() { + return NEXT_ROUTER_PREFETCH_HEADER; + }, + NEXT_ROUTER_SEGMENT_PREFETCH_HEADER: function() { + return NEXT_ROUTER_SEGMENT_PREFETCH_HEADER; + }, + NEXT_ROUTER_STALE_TIME_HEADER: function() { + return NEXT_ROUTER_STALE_TIME_HEADER; + }, + NEXT_ROUTER_STATE_TREE_HEADER: function() { + return NEXT_ROUTER_STATE_TREE_HEADER; + }, + NEXT_RSC_UNION_QUERY: function() { + return NEXT_RSC_UNION_QUERY; + }, + NEXT_URL: function() { + return NEXT_URL; + }, + RSC_CONTENT_TYPE_HEADER: function() { + return RSC_CONTENT_TYPE_HEADER; + }, + RSC_HEADER: function() { + return RSC_HEADER; + } +}); +const RSC_HEADER = 'rsc'; +const ACTION_HEADER = 'next-action'; +const NEXT_ROUTER_STATE_TREE_HEADER = 'next-router-state-tree'; +const NEXT_ROUTER_PREFETCH_HEADER = 'next-router-prefetch'; +const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = 'next-router-segment-prefetch'; +const NEXT_HMR_REFRESH_HEADER = 'next-hmr-refresh'; +const NEXT_HMR_REFRESH_HASH_COOKIE = '__next_hmr_refresh_hash__'; +const NEXT_URL = 'next-url'; +const RSC_CONTENT_TYPE_HEADER = 'text/x-component'; +const FLIGHT_HEADERS = [ + RSC_HEADER, + NEXT_ROUTER_STATE_TREE_HEADER, + NEXT_ROUTER_PREFETCH_HEADER, + NEXT_HMR_REFRESH_HEADER, + NEXT_ROUTER_SEGMENT_PREFETCH_HEADER +]; +const NEXT_RSC_UNION_QUERY = '_rsc'; +const NEXT_ROUTER_STALE_TIME_HEADER = 'x-nextjs-stale-time'; +const NEXT_DID_POSTPONE_HEADER = 'x-nextjs-postponed'; +const NEXT_REWRITTEN_PATH_HEADER = 'x-nextjs-rewritten-path'; +const NEXT_REWRITTEN_QUERY_HEADER = 'x-nextjs-rewritten-query'; +const NEXT_IS_PRERENDER_HEADER = 'x-nextjs-prerender'; +const NEXT_ACTION_NOT_FOUND_HEADER = 'x-nextjs-action-not-found'; +const NEXT_REQUEST_ID_HEADER = 'x-nextjs-request-id'; +const NEXT_HTML_REQUEST_ID_HEADER = 'x-nextjs-html-request-id'; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=app-router-headers.js.map +}), +"[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/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +module.exports = __turbopack_context__.r("[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/server/route-modules/app-page/module.compiled.js [app-ssr] (ecmascript)").vendored['react-ssr'].ReactServerDOMTurbopackClient; //# sourceMappingURL=react-server-dom-turbopack-client.js.map +}), +"[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/client/components/router-reducer/router-reducer-types.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + ACTION_HMR_REFRESH: null, + ACTION_NAVIGATE: null, + ACTION_REFRESH: null, + ACTION_RESTORE: null, + ACTION_SERVER_ACTION: null, + ACTION_SERVER_PATCH: null, + PrefetchKind: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + ACTION_HMR_REFRESH: function() { + return ACTION_HMR_REFRESH; + }, + ACTION_NAVIGATE: function() { + return ACTION_NAVIGATE; + }, + ACTION_REFRESH: function() { + return ACTION_REFRESH; + }, + ACTION_RESTORE: function() { + return ACTION_RESTORE; + }, + ACTION_SERVER_ACTION: function() { + return ACTION_SERVER_ACTION; + }, + ACTION_SERVER_PATCH: function() { + return ACTION_SERVER_PATCH; + }, + PrefetchKind: function() { + return PrefetchKind; + } +}); +const ACTION_REFRESH = 'refresh'; +const ACTION_NAVIGATE = 'navigate'; +const ACTION_RESTORE = 'restore'; +const ACTION_SERVER_PATCH = 'server-patch'; +const ACTION_HMR_REFRESH = 'hmr-refresh'; +const ACTION_SERVER_ACTION = 'server-action'; +var PrefetchKind = /*#__PURE__*/ function(PrefetchKind) { + PrefetchKind["AUTO"] = "auto"; + PrefetchKind["FULL"] = "full"; + PrefetchKind["TEMPORARY"] = "temporary"; + return PrefetchKind; +}({}); +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=router-reducer-types.js.map +}), +"[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/shared/lib/is-thenable.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * Check to see if a value is Thenable. + * + * @param promise the maybe-thenable value + * @returns true if the value is thenable + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isThenable", { + enumerable: true, + get: function() { + return isThenable; + } +}); +function isThenable(promise) { + return promise !== null && typeof promise === 'object' && 'then' in promise && typeof promise.then === 'function'; +} //# sourceMappingURL=is-thenable.js.map +}), +"[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/next-devtools/dev-overlay.shim.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + dispatcher: null, + renderAppDevOverlay: null, + renderPagesDevOverlay: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + dispatcher: function() { + return dispatcher; + }, + renderAppDevOverlay: function() { + return renderAppDevOverlay; + }, + renderPagesDevOverlay: function() { + return renderPagesDevOverlay; + } +}); +function renderAppDevOverlay() { + throw Object.defineProperty(new Error("Next DevTools: Can't render in this environment. This is a bug in Next.js"), "__NEXT_ERROR_CODE", { + value: "E697", + enumerable: false, + configurable: true + }); +} +function renderPagesDevOverlay() { + throw Object.defineProperty(new Error("Next DevTools: Can't render in this environment. This is a bug in Next.js"), "__NEXT_ERROR_CODE", { + value: "E697", + enumerable: false, + configurable: true + }); +} +const dispatcher = new Proxy({}, { + get: (_, prop)=>{ + return ()=>{ + throw Object.defineProperty(new Error(`Next DevTools: Can't dispatch ${String(prop)} in this environment. This is a bug in Next.js`), "__NEXT_ERROR_CODE", { + value: "E698", + enumerable: false, + configurable: true + }); + }; + } +}); +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=dev-overlay.shim.js.map +}), +"[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/next-devtools/userspace/use-app-dev-rendering-indicator.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "useAppDevRenderingIndicator", { + enumerable: true, + get: function() { + return useAppDevRenderingIndicator; + } +}); +const _react = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +const _nextdevtools = __turbopack_context__.r("[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/next-devtools/dev-overlay.shim.js [app-ssr] (ecmascript)"); +const useAppDevRenderingIndicator = ()=>{ + const [isPending, startTransition] = (0, _react.useTransition)(); + (0, _react.useEffect)(()=>{ + if (isPending) { + _nextdevtools.dispatcher.renderingIndicatorShow(); + } else { + _nextdevtools.dispatcher.renderingIndicatorHide(); + } + }, [ + isPending + ]); + return startTransition; +}; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=use-app-dev-rendering-indicator.js.map +}), +"[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/client/components/use-action-queue.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + dispatchAppRouterAction: null, + useActionQueue: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + dispatchAppRouterAction: function() { + return dispatchAppRouterAction; + }, + useActionQueue: function() { + return useActionQueue; + } +}); +const _interop_require_wildcard = __turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs [app-ssr] (ecmascript)"); +const _react = /*#__PURE__*/ _interop_require_wildcard._(__turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)")); +const _isthenable = __turbopack_context__.r("[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/shared/lib/is-thenable.js [app-ssr] (ecmascript)"); +// The app router state lives outside of React, so we can import the dispatch +// method directly wherever we need it, rather than passing it around via props +// or context. +let dispatch = null; +function dispatchAppRouterAction(action) { + if (dispatch === null) { + throw Object.defineProperty(new Error('Internal Next.js error: Router action dispatched before initialization.'), "__NEXT_ERROR_CODE", { + value: "E668", + enumerable: false, + configurable: true + }); + } + dispatch(action); +} +const __DEV__ = ("TURBOPACK compile-time value", "development") !== 'production'; +const promisesWithDebugInfo = ("TURBOPACK compile-time truthy", 1) ? new WeakMap() : "TURBOPACK unreachable"; +function useActionQueue(actionQueue) { + const [state, setState] = _react.default.useState(actionQueue.state); + // Because of a known issue that requires to decode Flight streams inside the + // render phase, we have to be a bit clever and assign the dispatch method to + // a module-level variable upon initialization. The useState hook in this + // module only exists to synchronize state that lives outside of React. + // Ideally, what we'd do instead is pass the state as a prop to root.render; + // this is conceptually how we're modeling the app router state, despite the + // weird implementation details. + if ("TURBOPACK compile-time truthy", 1) { + const { useAppDevRenderingIndicator } = __turbopack_context__.r("[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/next-devtools/userspace/use-app-dev-rendering-indicator.js [app-ssr] (ecmascript)"); + // eslint-disable-next-line react-hooks/rules-of-hooks + const appDevRenderingIndicator = useAppDevRenderingIndicator(); + dispatch = (action)=>{ + appDevRenderingIndicator(()=>{ + actionQueue.dispatch(action, setState); + }); + }; + } else //TURBOPACK unreachable + ; + // When navigating to a non-prefetched route, then App Router state will be + // blocked until the server responds. We need to transfer the `_debugInfo` + // from the underlying Flight response onto the top-level promise that is + // passed to React (via `use`) so that the latency is accurately represented + // in the React DevTools. + const stateWithDebugInfo = (0, _react.useMemo)(()=>{ + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + if ((0, _isthenable.isThenable)(state)) { + // useMemo can't be used to cache a Promise since the memoized value is thrown + // away when we suspend. So we use a WeakMap to cache the Promise with debug info. + let promiseWithDebugInfo = promisesWithDebugInfo.get(state); + if (promiseWithDebugInfo === undefined) { + const debugInfo = []; + promiseWithDebugInfo = Promise.resolve(state).then((asyncState)=>{ + if (asyncState.debugInfo !== null) { + debugInfo.push(...asyncState.debugInfo); + } + return asyncState; + }); + promiseWithDebugInfo._debugInfo = debugInfo; + promisesWithDebugInfo.set(state, promiseWithDebugInfo); + } + return promiseWithDebugInfo; + } + return state; + }, [ + state + ]); + return (0, _isthenable.isThenable)(stateWithDebugInfo) ? (0, _react.use)(stateWithDebugInfo) : stateWithDebugInfo; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=use-action-queue.js.map +}), +"[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/client/app-call-server.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "callServer", { + enumerable: true, + get: function() { + return callServer; + } +}); +const _react = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +const _routerreducertypes = __turbopack_context__.r("[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/client/components/router-reducer/router-reducer-types.js [app-ssr] (ecmascript)"); +const _useactionqueue = __turbopack_context__.r("[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/client/components/use-action-queue.js [app-ssr] (ecmascript)"); +async function callServer(actionId, actionArgs) { + return new Promise((resolve, reject)=>{ + (0, _react.startTransition)(()=>{ + (0, _useactionqueue.dispatchAppRouterAction)({ + type: _routerreducertypes.ACTION_SERVER_ACTION, + actionId, + actionArgs, + resolve, + reject + }); + }); + }); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=app-call-server.js.map +}), +"[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/client/app-find-source-map-url.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "findSourceMapURL", { + enumerable: true, + get: function() { + return findSourceMapURL; + } +}); +const basePath = ("TURBOPACK compile-time value", "") || ''; +const pathname = `${basePath}/__nextjs_source-map`; +const findSourceMapURL = ("TURBOPACK compile-time truthy", 1) ? function findSourceMapURL(filename) { + if (filename === '') { + return null; + } + if (filename.startsWith(document.location.origin) && filename.includes('/_next/static')) { + // This is a request for a client chunk. This can only happen when + // using Turbopack. In this case, since we control how those source + // maps are generated, we can safely assume that the sourceMappingURL + // is relative to the filename, with an added `.map` extension. The + // browser can just request this file, and it gets served through the + // normal dev server, without the need to route this through + // the `/__nextjs_source-map` dev middleware. + return `${filename}.map`; + } + const url = new URL(pathname, document.location.origin); + url.searchParams.set('filename', filename); + return url.href; +} : "TURBOPACK unreachable"; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=app-find-source-map-url.js.map +}), +"[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/shared/lib/segment-cache/segment-value-encoding.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + HEAD_REQUEST_KEY: null, + ROOT_SEGMENT_REQUEST_KEY: null, + appendSegmentRequestKeyPart: null, + convertSegmentPathToStaticExportFilename: null, + createSegmentRequestKeyPart: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + HEAD_REQUEST_KEY: function() { + return HEAD_REQUEST_KEY; + }, + ROOT_SEGMENT_REQUEST_KEY: function() { + return ROOT_SEGMENT_REQUEST_KEY; + }, + appendSegmentRequestKeyPart: function() { + return appendSegmentRequestKeyPart; + }, + convertSegmentPathToStaticExportFilename: function() { + return convertSegmentPathToStaticExportFilename; + }, + createSegmentRequestKeyPart: function() { + return createSegmentRequestKeyPart; + } +}); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const ROOT_SEGMENT_REQUEST_KEY = ''; +const HEAD_REQUEST_KEY = '/_head'; +function createSegmentRequestKeyPart(segment) { + if (typeof segment === 'string') { + if (segment.startsWith(_segment.PAGE_SEGMENT_KEY)) { + // The Flight Router State type sometimes includes the search params in + // the page segment. However, the Segment Cache tracks this as a separate + // key. So, we strip the search params here, and then add them back when + // the cache entry is turned back into a FlightRouterState. This is an + // unfortunate consequence of the FlightRouteState being used both as a + // transport type and as a cache key; we'll address this once more of the + // Segment Cache implementation has settled. + // TODO: We should hoist the search params out of the FlightRouterState + // type entirely, This is our plan for dynamic route params, too. + return _segment.PAGE_SEGMENT_KEY; + } + const safeName = // But params typically don't include the leading slash. We should use + // a different encoding to avoid this special case. + segment === '/_not-found' ? '_not-found' : encodeToFilesystemAndURLSafeString(segment); + // Since this is not a dynamic segment, it's fully encoded. It does not + // need to be "hydrated" with a param value. + return safeName; + } + const name = segment[0]; + const paramType = segment[2]; + const safeName = encodeToFilesystemAndURLSafeString(name); + const encodedName = '$' + paramType + '$' + safeName; + return encodedName; +} +function appendSegmentRequestKeyPart(parentRequestKey, parallelRouteKey, childRequestKeyPart) { + // Aside from being filesystem safe, segment keys are also designed so that + // each segment and parallel route creates its own subdirectory. Roughly in + // the same shape as the source app directory. This is mostly just for easier + // debugging (you can open up the build folder and navigate the output); if + // we wanted to do we could just use a flat structure. + // Omit the parallel route key for children, since this is the most + // common case. Saves some bytes (and it's what the app directory does). + const slotKey = parallelRouteKey === 'children' ? childRequestKeyPart : `@${encodeToFilesystemAndURLSafeString(parallelRouteKey)}/${childRequestKeyPart}`; + return parentRequestKey + '/' + slotKey; +} +// Define a regex pattern to match the most common characters found in a route +// param. It excludes anything that might not be cross-platform filesystem +// compatible, like |. It does not need to be precise because the fallback is to +// just base64url-encode the whole parameter, which is fine; we just don't do it +// by default for compactness, and for easier debugging. +const simpleParamValueRegex = /^[a-zA-Z0-9\-_@]+$/; +function encodeToFilesystemAndURLSafeString(value) { + if (simpleParamValueRegex.test(value)) { + return value; + } + // If there are any unsafe characters, base64url-encode the entire value. + // We also add a ! prefix so it doesn't collide with the simple case. + const base64url = btoa(value).replace(/\+/g, '-') // Replace '+' with '-' + .replace(/\//g, '_') // Replace '/' with '_' + .replace(/=+$/, '') // Remove trailing '=' + ; + return '!' + base64url; +} +function convertSegmentPathToStaticExportFilename(segmentPath) { + return `__next${segmentPath.replace(/\//g, '.')}.txt`; +} //# sourceMappingURL=segment-value-encoding.js.map +}), +"[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/client/route-params.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + doesStaticSegmentAppearInURL: null, + getCacheKeyForDynamicParam: null, + getParamValueFromCacheKey: null, + getRenderedPathname: null, + getRenderedSearch: null, + parseDynamicParamFromURLPart: null, + urlSearchParamsToParsedUrlQuery: null, + urlToUrlWithoutFlightMarker: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + doesStaticSegmentAppearInURL: function() { + return doesStaticSegmentAppearInURL; + }, + getCacheKeyForDynamicParam: function() { + return getCacheKeyForDynamicParam; + }, + getParamValueFromCacheKey: function() { + return getParamValueFromCacheKey; + }, + getRenderedPathname: function() { + return getRenderedPathname; + }, + getRenderedSearch: function() { + return getRenderedSearch; + }, + parseDynamicParamFromURLPart: function() { + return parseDynamicParamFromURLPart; + }, + urlSearchParamsToParsedUrlQuery: function() { + return urlSearchParamsToParsedUrlQuery; + }, + urlToUrlWithoutFlightMarker: function() { + return urlToUrlWithoutFlightMarker; + } +}); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _segmentvalueencoding = __turbopack_context__.r("[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/shared/lib/segment-cache/segment-value-encoding.js [app-ssr] (ecmascript)"); +const _approuterheaders = __turbopack_context__.r("[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/client/components/app-router-headers.js [app-ssr] (ecmascript)"); +function getRenderedSearch(response) { + // If the server performed a rewrite, the search params used to render the + // page will be different from the params in the request URL. In this case, + // the response will include a header that gives the rewritten search query. + const rewrittenQuery = response.headers.get(_approuterheaders.NEXT_REWRITTEN_QUERY_HEADER); + if (rewrittenQuery !== null) { + return rewrittenQuery === '' ? '' : '?' + rewrittenQuery; + } + // If the header is not present, there was no rewrite, so we use the search + // query of the response URL. + return urlToUrlWithoutFlightMarker(new URL(response.url)).search; +} +function getRenderedPathname(response) { + // If the server performed a rewrite, the pathname used to render the + // page will be different from the pathname in the request URL. In this case, + // the response will include a header that gives the rewritten pathname. + const rewrittenPath = response.headers.get(_approuterheaders.NEXT_REWRITTEN_PATH_HEADER); + return rewrittenPath ?? urlToUrlWithoutFlightMarker(new URL(response.url)).pathname; +} +function parseDynamicParamFromURLPart(paramType, pathnameParts, partIndex) { + // This needs to match the behavior in get-dynamic-param.ts. + switch(paramType){ + // Catchalls + case 'c': + { + // Catchalls receive all the remaining URL parts. If there are no + // remaining pathname parts, return an empty array. + return partIndex < pathnameParts.length ? pathnameParts.slice(partIndex).map((s)=>encodeURIComponent(s)) : []; + } + // Catchall intercepted + case 'ci(..)(..)': + case 'ci(.)': + case 'ci(..)': + case 'ci(...)': + { + const prefix = paramType.length - 2; + return partIndex < pathnameParts.length ? pathnameParts.slice(partIndex).map((s, i)=>{ + if (i === 0) { + return encodeURIComponent(s.slice(prefix)); + } + return encodeURIComponent(s); + }) : []; + } + // Optional catchalls + case 'oc': + { + // Optional catchalls receive all the remaining URL parts, unless this is + // the end of the pathname, in which case they return null. + return partIndex < pathnameParts.length ? pathnameParts.slice(partIndex).map((s)=>encodeURIComponent(s)) : null; + } + // Dynamic + case 'd': + { + if (partIndex >= pathnameParts.length) { + // The route tree expected there to be more parts in the URL than there + // actually are. This could happen if the x-nextjs-rewritten-path header + // is incorrectly set, or potentially due to bug in Next.js. TODO: + // Should this be a hard error? During a prefetch, we can just abort. + // During a client navigation, we could trigger a hard refresh. But if + // it happens during initial render, we don't really have any + // recovery options. + return ''; + } + return encodeURIComponent(pathnameParts[partIndex]); + } + // Dynamic intercepted + case 'di(..)(..)': + case 'di(.)': + case 'di(..)': + case 'di(...)': + { + const prefix = paramType.length - 2; + if (partIndex >= pathnameParts.length) { + // The route tree expected there to be more parts in the URL than there + // actually are. This could happen if the x-nextjs-rewritten-path header + // is incorrectly set, or potentially due to bug in Next.js. TODO: + // Should this be a hard error? During a prefetch, we can just abort. + // During a client navigation, we could trigger a hard refresh. But if + // it happens during initial render, we don't really have any + // recovery options. + return ''; + } + return encodeURIComponent(pathnameParts[partIndex].slice(prefix)); + } + default: + paramType; + return ''; + } +} +function doesStaticSegmentAppearInURL(segment) { + // This is not a parameterized segment; however, we need to determine + // whether or not this segment appears in the URL. For example, this route + // groups do not appear in the URL, so they should be skipped. Any other + // special cases must be handled here. + // TODO: Consider encoding this directly into the router tree instead of + // inferring it on the client based on the segment type. Something like + // a `doesAppearInURL` flag in FlightRouterState. + if (segment === _segmentvalueencoding.ROOT_SEGMENT_REQUEST_KEY || // For some reason, the loader tree sometimes includes extra __PAGE__ + // "layouts" when part of a parallel route. But it's not a leaf node. + // Otherwise, we wouldn't need this special case because pages are + // always leaf nodes. + // TODO: Investigate why the loader produces these fake page segments. + segment.startsWith(_segment.PAGE_SEGMENT_KEY) || // Route groups. + segment[0] === '(' && segment.endsWith(')') || segment === _segment.DEFAULT_SEGMENT_KEY || segment === '/_not-found') { + return false; + } else { + // All other segment types appear in the URL + return true; + } +} +function getCacheKeyForDynamicParam(paramValue, renderedSearch) { + // This needs to match the logic in get-dynamic-param.ts, until we're able to + // unify the various implementations so that these are always computed on + // the client. + if (typeof paramValue === 'string') { + // TODO: Refactor or remove this helper function to accept a string rather + // than the whole segment type. Also we can probably just append the + // search string instead of turning it into JSON. + const pageSegmentWithSearchParams = (0, _segment.addSearchParamsIfPageSegment)(paramValue, Object.fromEntries(new URLSearchParams(renderedSearch))); + return pageSegmentWithSearchParams; + } else if (paramValue === null) { + return ''; + } else { + return paramValue.join('/'); + } +} +function urlToUrlWithoutFlightMarker(url) { + const urlWithoutFlightParameters = new URL(url); + urlWithoutFlightParameters.searchParams.delete(_approuterheaders.NEXT_RSC_UNION_QUERY); + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + return urlWithoutFlightParameters; +} +function getParamValueFromCacheKey(paramCacheKey, paramType) { + // Turn the cache key string sent by the server (as part of FlightRouterState) + // into a value that can be passed to `useParams` and client components. + const isCatchAll = paramType === 'c' || paramType === 'oc'; + if (isCatchAll) { + // Catch-all param keys are a concatenation of the path segments. + // See equivalent logic in `getSelectedParams`. + // TODO: We should just pass the array directly, rather than concatenate + // it to a string and then split it back to an array. It needs to be an + // array in some places, like when passing a key React, but we can convert + // it at runtime in those places. + return paramCacheKey.split('/'); + } + return paramCacheKey; +} +function urlSearchParamsToParsedUrlQuery(searchParams) { + // Converts a URLSearchParams object to the same type used by the server when + // creating search params props, i.e. the type returned by Node's + // "querystring" module. + const result = {}; + for (const [key, value] of searchParams.entries()){ + if (result[key] === undefined) { + result[key] = value; + } else if (Array.isArray(result[key])) { + result[key].push(value); + } else { + result[key] = [ + result[key], + value + ]; + } + } + return result; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=route-params.js.map +}), +"[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "createHrefFromUrl", { + enumerable: true, + get: function() { + return createHrefFromUrl; + } +}); +function createHrefFromUrl(url, includeHash = true) { + return url.pathname + url.search + (includeHash ? url.hash : ''); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=create-href-from-url.js.map +}), +"[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/client/flight-data-helpers.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + createInitialRSCPayloadFromFallbackPrerender: null, + getFlightDataPartsFromPath: null, + getNextFlightSegmentPath: null, + normalizeFlightData: null, + prepareFlightRouterStateForRequest: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + createInitialRSCPayloadFromFallbackPrerender: function() { + return createInitialRSCPayloadFromFallbackPrerender; + }, + getFlightDataPartsFromPath: function() { + return getFlightDataPartsFromPath; + }, + getNextFlightSegmentPath: function() { + return getNextFlightSegmentPath; + }, + normalizeFlightData: function() { + return normalizeFlightData; + }, + prepareFlightRouterStateForRequest: function() { + return prepareFlightRouterStateForRequest; + } +}); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _routeparams = __turbopack_context__.r("[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/client/route-params.js [app-ssr] (ecmascript)"); +const _createhreffromurl = __turbopack_context__.r("[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)"); +function getFlightDataPartsFromPath(flightDataPath) { + // Pick the last 4 items from the `FlightDataPath` to get the [tree, seedData, viewport, isHeadPartial]. + const flightDataPathLength = 4; + // tree, seedData, and head are *always* the last three items in the `FlightDataPath`. + const [tree, seedData, head, isHeadPartial] = flightDataPath.slice(-flightDataPathLength); + // The `FlightSegmentPath` is everything except the last three items. For a root render, it won't be present. + const segmentPath = flightDataPath.slice(0, -flightDataPathLength); + return { + // TODO: Unify these two segment path helpers. We are inconsistently pushing an empty segment ("") + // to the start of the segment path in some places which makes it hard to use solely the segment path. + // Look for "// TODO-APP: remove ''" in the codebase. + pathToSegment: segmentPath.slice(0, -1), + segmentPath, + // if the `FlightDataPath` corresponds with the root, there'll be no segment path, + // in which case we default to ''. + segment: segmentPath[segmentPath.length - 1] ?? '', + tree, + seedData, + head, + isHeadPartial, + isRootRender: flightDataPath.length === flightDataPathLength + }; +} +function createInitialRSCPayloadFromFallbackPrerender(response, fallbackInitialRSCPayload) { + // This is a static fallback page. In order to hydrate the page, we need to + // parse the client params from the URL, but to account for the possibility + // that the page was rewritten, we need to check the response headers + // for x-nextjs-rewritten-path or x-nextjs-rewritten-query headers. Since + // we can't access the headers of the initial document response, the client + // performs a fetch request to the current location. Since it's possible that + // the fetch request will be dynamically rewritten to a different path than + // the initial document, this fetch request delivers _all_ the hydration data + // for the page; it was not inlined into the document, like it normally + // would be. + // + // TODO: Consider treating the case where fetch is rewritten to a different + // path from the document as a special deopt case. We should optimistically + // assume this won't happen, inline the data into the document, and perform + // a minimal request (like a HEAD or range request) to verify that the + // response matches. Tricky to get right because we need to account for + // all the different deployment environments we support, like output: + // "export" mode, where we currently don't assume that custom response + // headers are present. + // Patch the Flight data sent by the server with the correct params parsed + // from the URL + response object. + const renderedPathname = (0, _routeparams.getRenderedPathname)(response); + const renderedSearch = (0, _routeparams.getRenderedSearch)(response); + const canonicalUrl = (0, _createhreffromurl.createHrefFromUrl)(new URL(location.href)); + const originalFlightDataPath = fallbackInitialRSCPayload.f[0]; + const originalFlightRouterState = originalFlightDataPath[0]; + return { + b: fallbackInitialRSCPayload.b, + c: canonicalUrl.split('/'), + q: renderedSearch, + i: fallbackInitialRSCPayload.i, + f: [ + [ + fillInFallbackFlightRouterState(originalFlightRouterState, renderedPathname, renderedSearch), + originalFlightDataPath[1], + originalFlightDataPath[2], + originalFlightDataPath[2] + ] + ], + m: fallbackInitialRSCPayload.m, + G: fallbackInitialRSCPayload.G, + S: fallbackInitialRSCPayload.S + }; +} +function fillInFallbackFlightRouterState(flightRouterState, renderedPathname, renderedSearch) { + const pathnameParts = renderedPathname.split('/').filter((p)=>p !== ''); + const index = 0; + return fillInFallbackFlightRouterStateImpl(flightRouterState, renderedSearch, pathnameParts, index); +} +function fillInFallbackFlightRouterStateImpl(flightRouterState, renderedSearch, pathnameParts, pathnamePartsIndex) { + const originalSegment = flightRouterState[0]; + let newSegment; + let doesAppearInURL; + if (typeof originalSegment === 'string') { + newSegment = originalSegment; + doesAppearInURL = (0, _routeparams.doesStaticSegmentAppearInURL)(originalSegment); + } else { + const paramName = originalSegment[0]; + const paramType = originalSegment[2]; + const paramValue = (0, _routeparams.parseDynamicParamFromURLPart)(paramType, pathnameParts, pathnamePartsIndex); + const cacheKey = (0, _routeparams.getCacheKeyForDynamicParam)(paramValue, renderedSearch); + newSegment = [ + paramName, + cacheKey, + paramType + ]; + doesAppearInURL = true; + } + // Only increment the index if the segment appears in the URL. If it's a + // "virtual" segment, like a route group, it remains the same. + const childPathnamePartsIndex = doesAppearInURL ? pathnamePartsIndex + 1 : pathnamePartsIndex; + const children = flightRouterState[1]; + const newChildren = {}; + for(let key in children){ + const childFlightRouterState = children[key]; + newChildren[key] = fillInFallbackFlightRouterStateImpl(childFlightRouterState, renderedSearch, pathnameParts, childPathnamePartsIndex); + } + const newState = [ + newSegment, + newChildren, + null, + flightRouterState[3], + flightRouterState[4] + ]; + return newState; +} +function getNextFlightSegmentPath(flightSegmentPath) { + // Since `FlightSegmentPath` is a repeated tuple of `Segment` and `ParallelRouteKey`, we slice off two items + // to get the next segment path. + return flightSegmentPath.slice(2); +} +function normalizeFlightData(flightData) { + // FlightData can be a string when the server didn't respond with a proper flight response, + // or when a redirect happens, to signal to the client that it needs to perform an MPA navigation. + if (typeof flightData === 'string') { + return flightData; + } + return flightData.map((flightDataPath)=>getFlightDataPartsFromPath(flightDataPath)); +} +function prepareFlightRouterStateForRequest(flightRouterState, isHmrRefresh) { + // HMR requests need the complete, unmodified state for proper functionality + if (isHmrRefresh) { + return encodeURIComponent(JSON.stringify(flightRouterState)); + } + return encodeURIComponent(JSON.stringify(stripClientOnlyDataFromFlightRouterState(flightRouterState))); +} +/** + * Recursively strips client-only data from FlightRouterState while preserving + * server-needed information for proper rendering decisions. + */ function stripClientOnlyDataFromFlightRouterState(flightRouterState) { + const [segment, parallelRoutes, _url, refreshMarker, isRootLayout, hasLoadingBoundary] = flightRouterState; + // __PAGE__ segments are always fetched from the server, so there's + // no need to send them up + const cleanedSegment = stripSearchParamsFromPageSegment(segment); + // Recursively process parallel routes + const cleanedParallelRoutes = {}; + for (const [key, childState] of Object.entries(parallelRoutes)){ + cleanedParallelRoutes[key] = stripClientOnlyDataFromFlightRouterState(childState); + } + const result = [ + cleanedSegment, + cleanedParallelRoutes, + null, + shouldPreserveRefreshMarker(refreshMarker) ? refreshMarker : null + ]; + // Append optional fields if present + if (isRootLayout !== undefined) { + result[4] = isRootLayout; + } + if (hasLoadingBoundary !== undefined) { + result[5] = hasLoadingBoundary; + } + return result; +} +/** + * Strips search parameters from __PAGE__ segments to prevent sensitive + * client-side data from being sent to the server. + */ function stripSearchParamsFromPageSegment(segment) { + if (typeof segment === 'string' && segment.startsWith(_segment.PAGE_SEGMENT_KEY + '?')) { + return _segment.PAGE_SEGMENT_KEY; + } + return segment; +} +/** + * Determines whether the refresh marker should be sent to the server + * Client-only markers like 'refresh' are stripped, while server-needed markers + * like 'refetch' and 'inside-shared-layout' are preserved. + */ function shouldPreserveRefreshMarker(refreshMarker) { + return Boolean(refreshMarker && refreshMarker !== 'refresh'); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=flight-data-helpers.js.map +}), +"[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/client/app-build-id.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +// This gets assigned as a side-effect during app initialization. Because it +// represents the build used to create the JS bundle, it should never change +// after being set, so we store it in a global variable. +// +// When performing RSC requests, if the incoming data has a different build ID, +// we perform an MPA navigation/refresh to load the updated build and ensure +// that the client and server in sync. +// Starts as an empty string. In practice, because setAppBuildId is called +// during initialization before hydration starts, this will always get +// reassigned to the actual build ID before it's ever needed by a navigation. +// If for some reasons it didn't, due to a bug or race condition, then on +// navigation the build comparision would fail and trigger an MPA navigation. +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + getAppBuildId: null, + setAppBuildId: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + getAppBuildId: function() { + return getAppBuildId; + }, + setAppBuildId: function() { + return setAppBuildId; + } +}); +let globalBuildId = ''; +function setAppBuildId(buildId) { + globalBuildId = buildId; +} +function getAppBuildId() { + return globalBuildId; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=app-build-id.js.map +}), +"[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/shared/lib/hash.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +// http://www.cse.yorku.ca/~oz/hash.html +// More specifically, 32-bit hash via djbxor +// (ref: https://gist.github.com/eplawless/52813b1d8ad9af510d85?permalink_comment_id=3367765#gistcomment-3367765) +// This is due to number type differences between rust for turbopack to js number types, +// where rust does not have easy way to repreesnt js's 53-bit float number type for the matching +// overflow behavior. This is more `correct` in terms of having canonical hash across different runtime / implementation +// as can gaurantee determinstic output from 32bit hash. +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + djb2Hash: null, + hexHash: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + djb2Hash: function() { + return djb2Hash; + }, + hexHash: function() { + return hexHash; + } +}); +function djb2Hash(str) { + let hash = 5381; + for(let i = 0; i < str.length; i++){ + const char = str.charCodeAt(i); + hash = (hash << 5) + hash + char & 0xffffffff; + } + return hash >>> 0; +} +function hexHash(str) { + return djb2Hash(str).toString(36).slice(0, 5); +} //# sourceMappingURL=hash.js.map +}), +"[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/shared/lib/router/utils/cache-busting-search-param.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "computeCacheBustingSearchParam", { + enumerable: true, + get: function() { + return computeCacheBustingSearchParam; + } +}); +const _hash = __turbopack_context__.r("[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/shared/lib/hash.js [app-ssr] (ecmascript)"); +function computeCacheBustingSearchParam(prefetchHeader, segmentPrefetchHeader, stateTreeHeader, nextUrlHeader) { + if ((prefetchHeader === undefined || prefetchHeader === '0') && segmentPrefetchHeader === undefined && stateTreeHeader === undefined && nextUrlHeader === undefined) { + return ''; + } + return (0, _hash.hexHash)([ + prefetchHeader || '0', + segmentPrefetchHeader || '0', + stateTreeHeader || '0', + nextUrlHeader || '0' + ].join(',')); +} //# sourceMappingURL=cache-busting-search-param.js.map +}), +"[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/client/components/router-reducer/set-cache-busting-search-param.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + setCacheBustingSearchParam: null, + setCacheBustingSearchParamWithHash: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + setCacheBustingSearchParam: function() { + return setCacheBustingSearchParam; + }, + setCacheBustingSearchParamWithHash: function() { + return setCacheBustingSearchParamWithHash; + } +}); +const _cachebustingsearchparam = __turbopack_context__.r("[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/shared/lib/router/utils/cache-busting-search-param.js [app-ssr] (ecmascript)"); +const _approuterheaders = __turbopack_context__.r("[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/client/components/app-router-headers.js [app-ssr] (ecmascript)"); +const setCacheBustingSearchParam = (url, headers)=>{ + const uniqueCacheKey = (0, _cachebustingsearchparam.computeCacheBustingSearchParam)(headers[_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER], headers[_approuterheaders.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER], headers[_approuterheaders.NEXT_ROUTER_STATE_TREE_HEADER], headers[_approuterheaders.NEXT_URL]); + setCacheBustingSearchParamWithHash(url, uniqueCacheKey); +}; +const setCacheBustingSearchParamWithHash = (url, hash)=>{ + /** + * Note that we intentionally do not use `url.searchParams.set` here: + * + * const url = new URL('https://example.com/search?q=custom%20spacing'); + * url.searchParams.set('_rsc', 'abc123'); + * console.log(url.toString()); // Outputs: https://example.com/search?q=custom+spacing&_rsc=abc123 + * ^ <--- this is causing confusion + * This is in fact intended based on https://url.spec.whatwg.org/#interface-urlsearchparams, but + * we want to preserve the %20 as %20 if that's what the user passed in, hence the custom + * logic below. + */ const existingSearch = url.search; + const rawQuery = existingSearch.startsWith('?') ? existingSearch.slice(1) : existingSearch; + // Always remove any existing cache busting param and add a fresh one to ensure + // we have the correct value based on current request headers + const pairs = rawQuery.split('&').filter((pair)=>pair && !pair.startsWith(`${_approuterheaders.NEXT_RSC_UNION_QUERY}=`)); + if (hash.length > 0) { + pairs.push(`${_approuterheaders.NEXT_RSC_UNION_QUERY}=${hash}`); + } else { + pairs.push(`${_approuterheaders.NEXT_RSC_UNION_QUERY}`); + } + url.search = pairs.length ? `?${pairs.join('&')}` : ''; +}; +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=set-cache-busting-search-param.js.map +}), +"[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/client/components/router-reducer/fetch-server-response.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + createFetch: null, + createFromNextReadableStream: null, + fetchServerResponse: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + createFetch: function() { + return createFetch; + }, + createFromNextReadableStream: function() { + return createFromNextReadableStream; + }, + fetchServerResponse: function() { + return fetchServerResponse; + } +}); +const _client = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react-server-dom-turbopack-client.js [app-ssr] (ecmascript)"); +const _approuterheaders = __turbopack_context__.r("[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/client/components/app-router-headers.js [app-ssr] (ecmascript)"); +const _appcallserver = __turbopack_context__.r("[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/client/app-call-server.js [app-ssr] (ecmascript)"); +const _appfindsourcemapurl = __turbopack_context__.r("[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/client/app-find-source-map-url.js [app-ssr] (ecmascript)"); +const _routerreducertypes = __turbopack_context__.r("[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/client/components/router-reducer/router-reducer-types.js [app-ssr] (ecmascript)"); +const _flightdatahelpers = __turbopack_context__.r("[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/client/flight-data-helpers.js [app-ssr] (ecmascript)"); +const _appbuildid = __turbopack_context__.r("[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/client/app-build-id.js [app-ssr] (ecmascript)"); +const _setcachebustingsearchparam = __turbopack_context__.r("[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/client/components/router-reducer/set-cache-busting-search-param.js [app-ssr] (ecmascript)"); +const _routeparams = __turbopack_context__.r("[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/client/route-params.js [app-ssr] (ecmascript)"); +const createFromReadableStream = _client.createFromReadableStream; +const createFromFetch = _client.createFromFetch; +let createDebugChannel; +if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable +; +function doMpaNavigation(url) { + return (0, _routeparams.urlToUrlWithoutFlightMarker)(new URL(url, location.origin)).toString(); +} +let abortController = new AbortController(); +if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable +; +async function fetchServerResponse(url, options) { + const { flightRouterState, nextUrl, prefetchKind } = options; + const headers = { + // Enable flight response + [_approuterheaders.RSC_HEADER]: '1', + // Provide the current router state + [_approuterheaders.NEXT_ROUTER_STATE_TREE_HEADER]: (0, _flightdatahelpers.prepareFlightRouterStateForRequest)(flightRouterState, options.isHmrRefresh) + }; + /** + * Three cases: + * - `prefetchKind` is `undefined`, it means it's a normal navigation, so we want to prefetch the page data fully + * - `prefetchKind` is `full` - we want to prefetch the whole page so same as above + * - `prefetchKind` is `auto` - if the page is dynamic, prefetch the page data partially, if static prefetch the page data fully + */ if (prefetchKind === _routerreducertypes.PrefetchKind.AUTO) { + headers[_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER] = '1'; + } + if (("TURBOPACK compile-time value", "development") === 'development' && options.isHmrRefresh) { + headers[_approuterheaders.NEXT_HMR_REFRESH_HEADER] = '1'; + } + if (nextUrl) { + headers[_approuterheaders.NEXT_URL] = nextUrl; + } + // In static export mode, we need to modify the URL to request the .txt file, + // but we should preserve the original URL for the canonical URL and error handling. + const originalUrl = url; + try { + // When creating a "temporary" prefetch (the "on-demand" prefetch that gets created on navigation, if one doesn't exist) + // we send the request with a "high" priority as it's in response to a user interaction that could be blocking a transition. + // Otherwise, all other prefetches are sent with a "low" priority. + // We use "auto" for in all other cases to match the existing default, as this function is shared outside of prefetching. + const fetchPriority = prefetchKind ? prefetchKind === _routerreducertypes.PrefetchKind.TEMPORARY ? 'high' : 'low' : 'auto'; + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + // Typically, during a navigation, we decode the response using Flight's + // `createFromFetch` API, which accepts a `fetch` promise. + // TODO: Remove this check once the old PPR flag is removed + const isLegacyPPR = ("TURBOPACK compile-time value", false) && !("TURBOPACK compile-time value", false); + const shouldImmediatelyDecode = !isLegacyPPR; + const res = await createFetch(url, headers, fetchPriority, shouldImmediatelyDecode, abortController.signal); + const responseUrl = (0, _routeparams.urlToUrlWithoutFlightMarker)(new URL(res.url)); + const canonicalUrl = res.redirected ? responseUrl : originalUrl; + const contentType = res.headers.get('content-type') || ''; + const interception = !!res.headers.get('vary')?.includes(_approuterheaders.NEXT_URL); + const postponed = !!res.headers.get(_approuterheaders.NEXT_DID_POSTPONE_HEADER); + const staleTimeHeaderSeconds = res.headers.get(_approuterheaders.NEXT_ROUTER_STALE_TIME_HEADER); + const staleTime = staleTimeHeaderSeconds !== null ? parseInt(staleTimeHeaderSeconds, 10) * 1000 : -1; + let isFlightResponse = contentType.startsWith(_approuterheaders.RSC_CONTENT_TYPE_HEADER); + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + // If fetch returns something different than flight response handle it like a mpa navigation + // If the fetch was not 200, we also handle it like a mpa navigation + if (!isFlightResponse || !res.ok || !res.body) { + // in case the original URL came with a hash, preserve it before redirecting to the new URL + if (url.hash) { + responseUrl.hash = url.hash; + } + return doMpaNavigation(responseUrl.toString()); + } + // We may navigate to a page that requires a different Webpack runtime. + // In prod, every page will have the same Webpack runtime. + // In dev, the Webpack runtime is minimal for each page. + // We need to ensure the Webpack runtime is updated before executing client-side JS of the new page. + // TODO: This needs to happen in the Flight Client. + // Or Webpack needs to include the runtime update in the Flight response as + // a blocking script. + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + let flightResponsePromise = res.flightResponse; + if (flightResponsePromise === null) { + // Typically, `createFetch` would have already started decoding the + // Flight response. If it hasn't, though, we need to decode it now. + // TODO: This should only be reachable if legacy PPR is enabled (i.e. PPR + // without Cache Components). Remove this branch once legacy PPR + // is deleted. + const flightStream = postponed ? createUnclosingPrefetchStream(res.body) : res.body; + flightResponsePromise = createFromNextReadableStream(flightStream, headers); + } + const flightResponse = await flightResponsePromise; + if ((0, _appbuildid.getAppBuildId)() !== flightResponse.b) { + return doMpaNavigation(res.url); + } + const normalizedFlightData = (0, _flightdatahelpers.normalizeFlightData)(flightResponse.f); + if (typeof normalizedFlightData === 'string') { + return doMpaNavigation(normalizedFlightData); + } + return { + flightData: normalizedFlightData, + canonicalUrl: canonicalUrl, + renderedSearch: (0, _routeparams.getRenderedSearch)(res), + couldBeIntercepted: interception, + prerendered: flightResponse.S, + postponed, + staleTime, + debugInfo: flightResponsePromise._debugInfo ?? null + }; + } catch (err) { + if (!abortController.signal.aborted) { + console.error(`Failed to fetch RSC payload for ${originalUrl}. Falling back to browser navigation.`, err); + } + // If fetch fails handle it like a mpa navigation + // TODO-APP: Add a test for the case where a CORS request fails, e.g. external url redirect coming from the response. + // See https://github.com/vercel/next.js/issues/43605#issuecomment-1451617521 for a reproduction. + return originalUrl.toString(); + } +} +async function createFetch(url, headers, fetchPriority, shouldImmediatelyDecode, signal) { + // TODO: In output: "export" mode, the headers do nothing. Omit them (and the + // cache busting search param) from the request so they're + // maximally cacheable. + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + if ("TURBOPACK compile-time truthy", 1) { + if (self.__next_r) { + headers[_approuterheaders.NEXT_HTML_REQUEST_ID_HEADER] = self.__next_r; + } + // Create a new request ID for the server action request. The server uses + // this to tag debug information sent via WebSocket to the client, which + // then routes those chunks to the debug channel associated with this ID. + headers[_approuterheaders.NEXT_REQUEST_ID_HEADER] = crypto.getRandomValues(new Uint32Array(1))[0].toString(16); + } + const fetchOptions = { + // Backwards compat for older browsers. `same-origin` is the default in modern browsers. + credentials: 'same-origin', + headers, + priority: fetchPriority || undefined, + signal + }; + // `fetchUrl` is slightly different from `url` because we add a cache-busting + // search param to it. This should not leak outside of this function, so we + // track them separately. + let fetchUrl = new URL(url); + (0, _setcachebustingsearchparam.setCacheBustingSearchParam)(fetchUrl, headers); + let fetchPromise = fetch(fetchUrl, fetchOptions); + // Immediately pass the fetch promise to the Flight client so that the debug + // info includes the latency from the client to the server. The internal timer + // in React starts as soon as `createFromFetch` is called. + // + // The only case where we don't do this is during a prefetch, because we have + // to do some extra processing of the response stream (see + // `createUnclosingPrefetchStream`). But this is fine, because a top-level + // prefetch response never blocks a navigation; if it hasn't already been + // written into the cache by the time the navigation happens, the router will + // go straight to a dynamic request. + let flightResponsePromise = shouldImmediatelyDecode ? createFromNextFetch(fetchPromise, headers) : null; + let browserResponse = await fetchPromise; + // If the server responds with a redirect (e.g. 307), and the redirected + // location does not contain the cache busting search param set in the + // original request, the response is likely invalid — when following the + // redirect, the browser forwards the request headers, but since the cache + // busting search param is missing, the server will reject the request due to + // a mismatch. + // + // Ideally, we would be able to intercept the redirect response and perform it + // manually, instead of letting the browser automatically follow it, but this + // is not allowed by the fetch API. + // + // So instead, we must "replay" the redirect by fetching the new location + // again, but this time we'll append the cache busting search param to prevent + // a mismatch. + // + // TODO: We can optimize Next.js's built-in middleware APIs by returning a + // custom status code, to prevent the browser from automatically following it. + // + // This does not affect Server Action-based redirects; those are encoded + // differently, as part of the Flight body. It only affects redirects that + // occur in a middleware or a third-party proxy. + let redirected = browserResponse.redirected; + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + // Remove the cache busting search param from the response URL, to prevent it + // from leaking outside of this function. + const responseUrl = new URL(browserResponse.url, fetchUrl); + responseUrl.searchParams.delete(_approuterheaders.NEXT_RSC_UNION_QUERY); + const rscResponse = { + url: responseUrl.href, + // This is true if any redirects occurred, either automatically by the + // browser, or manually by us. So it's different from + // `browserResponse.redirected`, which only tells us whether the browser + // followed a redirect, and only for the last response in the chain. + redirected, + // These can be copied from the last browser response we received. We + // intentionally only expose the subset of fields that are actually used + // elsewhere in the codebase. + ok: browserResponse.ok, + headers: browserResponse.headers, + body: browserResponse.body, + status: browserResponse.status, + // This is the exact promise returned by `createFromFetch`. It contains + // debug information that we need to transfer to any derived promises that + // are later rendered by React. + flightResponse: flightResponsePromise + }; + return rscResponse; +} +function createFromNextReadableStream(flightStream, requestHeaders) { + return createFromReadableStream(flightStream, { + callServer: _appcallserver.callServer, + findSourceMapURL: _appfindsourcemapurl.findSourceMapURL, + debugChannel: createDebugChannel && createDebugChannel(requestHeaders) + }); +} +function createFromNextFetch(promiseForResponse, requestHeaders) { + return createFromFetch(promiseForResponse, { + callServer: _appcallserver.callServer, + findSourceMapURL: _appfindsourcemapurl.findSourceMapURL, + debugChannel: createDebugChannel && createDebugChannel(requestHeaders) + }); +} +function createUnclosingPrefetchStream(originalFlightStream) { + // When PPR is enabled, prefetch streams may contain references that never + // resolve, because that's how we encode dynamic data access. In the decoded + // object returned by the Flight client, these are reified into hanging + // promises that suspend during render, which is effectively what we want. + // The UI resolves when it switches to the dynamic data stream + // (via useDeferredValue(dynamic, static)). + // + // However, the Flight implementation currently errors if the server closes + // the response before all the references are resolved. As a cheat to work + // around this, we wrap the original stream in a new stream that never closes, + // and therefore doesn't error. + const reader = originalFlightStream.getReader(); + return new ReadableStream({ + async pull (controller) { + while(true){ + const { done, value } = await reader.read(); + if (!done) { + // Pass to the target stream and keep consuming the Flight response + // from the server. + controller.enqueue(value); + continue; + } + // The server stream has closed. Exit, but intentionally do not close + // the target stream. + return; + } + } + }); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=fetch-server-response.js.map +}), +"[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/client/components/segment-cache/lru.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + deleteFromLru: null, + lruPut: null, + updateLruSize: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + deleteFromLru: function() { + return deleteFromLru; + }, + lruPut: function() { + return lruPut; + }, + updateLruSize: function() { + return updateLruSize; + } +}); +const _cachemap = __turbopack_context__.r("[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/client/components/segment-cache/cache-map.js [app-ssr] (ecmascript)"); +let head = null; +let didScheduleCleanup = false; +let lruSize = 0; +// TODO: I chose the max size somewhat arbitrarily. Consider setting this based +// on navigator.deviceMemory, or some other heuristic. We should make this +// customizable via the Next.js config, too. +const maxLruSize = 50 * 1024 * 1024 // 50 MB +; +function lruPut(node) { + if (head === node) { + // Already at the head + return; + } + const prev = node.prev; + const next = node.next; + if (next === null || prev === null) { + // This is an insertion + lruSize += node.size; + // Whenever we add an entry, we need to check if we've exceeded the + // max size. We don't evict entries immediately; they're evicted later in + // an asynchronous task. + ensureCleanupIsScheduled(); + } else { + // This is a move. Remove from its current position. + prev.next = next; + next.prev = prev; + } + // Move to the front of the list + if (head === null) { + // This is the first entry + node.prev = node; + node.next = node; + } else { + // Add to the front of the list + const tail = head.prev; + node.prev = tail; + // In practice, this is never null, but that isn't encoded in the type + if (tail !== null) { + tail.next = node; + } + node.next = head; + head.prev = node; + } + head = node; +} +function updateLruSize(node, newNodeSize) { + // This is a separate function from `put` so that we can resize the entry + // regardless of whether it's currently being tracked by the LRU. + const prevNodeSize = node.size; + node.size = newNodeSize; + if (node.next === null) { + // This entry is not currently being tracked by the LRU. + return; + } + // Update the total LRU size + lruSize = lruSize - prevNodeSize + newNodeSize; + ensureCleanupIsScheduled(); +} +function deleteFromLru(deleted) { + const next = deleted.next; + const prev = deleted.prev; + if (next !== null && prev !== null) { + lruSize -= deleted.size; + deleted.next = null; + deleted.prev = null; + // Remove from the list + if (head === deleted) { + // Update the head + if (next === head) { + // This was the last entry + head = null; + } else { + head = next; + } + } else { + prev.next = next; + next.prev = prev; + } + } else { + // Already deleted + } +} +function ensureCleanupIsScheduled() { + if (didScheduleCleanup || lruSize <= maxLruSize) { + return; + } + didScheduleCleanup = true; + requestCleanupCallback(cleanup); +} +function cleanup() { + didScheduleCleanup = false; + // Evict entries until we're at 90% capacity. We can assume this won't + // infinite loop because even if `maxLruSize` were 0, eventually + // `deleteFromLru` sets `head` to `null` when we run out entries. + const ninetyPercentMax = maxLruSize * 0.9; + while(lruSize > ninetyPercentMax && head !== null){ + const tail = head.prev; + // In practice, this is never null, but that isn't encoded in the type + if (tail !== null) { + // Delete the entry from the map. In turn, this will remove it from + // the LRU. + (0, _cachemap.deleteFromCacheMap)(tail.value); + } + } +} +const requestCleanupCallback = typeof requestIdleCallback === 'function' ? requestIdleCallback : (cb)=>setTimeout(cb, 0); +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=lru.js.map +}), +"[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/client/components/segment-cache/cache-map.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + Fallback: null, + createCacheMap: null, + deleteFromCacheMap: null, + getFromCacheMap: null, + isValueExpired: null, + setInCacheMap: null, + setSizeInCacheMap: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + Fallback: function() { + return Fallback; + }, + createCacheMap: function() { + return createCacheMap; + }, + deleteFromCacheMap: function() { + return deleteFromCacheMap; + }, + getFromCacheMap: function() { + return getFromCacheMap; + }, + isValueExpired: function() { + return isValueExpired; + }, + setInCacheMap: function() { + return setInCacheMap; + }, + setSizeInCacheMap: function() { + return setSizeInCacheMap; + } +}); +const _lru = __turbopack_context__.r("[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/client/components/segment-cache/lru.js [app-ssr] (ecmascript)"); +const Fallback = {}; +// This is a special internal key that is used for "revalidation" entries. It's +// an implementation detail that shouldn't leak outside of this module. +const Revalidation = {}; +function createCacheMap() { + const cacheMap = { + parent: null, + key: null, + value: null, + map: null, + // LRU-related fields + prev: null, + next: null, + size: 0 + }; + return cacheMap; +} +function getOrInitialize(cacheMap, keys, isRevalidation) { + // Go through each level of keys until we find the entry that matches, or + // create a new entry if one doesn't exist. + // + // This function will only return entries that match the keypath _exactly_. + // Unlike getWithFallback, it will not access fallback entries unless it's + // explicitly part of the keypath. + let entry = cacheMap; + let remainingKeys = keys; + let key = null; + while(true){ + const previousKey = key; + if (remainingKeys !== null) { + key = remainingKeys.value; + remainingKeys = remainingKeys.parent; + } else if (isRevalidation && previousKey !== Revalidation) { + // During a revalidation, we append an internal "Revalidation" key to + // the end of the keypath. The "normal" entry is its parent. + // However, if the parent entry is currently empty, we don't need to store + // this as a revalidation entry. Just insert the revalidation into the + // normal slot. + if (entry.value === null) { + return entry; + } + // Otheriwse, create a child entry. + key = Revalidation; + } else { + break; + } + let map = entry.map; + if (map !== null) { + const existingEntry = map.get(key); + if (existingEntry !== undefined) { + // Found a match. Keep going. + entry = existingEntry; + continue; + } + } else { + map = new Map(); + entry.map = map; + } + // No entry exists yet at this level. Create a new one. + const newEntry = { + parent: entry, + key, + value: null, + map: null, + // LRU-related fields + prev: null, + next: null, + size: 0 + }; + map.set(key, newEntry); + entry = newEntry; + } + return entry; +} +function getFromCacheMap(now, currentCacheVersion, rootEntry, keys, isRevalidation) { + const entry = getEntryWithFallbackImpl(now, currentCacheVersion, rootEntry, keys, isRevalidation, 0); + if (entry === null || entry.value === null) { + return null; + } + // This is an LRU access. Move the entry to the front of the list. + (0, _lru.lruPut)(entry); + return entry.value; +} +function isValueExpired(now, currentCacheVersion, value) { + return value.staleAt <= now || value.version < currentCacheVersion; +} +function lazilyEvictIfNeeded(now, currentCacheVersion, entry) { + // We have a matching entry, but before we can return it, we need to check if + // it's still fresh. Otherwise it should be treated the same as a cache miss. + if (entry.value === null) { + // This entry has no value, so there's nothing to evict. + return entry; + } + const value = entry.value; + if (isValueExpired(now, currentCacheVersion, value)) { + // The value expired. Lazily evict it from the cache, and return null. This + // is conceptually the same as a cache miss. + deleteMapEntry(entry); + return null; + } + // The matched entry has not expired. Return it. + return entry; +} +function getEntryWithFallbackImpl(now, currentCacheVersion, entry, keys, isRevalidation, previousKey) { + // This is similar to getExactEntry, but if an exact match is not found for + // a key, it will return the fallback entry instead. This is recursive at + // every level, e.g. an entry with keypath [a, Fallback, c, Fallback] is + // valid match for [a, b, c, d]. + // + // It will return the most specific match available. + let key; + let remainingKeys; + if (keys !== null) { + key = keys.value; + remainingKeys = keys.parent; + } else if (isRevalidation && previousKey !== Revalidation) { + // During a revalidation, we append an internal "Revalidation" key to + // the end of the keypath. + key = Revalidation; + remainingKeys = null; + } else { + // There are no more keys. This is the terminal entry. + // TODO: When performing a lookup during a navigation, as opposed to a + // prefetch, we may want to skip entries that are Pending if there's also + // a Fulfilled fallback entry. Tricky to say, though, since if it's + // already pending, it's likely to stream in soon. Maybe we could do this + // just on slow connections and offline mode. + return lazilyEvictIfNeeded(now, currentCacheVersion, entry); + } + const map = entry.map; + if (map !== null) { + const existingEntry = map.get(key); + if (existingEntry !== undefined) { + // Found an exact match for this key. Keep searching. + const result = getEntryWithFallbackImpl(now, currentCacheVersion, existingEntry, remainingKeys, isRevalidation, key); + if (result !== null) { + return result; + } + } + // No match found for this key. Check if there's a fallback. + const fallbackEntry = map.get(Fallback); + if (fallbackEntry !== undefined) { + // Found a fallback for this key. Keep searching. + return getEntryWithFallbackImpl(now, currentCacheVersion, fallbackEntry, remainingKeys, isRevalidation, key); + } + } + return null; +} +function setInCacheMap(cacheMap, keys, value, isRevalidation) { + // Add a value to the map at the given keypath. If the value is already + // part of the map, it's removed from its previous keypath. (NOTE: This is + // unlike a regular JS map, but the behavior is intentional.) + const entry = getOrInitialize(cacheMap, keys, isRevalidation); + setMapEntryValue(entry, value); + // This is an LRU access. Move the entry to the front of the list. + (0, _lru.lruPut)(entry); + (0, _lru.updateLruSize)(entry, value.size); +} +function setMapEntryValue(entry, value) { + if (entry.value !== null) { + // There's already a value at the given keypath. Disconnect the old value + // from the map. We're not calling `deleteMapEntry` here because the + // entry itself is still in the map. We just want to overwrite its value. + dropRef(entry.value); + // Fill the entry with the updated value. + const emptyEntry = entry; + emptyEntry.value = null; + fillEmptyReference(emptyEntry, value); + } else { + fillEmptyReference(entry, value); + } +} +function fillEmptyReference(entry, value) { + // This value may already be in the map at a different keypath. + // Grab a reference before we overwrite it. + const oldEntry = value.ref; + const fullEntry = entry; + fullEntry.value = value; + value.ref = fullEntry; + (0, _lru.updateLruSize)(fullEntry, value.size); + if (oldEntry !== null && oldEntry !== entry && oldEntry.value === value) { + // This value is already in the map at a different keypath in the map. + // Values only exist at a single keypath at a time. Remove it from the + // previous keypath. + // + // Note that only the internal map entry is garbage collected; we don't + // call `dropRef` here because it's still in the map, just + // at a new keypath (the one we just set, above). + deleteMapEntry(oldEntry); + } +} +function deleteFromCacheMap(value) { + const entry = value.ref; + if (entry === null) { + // This value is not a member of any map. + return; + } + dropRef(value); + deleteMapEntry(entry); +} +function dropRef(value) { + // Drop the value from the map by setting its `ref` backpointer to + // null. This is a separate operation from `deleteMapEntry` because when + // re-keying a value we need to be able to delete the old, internal map + // entry without garbage collecting the value itself. + value.ref = null; +} +function deleteMapEntry(entry) { + // Delete the entry from the cache. + const emptyEntry = entry; + emptyEntry.value = null; + (0, _lru.deleteFromLru)(entry); + // Check if we can garbage collect the entry. + const map = emptyEntry.map; + if (map === null) { + // Since this entry has no value, and also no child entries, we can + // garbage collect it. Remove it from its parent, and keep garbage + // collecting the parents until we reach a non-empty entry. + let parent = emptyEntry.parent; + let key = emptyEntry.key; + while(parent !== null){ + const parentMap = parent.map; + if (parentMap !== null) { + parentMap.delete(key); + if (parentMap.size === 0) { + // We just removed the last entry in the parent map. + parent.map = null; + if (parent.value === null) { + // The parent node has no child entries, nor does it have a value + // on itself. It can be garbage collected. Keep going. + key = parent.key; + parent = parent.parent; + continue; + } + } + } + break; + } + } else { + // Check if there's a revalidating entry. If so, promote it to a + // "normal" entry, since the normal one was just deleted. + const revalidatingEntry = map.get(Revalidation); + if (revalidatingEntry !== undefined && revalidatingEntry.value !== null) { + setMapEntryValue(emptyEntry, revalidatingEntry.value); + } + } +} +function setSizeInCacheMap(value, size) { + const entry = value.ref; + if (entry === null) { + // This value is not a member of any map. + return; + } + // Except during initialization (when the size is set to 0), this is the only + // place the `size` field should be updated, to ensure it's in sync with the + // the LRU. + value.size = size; + (0, _lru.updateLruSize)(entry, size); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=cache-map.js.map +}), +"[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/client/components/segment-cache/vary-path.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + appendLayoutVaryPath: null, + clonePageVaryPathWithNewSearchParams: null, + finalizeLayoutVaryPath: null, + finalizeMetadataVaryPath: null, + finalizePageVaryPath: null, + getFulfilledRouteVaryPath: null, + getRouteVaryPath: null, + getSegmentVaryPathForRequest: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + appendLayoutVaryPath: function() { + return appendLayoutVaryPath; + }, + clonePageVaryPathWithNewSearchParams: function() { + return clonePageVaryPathWithNewSearchParams; + }, + finalizeLayoutVaryPath: function() { + return finalizeLayoutVaryPath; + }, + finalizeMetadataVaryPath: function() { + return finalizeMetadataVaryPath; + }, + finalizePageVaryPath: function() { + return finalizePageVaryPath; + }, + getFulfilledRouteVaryPath: function() { + return getFulfilledRouteVaryPath; + }, + getRouteVaryPath: function() { + return getRouteVaryPath; + }, + getSegmentVaryPathForRequest: function() { + return getSegmentVaryPathForRequest; + } +}); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _cachemap = __turbopack_context__.r("[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/client/components/segment-cache/cache-map.js [app-ssr] (ecmascript)"); +const _segmentvalueencoding = __turbopack_context__.r("[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/shared/lib/segment-cache/segment-value-encoding.js [app-ssr] (ecmascript)"); +function getRouteVaryPath(pathname, search, nextUrl) { + // requestKey -> searchParams -> nextUrl + const varyPath = { + value: pathname, + parent: { + value: search, + parent: { + value: nextUrl, + parent: null + } + } + }; + return varyPath; +} +function getFulfilledRouteVaryPath(pathname, search, nextUrl, couldBeIntercepted) { + // This is called when a route's data is fulfilled. The cache entry will be + // re-keyed based on which inputs the response varies by. + // requestKey -> searchParams -> nextUrl + const varyPath = { + value: pathname, + parent: { + value: search, + parent: { + value: couldBeIntercepted ? nextUrl : _cachemap.Fallback, + parent: null + } + } + }; + return varyPath; +} +function appendLayoutVaryPath(parentPath, cacheKey) { + const varyPathPart = { + value: cacheKey, + parent: parentPath + }; + return varyPathPart; +} +function finalizeLayoutVaryPath(requestKey, varyPath) { + const layoutVaryPath = { + value: requestKey, + parent: varyPath + }; + return layoutVaryPath; +} +function finalizePageVaryPath(requestKey, renderedSearch, varyPath) { + // Unlike layouts, a page segment's vary path also includes the search string. + // requestKey -> searchParams -> pathParams + const pageVaryPath = { + value: requestKey, + parent: { + value: renderedSearch, + parent: varyPath + } + }; + return pageVaryPath; +} +function finalizeMetadataVaryPath(pageRequestKey, renderedSearch, varyPath) { + // The metadata "segment" is not a real segment because it doesn't exist in + // the normal structure of the route tree, but in terms of caching, it + // behaves like a page segment because it varies by all the same params as + // a page. + // + // To keep the protocol for querying the server simple, the request key for + // the metadata does not include any path information. It's unnecessary from + // the server's perspective, because unlike page segments, there's only one + // metadata response per URL, i.e. there's no need to distinguish multiple + // parallel pages. + // + // However, this means the metadata request key is insufficient for + // caching the the metadata in the client cache, because on the client we + // use the request key to distinguish the metadata entry from all other + // page's metadata entries. + // + // So instead we create a simulated request key based on the page segment. + // Conceptually this is equivalent to the request key the server would have + // assigned the metadata segment if it treated it as part of the actual + // route structure. + // If there are multiple parallel pages, we use whichever is the first one. + // This is fine because the only difference between request keys for + // different parallel pages are things like route groups and parallel + // route slots. As long as it's always the same one, it doesn't matter. + const pageVaryPath = { + // Append the actual metadata request key to the page request key. Note + // that we're not using a separate vary path part; it's unnecessary because + // these are not conceptually separate inputs. + value: pageRequestKey + _segmentvalueencoding.HEAD_REQUEST_KEY, + parent: { + value: renderedSearch, + parent: varyPath + } + }; + return pageVaryPath; +} +function getSegmentVaryPathForRequest(fetchStrategy, tree) { + // This is used for storing pending requests in the cache. We want to choose + // the most generic vary path based on the strategy used to fetch it, i.e. + // static/PPR versus runtime prefetching, so that it can be reused as much + // as possible. + // + // We may be able to re-key the response to something even more generic once + // we receive it — for example, if the server tells us that the response + // doesn't vary on a particular param — but even before we send the request, + // we know some params are reusable based on the fetch strategy alone. For + // example, a static prefetch will never vary on search params. + // + // The original vary path with all the params filled in is stored on the + // route tree object. We will clone this one to create a new vary path + // where certain params are replaced with Fallback. + // + // This result of this function is not stored anywhere. It's only used to + // access the cache a single time. + // + // TODO: Rather than create a new list object just to access the cache, the + // plan is to add the concept of a "vary mask". This will represent all the + // params that can be treated as Fallback. (Or perhaps the inverse.) + const originalVaryPath = tree.varyPath; + // Only page segments (and the special "metadata" segment, which is treated + // like a page segment for the purposes of caching) may contain search + // params. There's no reason to include them in the vary path otherwise. + if (tree.isPage) { + // Only a runtime prefetch will include search params in the vary path. + // Static prefetches never include search params, so they can be reused + // across all possible search param values. + const doesVaryOnSearchParams = fetchStrategy === _types.FetchStrategy.Full || fetchStrategy === _types.FetchStrategy.PPRRuntime; + if (!doesVaryOnSearchParams) { + // The response from the the server will not vary on search params. Clone + // the end of the original vary path to replace the search params + // with Fallback. + // + // requestKey -> searchParams -> pathParams + // ^ This part gets replaced with Fallback + const searchParamsVaryPath = originalVaryPath.parent; + const pathParamsVaryPath = searchParamsVaryPath.parent; + const patchedVaryPath = { + value: originalVaryPath.value, + parent: { + value: _cachemap.Fallback, + parent: pathParamsVaryPath + } + }; + return patchedVaryPath; + } + } + // The request does vary on search params. We don't need to modify anything. + return originalVaryPath; +} +function clonePageVaryPathWithNewSearchParams(originalVaryPath, newSearch) { + // requestKey -> searchParams -> pathParams + // ^ This part gets replaced with newSearch + const searchParamsVaryPath = originalVaryPath.parent; + const clonedVaryPath = { + value: originalVaryPath.value, + parent: { + value: newSearch, + parent: searchParamsVaryPath.parent + } + }; + return clonedVaryPath; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=vary-path.js.map +}), +"[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/shared/lib/page-path/ensure-leading-slash.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +/** + * For a given page path, this function ensures that there is a leading slash. + * If there is not a leading slash, one is added, otherwise it is noop. + */ Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "ensureLeadingSlash", { + enumerable: true, + get: function() { + return ensureLeadingSlash; + } +}); +function ensureLeadingSlash(path) { + return path.startsWith('/') ? path : `/${path}`; +} //# sourceMappingURL=ensure-leading-slash.js.map +}), +"[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/shared/lib/router/utils/app-paths.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + normalizeAppPath: null, + normalizeRscURL: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + normalizeAppPath: function() { + return normalizeAppPath; + }, + normalizeRscURL: function() { + return normalizeRscURL; + } +}); +const _ensureleadingslash = __turbopack_context__.r("[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/shared/lib/page-path/ensure-leading-slash.js [app-ssr] (ecmascript)"); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +function normalizeAppPath(route) { + return (0, _ensureleadingslash.ensureLeadingSlash)(route.split('/').reduce((pathname, segment, index, segments)=>{ + // Empty segments are ignored. + if (!segment) { + return pathname; + } + // Groups are ignored. + if ((0, _segment.isGroupSegment)(segment)) { + return pathname; + } + // Parallel segments are ignored. + if (segment[0] === '@') { + return pathname; + } + // The last segment (if it's a leaf) should be ignored. + if ((segment === 'page' || segment === 'route') && index === segments.length - 1) { + return pathname; + } + return `${pathname}/${segment}`; + }, '')); +} +function normalizeRscURL(url) { + return url.replace(/\.rsc($|\?)/, '$1'); +} //# sourceMappingURL=app-paths.js.map +}), +"[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/shared/lib/router/utils/interception-routes.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + INTERCEPTION_ROUTE_MARKERS: null, + extractInterceptionRouteInformation: null, + isInterceptionRouteAppPath: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + INTERCEPTION_ROUTE_MARKERS: function() { + return INTERCEPTION_ROUTE_MARKERS; + }, + extractInterceptionRouteInformation: function() { + return extractInterceptionRouteInformation; + }, + isInterceptionRouteAppPath: function() { + return isInterceptionRouteAppPath; + } +}); +const _apppaths = __turbopack_context__.r("[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/shared/lib/router/utils/app-paths.js [app-ssr] (ecmascript)"); +const INTERCEPTION_ROUTE_MARKERS = [ + '(..)(..)', + '(.)', + '(..)', + '(...)' +]; +function isInterceptionRouteAppPath(path) { + // TODO-APP: add more serious validation + return path.split('/').find((segment)=>INTERCEPTION_ROUTE_MARKERS.find((m)=>segment.startsWith(m))) !== undefined; +} +function extractInterceptionRouteInformation(path) { + let interceptingRoute; + let marker; + let interceptedRoute; + for (const segment of path.split('/')){ + marker = INTERCEPTION_ROUTE_MARKERS.find((m)=>segment.startsWith(m)); + if (marker) { + ; + [interceptingRoute, interceptedRoute] = path.split(marker, 2); + break; + } + } + if (!interceptingRoute || !marker || !interceptedRoute) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Must be in the format //(..|...|..)(..)/`), "__NEXT_ERROR_CODE", { + value: "E269", + enumerable: false, + configurable: true + }); + } + interceptingRoute = (0, _apppaths.normalizeAppPath)(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed + ; + switch(marker){ + case '(.)': + // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route + if (interceptingRoute === '/') { + interceptedRoute = `/${interceptedRoute}`; + } else { + interceptedRoute = interceptingRoute + '/' + interceptedRoute; + } + break; + case '(..)': + // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route + if (interceptingRoute === '/') { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`), "__NEXT_ERROR_CODE", { + value: "E207", + enumerable: false, + configurable: true + }); + } + interceptedRoute = interceptingRoute.split('/').slice(0, -1).concat(interceptedRoute).join('/'); + break; + case '(...)': + // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route + interceptedRoute = '/' + interceptedRoute; + break; + case '(..)(..)': + // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route + const splitInterceptingRoute = interceptingRoute.split('/'); + if (splitInterceptingRoute.length <= 2) { + throw Object.defineProperty(new Error(`Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`), "__NEXT_ERROR_CODE", { + value: "E486", + enumerable: false, + configurable: true + }); + } + interceptedRoute = splitInterceptingRoute.slice(0, -2).concat(interceptedRoute).join('/'); + break; + default: + throw Object.defineProperty(new Error('Invariant: unexpected marker'), "__NEXT_ERROR_CODE", { + value: "E112", + enumerable: false, + configurable: true + }); + } + return { + interceptingRoute, + interceptedRoute + }; +} //# sourceMappingURL=interception-routes.js.map +}), +"[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/client/components/router-reducer/compute-changed-path.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + computeChangedPath: null, + extractPathFromFlightRouterState: null, + getSelectedParams: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + computeChangedPath: function() { + return computeChangedPath; + }, + extractPathFromFlightRouterState: function() { + return extractPathFromFlightRouterState; + }, + getSelectedParams: function() { + return getSelectedParams; + } +}); +const _interceptionroutes = __turbopack_context__.r("[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/shared/lib/router/utils/interception-routes.js [app-ssr] (ecmascript)"); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _matchsegments = __turbopack_context__.r("[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/client/components/match-segments.js [app-ssr] (ecmascript)"); +const removeLeadingSlash = (segment)=>{ + return segment[0] === '/' ? segment.slice(1) : segment; +}; +const segmentToPathname = (segment)=>{ + if (typeof segment === 'string') { + // 'children' is not a valid path -- it's technically a parallel route that corresponds with the current segment's page + // if we don't skip it, then the computed pathname might be something like `/children` which doesn't make sense. + if (segment === 'children') return ''; + return segment; + } + return segment[1]; +}; +function normalizeSegments(segments) { + return segments.reduce((acc, segment)=>{ + segment = removeLeadingSlash(segment); + if (segment === '' || (0, _segment.isGroupSegment)(segment)) { + return acc; + } + return `${acc}/${segment}`; + }, '') || '/'; +} +function extractPathFromFlightRouterState(flightRouterState) { + const segment = Array.isArray(flightRouterState[0]) ? flightRouterState[0][1] : flightRouterState[0]; + if (segment === _segment.DEFAULT_SEGMENT_KEY || _interceptionroutes.INTERCEPTION_ROUTE_MARKERS.some((m)=>segment.startsWith(m))) return undefined; + if (segment.startsWith(_segment.PAGE_SEGMENT_KEY)) return ''; + const segments = [ + segmentToPathname(segment) + ]; + const parallelRoutes = flightRouterState[1] ?? {}; + const childrenPath = parallelRoutes.children ? extractPathFromFlightRouterState(parallelRoutes.children) : undefined; + if (childrenPath !== undefined) { + segments.push(childrenPath); + } else { + for (const [key, value] of Object.entries(parallelRoutes)){ + if (key === 'children') continue; + const childPath = extractPathFromFlightRouterState(value); + if (childPath !== undefined) { + segments.push(childPath); + } + } + } + return normalizeSegments(segments); +} +function computeChangedPathImpl(treeA, treeB) { + const [segmentA, parallelRoutesA] = treeA; + const [segmentB, parallelRoutesB] = treeB; + const normalizedSegmentA = segmentToPathname(segmentA); + const normalizedSegmentB = segmentToPathname(segmentB); + if (_interceptionroutes.INTERCEPTION_ROUTE_MARKERS.some((m)=>normalizedSegmentA.startsWith(m) || normalizedSegmentB.startsWith(m))) { + return ''; + } + if (!(0, _matchsegments.matchSegment)(segmentA, segmentB)) { + // once we find where the tree changed, we compute the rest of the path by traversing the tree + return extractPathFromFlightRouterState(treeB) ?? ''; + } + for(const parallelRouterKey in parallelRoutesA){ + if (parallelRoutesB[parallelRouterKey]) { + const changedPath = computeChangedPathImpl(parallelRoutesA[parallelRouterKey], parallelRoutesB[parallelRouterKey]); + if (changedPath !== null) { + return `${segmentToPathname(segmentB)}/${changedPath}`; + } + } + } + return null; +} +function computeChangedPath(treeA, treeB) { + const changedPath = computeChangedPathImpl(treeA, treeB); + if (changedPath == null || changedPath === '/') { + return changedPath; + } + // lightweight normalization to remove route groups + return normalizeSegments(changedPath.split('/')); +} +function getSelectedParams(currentTree, params = {}) { + const parallelRoutes = currentTree[1]; + for (const parallelRoute of Object.values(parallelRoutes)){ + const segment = parallelRoute[0]; + const isDynamicParameter = Array.isArray(segment); + const segmentValue = isDynamicParameter ? segment[1] : segment; + if (!segmentValue || segmentValue.startsWith(_segment.PAGE_SEGMENT_KEY)) continue; + // Ensure catchAll and optional catchall are turned into an array + const isCatchAll = isDynamicParameter && (segment[2] === 'c' || segment[2] === 'oc'); + if (isCatchAll) { + params[segment[0]] = segment[1].split('/'); + } else if (isDynamicParameter) { + params[segment[0]] = segment[1]; + } + params = getSelectedParams(parallelRoute, params); + } + return params; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=compute-changed-path.js.map +}), +"[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/client/components/router-reducer/handle-mutable.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "handleMutable", { + enumerable: true, + get: function() { + return handleMutable; + } +}); +const _computechangedpath = __turbopack_context__.r("[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/client/components/router-reducer/compute-changed-path.js [app-ssr] (ecmascript)"); +function isNotUndefined(value) { + return typeof value !== 'undefined'; +} +function handleMutable(state, mutable) { + // shouldScroll is true by default, can override to false. + const shouldScroll = mutable.shouldScroll ?? true; + let previousNextUrl = state.previousNextUrl; + let nextUrl = state.nextUrl; + if (isNotUndefined(mutable.patchedTree)) { + // If we received a patched tree, we need to compute the changed path. + const changedPath = (0, _computechangedpath.computeChangedPath)(state.tree, mutable.patchedTree); + if (changedPath) { + // If the tree changed, we need to update the nextUrl + previousNextUrl = nextUrl; + nextUrl = changedPath; + } else if (!nextUrl) { + // if the tree ends up being the same (ie, no changed path), and we don't have a nextUrl, then we should use the canonicalUrl + nextUrl = state.canonicalUrl; + } + // otherwise this will be a no-op and continue to use the existing nextUrl + } + return { + // Set href. + canonicalUrl: mutable.canonicalUrl ?? state.canonicalUrl, + renderedSearch: mutable.renderedSearch ?? state.renderedSearch, + pushRef: { + pendingPush: isNotUndefined(mutable.pendingPush) ? mutable.pendingPush : state.pushRef.pendingPush, + mpaNavigation: isNotUndefined(mutable.mpaNavigation) ? mutable.mpaNavigation : state.pushRef.mpaNavigation, + preserveCustomHistoryState: isNotUndefined(mutable.preserveCustomHistoryState) ? mutable.preserveCustomHistoryState : state.pushRef.preserveCustomHistoryState + }, + // All navigation requires scroll and focus management to trigger. + focusAndScrollRef: { + apply: shouldScroll ? isNotUndefined(mutable?.scrollableSegments) ? true : state.focusAndScrollRef.apply : false, + onlyHashChange: mutable.onlyHashChange || false, + hashFragment: shouldScroll ? mutable.hashFragment && mutable.hashFragment !== '' ? decodeURIComponent(mutable.hashFragment.slice(1)) : state.focusAndScrollRef.hashFragment : null, + segmentPaths: shouldScroll ? mutable?.scrollableSegments ?? state.focusAndScrollRef.segmentPaths : [] + }, + // Apply cache. + cache: mutable.cache ? mutable.cache : state.cache, + // Apply patched router state. + tree: isNotUndefined(mutable.patchedTree) ? mutable.patchedTree : state.tree, + nextUrl, + previousNextUrl: previousNextUrl, + debugInfo: mutable.collectedDebugInfo ?? null + }; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=handle-mutable.js.map +}), +"[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/client/components/router-reducer/create-router-cache-key.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "createRouterCacheKey", { + enumerable: true, + get: function() { + return createRouterCacheKey; + } +}); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +function createRouterCacheKey(segment, withoutSearchParameters = false) { + // if the segment is an array, it means it's a dynamic segment + // for example, ['lang', 'en', 'd']. We need to convert it to a string to store it as a cache node key. + if (Array.isArray(segment)) { + return `${segment[0]}|${segment[1]}|${segment[2]}`; + } + // Page segments might have search parameters, ie __PAGE__?foo=bar + // When `withoutSearchParameters` is true, we only want to return the page segment + if (withoutSearchParameters && segment.startsWith(_segment.PAGE_SEGMENT_KEY)) { + return _segment.PAGE_SEGMENT_KEY; + } + return segment; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=create-router-cache-key.js.map +}), +"[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/client/components/router-reducer/is-navigating-to-new-root-layout.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isNavigatingToNewRootLayout", { + enumerable: true, + get: function() { + return isNavigatingToNewRootLayout; + } +}); +function isNavigatingToNewRootLayout(currentTree, nextTree) { + // Compare segments + const currentTreeSegment = currentTree[0]; + const nextTreeSegment = nextTree[0]; + // If any segment is different before we find the root layout, the root layout has changed. + // E.g. /same/(group1)/layout.js -> /same/(group2)/layout.js + // First segment is 'same' for both, keep looking. (group1) changed to (group2) before the root layout was found, it must have changed. + if (Array.isArray(currentTreeSegment) && Array.isArray(nextTreeSegment)) { + // Compare dynamic param name and type but ignore the value, different values would not affect the current root layout + // /[name] - /slug1 and /slug2, both values (slug1 & slug2) still has the same layout /[name]/layout.js + if (currentTreeSegment[0] !== nextTreeSegment[0] || currentTreeSegment[2] !== nextTreeSegment[2]) { + return true; + } + } else if (currentTreeSegment !== nextTreeSegment) { + return true; + } + // Current tree root layout found + if (currentTree[4]) { + // If the next tree doesn't have the root layout flag, it must have changed. + return !nextTree[4]; + } + // Current tree didn't have its root layout here, must have changed. + if (nextTree[4]) { + return true; + } + // We can't assume it's `parallelRoutes.children` here in case the root layout is `app/@something/layout.js` + // But it's not possible to be more than one parallelRoutes before the root layout is found + // TODO-APP: change to traverse all parallel routes + const currentTreeChild = Object.values(currentTree[1])[0]; + const nextTreeChild = Object.values(nextTree[1])[0]; + if (!currentTreeChild || !nextTreeChild) return true; + return isNavigatingToNewRootLayout(currentTreeChild, nextTreeChild); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=is-navigating-to-new-root-layout.js.map +}), +"[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/client/components/router-reducer/ppr-navigations.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + abortTask: null, + listenForDynamicRequest: null, + startPPRNavigation: null, + updateCacheNodeOnPopstateRestoration: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + abortTask: function() { + return abortTask; + }, + listenForDynamicRequest: function() { + return listenForDynamicRequest; + }, + startPPRNavigation: function() { + return startPPRNavigation; + }, + updateCacheNodeOnPopstateRestoration: function() { + return updateCacheNodeOnPopstateRestoration; + } +}); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _matchsegments = __turbopack_context__.r("[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/client/components/match-segments.js [app-ssr] (ecmascript)"); +const _createhreffromurl = __turbopack_context__.r("[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)"); +const _createroutercachekey = __turbopack_context__.r("[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/client/components/router-reducer/create-router-cache-key.js [app-ssr] (ecmascript)"); +const _isnavigatingtonewrootlayout = __turbopack_context__.r("[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/client/components/router-reducer/is-navigating-to-new-root-layout.js [app-ssr] (ecmascript)"); +const _navigatereducer = __turbopack_context__.r("[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/client/components/router-reducer/reducers/navigate-reducer.js [app-ssr] (ecmascript)"); +const MPA_NAVIGATION_TASK = { + route: null, + node: null, + dynamicRequestTree: null, + children: null +}; +function startPPRNavigation(navigatedAt, oldUrl, oldCacheNode, oldRouterState, newRouterState, prefetchData, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, scrollableSegmentsResult) { + const segmentPath = []; + return updateCacheNodeOnNavigation(navigatedAt, oldUrl, oldCacheNode, oldRouterState, newRouterState, false, prefetchData, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, segmentPath, scrollableSegmentsResult); +} +function updateCacheNodeOnNavigation(navigatedAt, oldUrl, oldCacheNode, oldRouterState, newRouterState, didFindRootLayout, prefetchData, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, segmentPath, scrollableSegmentsResult) { + // Diff the old and new trees to reuse the shared layouts. + const oldRouterStateChildren = oldRouterState[1]; + const newRouterStateChildren = newRouterState[1]; + const prefetchDataChildren = prefetchData !== null ? prefetchData[1] : null; + if (!didFindRootLayout) { + // We're currently traversing the part of the tree that was also part of + // the previous route. If we discover a root layout, then we don't need to + // trigger an MPA navigation. See beginRenderingNewRouteTree for context. + const isRootLayout = newRouterState[4] === true; + if (isRootLayout) { + // Found a matching root layout. + didFindRootLayout = true; + } + } + const oldParallelRoutes = oldCacheNode.parallelRoutes; + // Clone the current set of segment children, even if they aren't active in + // the new tree. + // TODO: We currently retain all the inactive segments indefinitely, until + // there's an explicit refresh, or a parent layout is lazily refreshed. We + // rely on this for popstate navigations, which update the Router State Tree + // but do not eagerly perform a data fetch, because they expect the segment + // data to already be in the Cache Node tree. For highly static sites that + // are mostly read-only, this may happen only rarely, causing memory to + // leak. We should figure out a better model for the lifetime of inactive + // segments, so we can maintain instant back/forward navigations without + // leaking memory indefinitely. + const prefetchParallelRoutes = new Map(oldParallelRoutes); + // As we diff the trees, we may sometimes modify (copy-on-write, not mutate) + // the Route Tree that was returned by the server — for example, in the case + // of default parallel routes, we preserve the currently active segment. To + // avoid mutating the original tree, we clone the router state children along + // the return path. + let patchedRouterStateChildren = {}; + let taskChildren = null; + // Most navigations require a request to fetch additional data from the + // server, either because the data was not already prefetched, or because the + // target route contains dynamic data that cannot be prefetched. + // + // However, if the target route is fully static, and it's already completely + // loaded into the segment cache, then we can skip the server request. + // + // This starts off as `false`, and is set to `true` if any of the child + // routes requires a dynamic request. + let needsDynamicRequest = false; + // As we traverse the children, we'll construct a FlightRouterState that can + // be sent to the server to request the dynamic data. If it turns out that + // nothing in the subtree is dynamic (i.e. needsDynamicRequest is false at the + // end), then this will be discarded. + // TODO: We can probably optimize the format of this data structure to only + // include paths that are dynamic. Instead of reusing the + // FlightRouterState type. + let dynamicRequestTreeChildren = {}; + for(let parallelRouteKey in newRouterStateChildren){ + const newRouterStateChild = newRouterStateChildren[parallelRouteKey]; + const oldRouterStateChild = oldRouterStateChildren[parallelRouteKey]; + const oldSegmentMapChild = oldParallelRoutes.get(parallelRouteKey); + const prefetchDataChild = prefetchDataChildren !== null ? prefetchDataChildren[parallelRouteKey] : null; + const newSegmentChild = newRouterStateChild[0]; + const newSegmentPathChild = segmentPath.concat([ + parallelRouteKey, + newSegmentChild + ]); + const newSegmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(newSegmentChild); + const oldSegmentChild = oldRouterStateChild !== undefined ? oldRouterStateChild[0] : undefined; + const oldCacheNodeChild = oldSegmentMapChild !== undefined ? oldSegmentMapChild.get(newSegmentKeyChild) : undefined; + let taskChild; + if (newSegmentChild === _segment.DEFAULT_SEGMENT_KEY) { + // This is another kind of leaf segment — a default route. + // + // Default routes have special behavior. When there's no matching segment + // for a parallel route, Next.js preserves the currently active segment + // during a client navigation — but not for initial render. The server + // leaves it to the client to account for this. So we need to handle + // it here. + if (oldRouterStateChild !== undefined) { + // Reuse the existing Router State for this segment. We spawn a "task" + // just to keep track of the updated router state; unlike most, it's + // already fulfilled and won't be affected by the dynamic response. + taskChild = reuseActiveSegmentInDefaultSlot(oldUrl, oldRouterStateChild); + } else { + // There's no currently active segment. Switch to the "create" path. + taskChild = beginRenderingNewRouteTree(navigatedAt, oldRouterStateChild, newRouterStateChild, oldCacheNodeChild, didFindRootLayout, prefetchDataChild !== undefined ? prefetchDataChild : null, prefetchHead, isPrefetchHeadPartial, newSegmentPathChild, scrollableSegmentsResult); + } + } else if (isSamePageNavigation && // Check if this is a page segment. + // TODO: We're not consistent about how we do this check. Some places + // check if the segment starts with PAGE_SEGMENT_KEY, but most seem to + // check if there any any children, which is why I'm doing it here. We + // should probably encode an empty children set as `null` though. Either + // way, we should update all the checks to be consistent. + Object.keys(newRouterStateChild[1]).length === 0) { + // We special case navigations to the exact same URL as the current + // location. It's a common UI pattern for apps to refresh when you click a + // link to the current page. So when this happens, we refresh the dynamic + // data in the page segments. + // + // Note that this does not apply if the any part of the hash or search + // query has changed. This might feel a bit weird but it makes more sense + // when you consider that the way to trigger this behavior is to click + // the same link multiple times. + // + // TODO: We should probably refresh the *entire* route when this case + // occurs, not just the page segments. Essentially treating it the same as + // a refresh() triggered by an action, which is the more explicit way of + // modeling the UI pattern described above. + // + // Also note that this only refreshes the dynamic data, not static/ + // cached data. If the page segment is fully static and prefetched, the + // request is skipped. (This is also how refresh() works.) + taskChild = beginRenderingNewRouteTree(navigatedAt, oldRouterStateChild, newRouterStateChild, oldCacheNodeChild, didFindRootLayout, prefetchDataChild !== undefined ? prefetchDataChild : null, prefetchHead, isPrefetchHeadPartial, newSegmentPathChild, scrollableSegmentsResult); + } else if (oldRouterStateChild !== undefined && oldSegmentChild !== undefined && (0, _matchsegments.matchSegment)(newSegmentChild, oldSegmentChild)) { + if (oldCacheNodeChild !== undefined && oldRouterStateChild !== undefined) { + // This segment exists in both the old and new trees. Recursively update + // the children. + taskChild = updateCacheNodeOnNavigation(navigatedAt, oldUrl, oldCacheNodeChild, oldRouterStateChild, newRouterStateChild, didFindRootLayout, prefetchDataChild, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, newSegmentPathChild, scrollableSegmentsResult); + } else { + // There's no existing Cache Node for this segment. Switch to the + // "create" path. + taskChild = beginRenderingNewRouteTree(navigatedAt, oldRouterStateChild, newRouterStateChild, oldCacheNodeChild, didFindRootLayout, prefetchDataChild !== undefined ? prefetchDataChild : null, prefetchHead, isPrefetchHeadPartial, newSegmentPathChild, scrollableSegmentsResult); + } + } else { + // This is a new tree. Switch to the "create" path. + taskChild = beginRenderingNewRouteTree(navigatedAt, oldRouterStateChild, newRouterStateChild, oldCacheNodeChild, didFindRootLayout, prefetchDataChild !== undefined ? prefetchDataChild : null, prefetchHead, isPrefetchHeadPartial, newSegmentPathChild, scrollableSegmentsResult); + } + if (taskChild !== null) { + // Recursively propagate up the child tasks. + if (taskChild.route === null) { + // One of the child tasks discovered a change to the root layout. + // Immediately unwind from this recursive traversal. + return MPA_NAVIGATION_TASK; + } + if (taskChildren === null) { + taskChildren = new Map(); + } + taskChildren.set(parallelRouteKey, taskChild); + const newCacheNodeChild = taskChild.node; + if (newCacheNodeChild !== null) { + const newSegmentMapChild = new Map(oldSegmentMapChild); + newSegmentMapChild.set(newSegmentKeyChild, newCacheNodeChild); + prefetchParallelRoutes.set(parallelRouteKey, newSegmentMapChild); + } + // The child tree's route state may be different from the prefetched + // route sent by the server. We need to clone it as we traverse back up + // the tree. + const taskChildRoute = taskChild.route; + patchedRouterStateChildren[parallelRouteKey] = taskChildRoute; + const dynamicRequestTreeChild = taskChild.dynamicRequestTree; + if (dynamicRequestTreeChild !== null) { + // Something in the child tree is dynamic. + needsDynamicRequest = true; + dynamicRequestTreeChildren[parallelRouteKey] = dynamicRequestTreeChild; + } else { + dynamicRequestTreeChildren[parallelRouteKey] = taskChildRoute; + } + } else { + // The child didn't change. We can use the prefetched router state. + patchedRouterStateChildren[parallelRouteKey] = newRouterStateChild; + dynamicRequestTreeChildren[parallelRouteKey] = newRouterStateChild; + } + } + if (taskChildren === null) { + // No new tasks were spawned. + return null; + } + const newCacheNode = { + lazyData: null, + rsc: oldCacheNode.rsc, + // We intentionally aren't updating the prefetchRsc field, since this node + // is already part of the current tree, because it would be weird for + // prefetch data to be newer than the final data. It probably won't ever be + // observable anyway, but it could happen if the segment is unmounted then + // mounted again, because LayoutRouter will momentarily switch to rendering + // prefetchRsc, via useDeferredValue. + prefetchRsc: oldCacheNode.prefetchRsc, + head: oldCacheNode.head, + prefetchHead: oldCacheNode.prefetchHead, + loading: oldCacheNode.loading, + // Everything is cloned except for the children, which we computed above. + parallelRoutes: prefetchParallelRoutes, + navigatedAt + }; + return { + // Return a cloned copy of the router state with updated children. + route: patchRouterStateWithNewChildren(newRouterState, patchedRouterStateChildren), + node: newCacheNode, + dynamicRequestTree: needsDynamicRequest ? patchRouterStateWithNewChildren(newRouterState, dynamicRequestTreeChildren) : null, + children: taskChildren + }; +} +function beginRenderingNewRouteTree(navigatedAt, oldRouterState, newRouterState, existingCacheNode, didFindRootLayout, prefetchData, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult) { + if (!didFindRootLayout) { + // The route tree changed before we reached a layout. (The highest-level + // layout in a route tree is referred to as the "root" layout.) This could + // mean that we're navigating between two different root layouts. When this + // happens, we perform a full-page (MPA-style) navigation. + // + // However, the algorithm for deciding where to start rendering a route + // (i.e. the one performed in order to reach this function) is stricter + // than the one used to detect a change in the root layout. So just because + // we're re-rendering a segment outside of the root layout does not mean we + // should trigger a full-page navigation. + // + // Specifically, we handle dynamic parameters differently: two segments are + // considered the same even if their parameter values are different. + // + // Refer to isNavigatingToNewRootLayout for details. + // + // Note that we only have to perform this extra traversal if we didn't + // already discover a root layout in the part of the tree that is unchanged. + // In the common case, this branch is skipped completely. + if (oldRouterState === undefined || (0, _isnavigatingtonewrootlayout.isNavigatingToNewRootLayout)(oldRouterState, newRouterState)) { + // The root layout changed. Perform a full-page navigation. + return MPA_NAVIGATION_TASK; + } + } + return createCacheNodeOnNavigation(navigatedAt, newRouterState, existingCacheNode, prefetchData, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult); +} +function createCacheNodeOnNavigation(navigatedAt, routerState, existingCacheNode, prefetchData, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult) { + // Same traversal as updateCacheNodeNavigation, but we switch to this path + // once we reach the part of the tree that was not in the previous route. We + // don't need to diff against the old tree, we just need to create a new one. + // The head is assigned to every leaf segment delivered by the server. Based + // on corresponding logic in fill-lazy-items-till-leaf-with-head.ts + const routerStateChildren = routerState[1]; + const isLeafSegment = Object.keys(routerStateChildren).length === 0; + // Even we're rendering inside the "new" part of the target tree, we may have + // a locally cached segment that we can reuse. This may come from either 1) + // the CacheNode tree, which lives in React state and is populated by previous + // navigations; or 2) the prefetch cache, which is a separate cache that is + // populated by prefetches. + let rsc; + let loading; + let head; + let cacheNodeNavigatedAt; + if (existingCacheNode !== undefined && // DYNAMIC_STALETIME_MS defaults to 0, but it can be increased using + // the experimental.staleTimes.dynamic config. When set, we'll avoid + // refetching dynamic data if it was fetched within the given threshold. + existingCacheNode.navigatedAt + _navigatereducer.DYNAMIC_STALETIME_MS > navigatedAt) { + // We have an existing CacheNode for this segment, and it's not stale. We + // should reuse it rather than request a new one. + rsc = existingCacheNode.rsc; + loading = existingCacheNode.loading; + head = existingCacheNode.head; + // Don't update the navigatedAt timestamp, since we're reusing stale data. + cacheNodeNavigatedAt = existingCacheNode.navigatedAt; + } else if (prefetchData !== null) { + // There's no existing CacheNode for this segment, but we do have prefetch + // data. If the prefetch data is fully static (i.e. does not contain any + // dynamic holes), we don't need to request it from the server. + rsc = prefetchData[0]; + loading = prefetchData[2]; + head = isLeafSegment ? possiblyPartialPrefetchHead : null; + // Even though we're accessing the data from the prefetch cache, this is + // conceptually a new segment, not a reused one. So we should update the + // navigatedAt timestamp. + cacheNodeNavigatedAt = navigatedAt; + const isPrefetchRscPartial = prefetchData[3]; + if (isPrefetchRscPartial || // Check if the head is partial (only relevant if this is a leaf segment) + isPrefetchHeadPartial && isLeafSegment) { + // We only have partial data from this segment. Like missing segments, we + // must request the full data from the server. + return spawnPendingTask(navigatedAt, routerState, prefetchData, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult); + } else { + // The prefetch data is fully static, so we can omit it from the + // navigation request. + } + } else { + // There's no prefetch for this segment. Everything from this point will be + // requested from the server, even if there are static children below it. + // Create a terminal task node that will later be fulfilled by + // server response. + return spawnPendingTask(navigatedAt, routerState, null, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult); + } + // We already have a full segment we can render, so we don't need to request a + // new one from the server. Keep traversing down the tree until we reach + // something that requires a dynamic request. + const prefetchDataChildren = prefetchData !== null ? prefetchData[1] : null; + const taskChildren = new Map(); + const existingCacheNodeChildren = existingCacheNode !== undefined ? existingCacheNode.parallelRoutes : null; + const cacheNodeChildren = new Map(existingCacheNodeChildren); + let dynamicRequestTreeChildren = {}; + let needsDynamicRequest = false; + if (isLeafSegment) { + // The segment path of every leaf segment (i.e. page) is collected into + // a result array. This is used by the LayoutRouter to scroll to ensure that + // new pages are visible after a navigation. + // TODO: We should use a string to represent the segment path instead of + // an array. We already use a string representation for the path when + // accessing the Segment Cache, so we can use the same one. + scrollableSegmentsResult.push(segmentPath); + } else { + for(let parallelRouteKey in routerStateChildren){ + const routerStateChild = routerStateChildren[parallelRouteKey]; + const prefetchDataChild = prefetchDataChildren !== null ? prefetchDataChildren[parallelRouteKey] : null; + const existingSegmentMapChild = existingCacheNodeChildren !== null ? existingCacheNodeChildren.get(parallelRouteKey) : undefined; + const segmentChild = routerStateChild[0]; + const segmentPathChild = segmentPath.concat([ + parallelRouteKey, + segmentChild + ]); + const segmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(segmentChild); + const existingCacheNodeChild = existingSegmentMapChild !== undefined ? existingSegmentMapChild.get(segmentKeyChild) : undefined; + const taskChild = createCacheNodeOnNavigation(navigatedAt, routerStateChild, existingCacheNodeChild, prefetchDataChild, possiblyPartialPrefetchHead, isPrefetchHeadPartial, segmentPathChild, scrollableSegmentsResult); + taskChildren.set(parallelRouteKey, taskChild); + const dynamicRequestTreeChild = taskChild.dynamicRequestTree; + if (dynamicRequestTreeChild !== null) { + // Something in the child tree is dynamic. + needsDynamicRequest = true; + dynamicRequestTreeChildren[parallelRouteKey] = dynamicRequestTreeChild; + } else { + dynamicRequestTreeChildren[parallelRouteKey] = routerStateChild; + } + const newCacheNodeChild = taskChild.node; + if (newCacheNodeChild !== null) { + const newSegmentMapChild = new Map(); + newSegmentMapChild.set(segmentKeyChild, newCacheNodeChild); + cacheNodeChildren.set(parallelRouteKey, newSegmentMapChild); + } + } + } + return { + // Since we're inside a new route tree, unlike the + // `updateCacheNodeOnNavigation` path, the router state on the children + // tasks is always the same as the router state we pass in. So we don't need + // to clone/modify it. + route: routerState, + node: { + lazyData: null, + // Since this segment is already full, we don't need to use the + // `prefetchRsc` field. + rsc, + prefetchRsc: null, + head, + prefetchHead: null, + loading, + parallelRoutes: cacheNodeChildren, + navigatedAt: cacheNodeNavigatedAt + }, + dynamicRequestTree: needsDynamicRequest ? patchRouterStateWithNewChildren(routerState, dynamicRequestTreeChildren) : null, + children: taskChildren + }; +} +function patchRouterStateWithNewChildren(baseRouterState, newChildren) { + const clone = [ + baseRouterState[0], + newChildren + ]; + // Based on equivalent logic in apply-router-state-patch-to-tree, but should + // confirm whether we need to copy all of these fields. Not sure the server + // ever sends, e.g. the refetch marker. + if (2 in baseRouterState) { + clone[2] = baseRouterState[2]; + } + if (3 in baseRouterState) { + clone[3] = baseRouterState[3]; + } + if (4 in baseRouterState) { + clone[4] = baseRouterState[4]; + } + return clone; +} +function spawnPendingTask(navigatedAt, routerState, prefetchData, prefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult) { + // Create a task that will later be fulfilled by data from the server. + // Clone the prefetched route tree and the `refetch` marker to it. We'll send + // this to the server so it knows where to start rendering. + const dynamicRequestTree = patchRouterStateWithNewChildren(routerState, routerState[1]); + dynamicRequestTree[3] = 'refetch'; + const newTask = { + route: routerState, + // Corresponds to the part of the route that will be rendered on the server. + node: createPendingCacheNode(navigatedAt, routerState, prefetchData, prefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult), + // Because this is non-null, and it gets propagated up through the parent + // tasks, the root task will know that it needs to perform a server request. + dynamicRequestTree, + children: null + }; + return newTask; +} +function reuseActiveSegmentInDefaultSlot(oldUrl, oldRouterState) { + // This is a "default" segment. These are never sent by the server during a + // soft navigation; instead, the client reuses whatever segment was already + // active in that slot on the previous route. This means if we later need to + // refresh the segment, it will have to be refetched from the previous route's + // URL. We store it in the Flight Router State. + // + // TODO: We also mark the segment with a "refresh" marker but I think we can + // get rid of that eventually by making sure we only add URLs to page segments + // that are reused. Then the presence of the URL alone is enough. + let reusedRouterState; + const oldRefreshMarker = oldRouterState[3]; + if (oldRefreshMarker === 'refresh') { + // This segment was already reused from an even older route. Keep its + // existing URL and refresh marker. + reusedRouterState = oldRouterState; + } else { + // This segment was not previously reused, and it's not on the new route. + // So it must have been delivered in the old route. + reusedRouterState = patchRouterStateWithNewChildren(oldRouterState, oldRouterState[1]); + reusedRouterState[2] = (0, _createhreffromurl.createHrefFromUrl)(oldUrl); + reusedRouterState[3] = 'refresh'; + } + return { + route: reusedRouterState, + node: null, + dynamicRequestTree: null, + children: null + }; +} +function listenForDynamicRequest(task, responsePromise) { + responsePromise.then((result)=>{ + if (typeof result === 'string') { + // Happens when navigating to page in `pages` from `app`. We shouldn't + // get here because should have already handled this during + // the prefetch. + return; + } + const { flightData, debugInfo } = result; + for (const normalizedFlightData of flightData){ + const { segmentPath, tree: serverRouterState, seedData: dynamicData, head: dynamicHead } = normalizedFlightData; + if (!dynamicData) { + continue; + } + writeDynamicDataIntoPendingTask(task, segmentPath, serverRouterState, dynamicData, dynamicHead, debugInfo); + } + // Now that we've exhausted all the data we received from the server, if + // there are any remaining pending tasks in the tree, abort them now. + // If there's any missing data, it will trigger a lazy fetch. + abortTask(task, null, debugInfo); + }, (error)=>{ + // This will trigger an error during render + abortTask(task, error, null); + }); +} +function writeDynamicDataIntoPendingTask(rootTask, segmentPath, serverRouterState, dynamicData, dynamicHead, debugInfo) { + // The data sent by the server represents only a subtree of the app. We need + // to find the part of the task tree that matches the server response, and + // fulfill it using the dynamic data. + // + // segmentPath represents the parent path of subtree. It's a repeating pattern + // of parallel route key and segment: + // + // [string, Segment, string, Segment, string, Segment, ...] + // + // Iterate through the path and finish any tasks that match this payload. + let task = rootTask; + for(let i = 0; i < segmentPath.length; i += 2){ + const parallelRouteKey = segmentPath[i]; + const segment = segmentPath[i + 1]; + const taskChildren = task.children; + if (taskChildren !== null) { + const taskChild = taskChildren.get(parallelRouteKey); + if (taskChild !== undefined) { + const taskSegment = taskChild.route[0]; + if ((0, _matchsegments.matchSegment)(segment, taskSegment)) { + // Found a match for this task. Keep traversing down the task tree. + task = taskChild; + continue; + } + } + } + // We didn't find a child task that matches the server data. Exit. We won't + // abort the task, though, because a different FlightDataPath may be able to + // fulfill it (see loop in listenForDynamicRequest). We only abort tasks + // once we've run out of data. + return; + } + finishTaskUsingDynamicDataPayload(task, serverRouterState, dynamicData, dynamicHead, debugInfo); +} +function finishTaskUsingDynamicDataPayload(task, serverRouterState, dynamicData, dynamicHead, debugInfo) { + if (task.dynamicRequestTree === null) { + // Everything in this subtree is already complete. Bail out. + return; + } + // dynamicData may represent a larger subtree than the task. Before we can + // finish the task, we need to line them up. + const taskChildren = task.children; + const taskNode = task.node; + if (taskChildren === null) { + // We've reached the leaf node of the pending task. The server data tree + // lines up the pending Cache Node tree. We can now switch to the + // normal algorithm. + if (taskNode !== null) { + finishPendingCacheNode(taskNode, task.route, serverRouterState, dynamicData, dynamicHead, debugInfo); + // Set this to null to indicate that this task is now complete. + task.dynamicRequestTree = null; + } + return; + } + // The server returned more data than we need to finish the task. Skip over + // the extra segments until we reach the leaf task node. + const serverChildren = serverRouterState[1]; + const dynamicDataChildren = dynamicData[1]; + for(const parallelRouteKey in serverRouterState){ + const serverRouterStateChild = serverChildren[parallelRouteKey]; + const dynamicDataChild = dynamicDataChildren[parallelRouteKey]; + const taskChild = taskChildren.get(parallelRouteKey); + if (taskChild !== undefined) { + const taskSegment = taskChild.route[0]; + if ((0, _matchsegments.matchSegment)(serverRouterStateChild[0], taskSegment) && dynamicDataChild !== null && dynamicDataChild !== undefined) { + // Found a match for this task. Keep traversing down the task tree. + return finishTaskUsingDynamicDataPayload(taskChild, serverRouterStateChild, dynamicDataChild, dynamicHead, debugInfo); + } + } + // We didn't find a child task that matches the server data. We won't abort + // the task, though, because a different FlightDataPath may be able to + // fulfill it (see loop in listenForDynamicRequest). We only abort tasks + // once we've run out of data. + } +} +function createPendingCacheNode(navigatedAt, routerState, prefetchData, prefetchHead, isPrefetchHeadPartial, segmentPath, scrollableSegmentsResult) { + const routerStateChildren = routerState[1]; + const prefetchDataChildren = prefetchData !== null ? prefetchData[1] : null; + const parallelRoutes = new Map(); + for(let parallelRouteKey in routerStateChildren){ + const routerStateChild = routerStateChildren[parallelRouteKey]; + const prefetchDataChild = prefetchDataChildren !== null ? prefetchDataChildren[parallelRouteKey] : null; + const segmentChild = routerStateChild[0]; + const segmentPathChild = segmentPath.concat([ + parallelRouteKey, + segmentChild + ]); + const segmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(segmentChild); + const newCacheNodeChild = createPendingCacheNode(navigatedAt, routerStateChild, prefetchDataChild === undefined ? null : prefetchDataChild, prefetchHead, isPrefetchHeadPartial, segmentPathChild, scrollableSegmentsResult); + const newSegmentMapChild = new Map(); + newSegmentMapChild.set(segmentKeyChild, newCacheNodeChild); + parallelRoutes.set(parallelRouteKey, newSegmentMapChild); + } + // The head is assigned to every leaf segment delivered by the server. Based + // on corresponding logic in fill-lazy-items-till-leaf-with-head.ts + const isLeafSegment = parallelRoutes.size === 0; + if (isLeafSegment) { + // The segment path of every leaf segment (i.e. page) is collected into + // a result array. This is used by the LayoutRouter to scroll to ensure that + // new pages are visible after a navigation. + // TODO: We should use a string to represent the segment path instead of + // an array. We already use a string representation for the path when + // accessing the Segment Cache, so we can use the same one. + scrollableSegmentsResult.push(segmentPath); + } + const maybePrefetchRsc = prefetchData !== null ? prefetchData[0] : null; + return { + lazyData: null, + parallelRoutes: parallelRoutes, + prefetchRsc: maybePrefetchRsc !== undefined ? maybePrefetchRsc : null, + prefetchHead: isLeafSegment ? prefetchHead : [ + null, + null + ], + // Create a deferred promise. This will be fulfilled once the dynamic + // response is received from the server. + rsc: createDeferredRsc(), + head: isLeafSegment ? createDeferredRsc() : null, + // TODO: Technically, a loading boundary could contain dynamic data. We must + // have separate `loading` and `prefetchLoading` fields to handle this, like + // we do for the segment data and head. + loading: prefetchData !== null ? prefetchData[2] ?? null : createDeferredRsc(), + navigatedAt + }; +} +function finishPendingCacheNode(cacheNode, taskState, serverState, dynamicData, dynamicHead, debugInfo) { + // Writes a dynamic response into an existing Cache Node tree. This does _not_ + // create a new tree, it updates the existing tree in-place. So it must follow + // the Suspense rules of cache safety — it can resolve pending promises, but + // it cannot overwrite existing data. It can add segments to the tree (because + // a missing segment will cause the layout router to suspend). + // but it cannot delete them. + // + // We must resolve every promise in the tree, or else it will suspend + // indefinitely. If we did not receive data for a segment, we will resolve its + // data promise to `null` to trigger a lazy fetch during render. + const taskStateChildren = taskState[1]; + const serverStateChildren = serverState[1]; + const dataChildren = dynamicData[1]; + // The router state that we traverse the tree with (taskState) is the same one + // that we used to construct the pending Cache Node tree. That way we're sure + // to resolve all the pending promises. + const parallelRoutes = cacheNode.parallelRoutes; + for(let parallelRouteKey in taskStateChildren){ + const taskStateChild = taskStateChildren[parallelRouteKey]; + const serverStateChild = serverStateChildren[parallelRouteKey]; + const dataChild = dataChildren[parallelRouteKey]; + const segmentMapChild = parallelRoutes.get(parallelRouteKey); + const taskSegmentChild = taskStateChild[0]; + const taskSegmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(taskSegmentChild); + const cacheNodeChild = segmentMapChild !== undefined ? segmentMapChild.get(taskSegmentKeyChild) : undefined; + if (cacheNodeChild !== undefined) { + if (serverStateChild !== undefined && (0, _matchsegments.matchSegment)(taskSegmentChild, serverStateChild[0])) { + if (dataChild !== undefined && dataChild !== null) { + // This is the happy path. Recursively update all the children. + finishPendingCacheNode(cacheNodeChild, taskStateChild, serverStateChild, dataChild, dynamicHead, debugInfo); + } else { + // The server never returned data for this segment. Trigger a lazy + // fetch during render. This shouldn't happen because the Route Tree + // and the Seed Data tree sent by the server should always be the same + // shape when part of the same server response. + abortPendingCacheNode(taskStateChild, cacheNodeChild, null, debugInfo); + } + } else { + // The server never returned data for this segment. Trigger a lazy + // fetch during render. + abortPendingCacheNode(taskStateChild, cacheNodeChild, null, debugInfo); + } + } else { + // The server response matches what was expected to receive, but there's + // no matching Cache Node in the task tree. This is a bug in the + // implementation because we should have created a node for every + // segment in the tree that's associated with this task. + } + } + // Use the dynamic data from the server to fulfill the deferred RSC promise + // on the Cache Node. + const rsc = cacheNode.rsc; + const dynamicSegmentData = dynamicData[0]; + if (rsc === null) { + // This is a lazy cache node. We can overwrite it. This is only safe + // because we know that the LayoutRouter suspends if `rsc` is `null`. + cacheNode.rsc = dynamicSegmentData; + } else if (isDeferredRsc(rsc)) { + // This is a deferred RSC promise. We can fulfill it with the data we just + // received from the server. If it was already resolved by a different + // navigation, then this does nothing because we can't overwrite data. + rsc.resolve(dynamicSegmentData, debugInfo); + } else { + // This is not a deferred RSC promise, nor is it empty, so it must have + // been populated by a different navigation. We must not overwrite it. + } + // If we navigated without a prefetch, then `loading` will be a deferred promise too. + // Fulfill it using the dynamic response so that we can display the loading boundary. + const loading = cacheNode.loading; + if (isDeferredRsc(loading)) { + const dynamicLoading = dynamicData[2]; + loading.resolve(dynamicLoading, debugInfo); + } + // Check if this is a leaf segment. If so, it will have a `head` property with + // a pending promise that needs to be resolved with the dynamic head from + // the server. + const head = cacheNode.head; + if (isDeferredRsc(head)) { + head.resolve(dynamicHead, debugInfo); + } +} +function abortTask(task, error, debugInfo) { + const cacheNode = task.node; + if (cacheNode === null) { + // This indicates the task is already complete. + return; + } + const taskChildren = task.children; + if (taskChildren === null) { + // Reached the leaf task node. This is the root of a pending cache + // node tree. + abortPendingCacheNode(task.route, cacheNode, error, debugInfo); + } else { + // This is an intermediate task node. Keep traversing until we reach a + // task node with no children. That will be the root of the cache node tree + // that needs to be resolved. + for (const taskChild of taskChildren.values()){ + abortTask(taskChild, error, debugInfo); + } + } + // Set this to null to indicate that this task is now complete. + task.dynamicRequestTree = null; +} +function abortPendingCacheNode(routerState, cacheNode, error, debugInfo) { + // For every pending segment in the tree, resolve its `rsc` promise to `null` + // to trigger a lazy fetch during render. + // + // Or, if an error object is provided, it will error instead. + const routerStateChildren = routerState[1]; + const parallelRoutes = cacheNode.parallelRoutes; + for(let parallelRouteKey in routerStateChildren){ + const routerStateChild = routerStateChildren[parallelRouteKey]; + const segmentMapChild = parallelRoutes.get(parallelRouteKey); + if (segmentMapChild === undefined) { + continue; + } + const segmentChild = routerStateChild[0]; + const segmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(segmentChild); + const cacheNodeChild = segmentMapChild.get(segmentKeyChild); + if (cacheNodeChild !== undefined) { + abortPendingCacheNode(routerStateChild, cacheNodeChild, error, debugInfo); + } else { + // This shouldn't happen because we're traversing the same tree that was + // used to construct the cache nodes in the first place. + } + } + const rsc = cacheNode.rsc; + if (isDeferredRsc(rsc)) { + if (error === null) { + // This will trigger a lazy fetch during render. + rsc.resolve(null, debugInfo); + } else { + // This will trigger an error during rendering. + rsc.reject(error, debugInfo); + } + } + const loading = cacheNode.loading; + if (isDeferredRsc(loading)) { + loading.resolve(null, debugInfo); + } + // Check if this is a leaf segment. If so, it will have a `head` property with + // a pending promise that needs to be resolved. If an error was provided, we + // will not resolve it with an error, since this is rendered at the root of + // the app. We want the segment to error, not the entire app. + const head = cacheNode.head; + if (isDeferredRsc(head)) { + head.resolve(null, debugInfo); + } +} +function updateCacheNodeOnPopstateRestoration(oldCacheNode, routerState) { + // A popstate navigation reads data from the local cache. It does not issue + // new network requests (unless the cache entries have been evicted). So, we + // update the cache to drop the prefetch data for any segment whose dynamic + // data was already received. This prevents an unnecessary flash back to PPR + // state during a back/forward navigation. + // + // This function clones the entire cache node tree and sets the `prefetchRsc` + // field to `null` to prevent it from being rendered. We can't mutate the node + // in place because this is a concurrent data structure. + const routerStateChildren = routerState[1]; + const oldParallelRoutes = oldCacheNode.parallelRoutes; + const newParallelRoutes = new Map(oldParallelRoutes); + for(let parallelRouteKey in routerStateChildren){ + const routerStateChild = routerStateChildren[parallelRouteKey]; + const segmentChild = routerStateChild[0]; + const segmentKeyChild = (0, _createroutercachekey.createRouterCacheKey)(segmentChild); + const oldSegmentMapChild = oldParallelRoutes.get(parallelRouteKey); + if (oldSegmentMapChild !== undefined) { + const oldCacheNodeChild = oldSegmentMapChild.get(segmentKeyChild); + if (oldCacheNodeChild !== undefined) { + const newCacheNodeChild = updateCacheNodeOnPopstateRestoration(oldCacheNodeChild, routerStateChild); + const newSegmentMapChild = new Map(oldSegmentMapChild); + newSegmentMapChild.set(segmentKeyChild, newCacheNodeChild); + newParallelRoutes.set(parallelRouteKey, newSegmentMapChild); + } + } + } + // Only show prefetched data if the dynamic data is still pending. + // + // Tehnically, what we're actually checking is whether the dynamic network + // response was received. But since it's a streaming response, this does not + // mean that all the dynamic data has fully streamed in. It just means that + // _some_ of the dynamic data was received. But as a heuristic, we assume that + // the rest dynamic data will stream in quickly, so it's still better to skip + // the prefetch state. + const rsc = oldCacheNode.rsc; + const shouldUsePrefetch = isDeferredRsc(rsc) && rsc.status === 'pending'; + return { + lazyData: null, + rsc, + head: oldCacheNode.head, + prefetchHead: shouldUsePrefetch ? oldCacheNode.prefetchHead : [ + null, + null + ], + prefetchRsc: shouldUsePrefetch ? oldCacheNode.prefetchRsc : null, + loading: oldCacheNode.loading, + // These are the cloned children we computed above + parallelRoutes: newParallelRoutes, + navigatedAt: oldCacheNode.navigatedAt + }; +} +const DEFERRED = Symbol(); +// This type exists to distinguish a DeferredRsc from a Flight promise. It's a +// compromise to avoid adding an extra field on every Cache Node, which would be +// awkward because the pre-PPR parts of codebase would need to account for it, +// too. We can remove it once type Cache Node type is more settled. +function isDeferredRsc(value) { + return value && typeof value === 'object' && value.tag === DEFERRED; +} +function createDeferredRsc() { + // Create an unresolved promise that represents data derived from a Flight + // response. The promise will be resolved later as soon as we start receiving + // data from the server, i.e. as soon as the Flight client decodes and returns + // the top-level response object. + // The `_debugInfo` field contains profiling information. Promises that are + // created by Flight already have this info added by React; for any derived + // promise created by the router, we need to transfer the Flight debug info + // onto the derived promise. + // + // The debug info represents the latency between the start of the navigation + // and the start of rendering. (It does not represent the time it takes for + // whole stream to finish.) + const debugInfo = []; + let resolve; + let reject; + const pendingRsc = new Promise((res, rej)=>{ + resolve = res; + reject = rej; + }); + pendingRsc.status = 'pending'; + pendingRsc.resolve = (value, responseDebugInfo)=>{ + if (pendingRsc.status === 'pending') { + const fulfilledRsc = pendingRsc; + fulfilledRsc.status = 'fulfilled'; + fulfilledRsc.value = value; + if (responseDebugInfo !== null) { + // Transfer the debug info to the derived promise. + debugInfo.push.apply(debugInfo, responseDebugInfo); + } + resolve(value); + } + }; + pendingRsc.reject = (error, responseDebugInfo)=>{ + if (pendingRsc.status === 'pending') { + const rejectedRsc = pendingRsc; + rejectedRsc.status = 'rejected'; + rejectedRsc.reason = error; + if (responseDebugInfo !== null) { + // Transfer the debug info to the derived promise. + debugInfo.push.apply(debugInfo, responseDebugInfo); + } + reject(error); + } + }; + pendingRsc.tag = DEFERRED; + pendingRsc._debugInfo = debugInfo; + return pendingRsc; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=ppr-navigations.js.map +}), +"[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/client/components/segment-cache/navigation.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "navigate", { + enumerable: true, + get: function() { + return navigate; + } +}); +const _fetchserverresponse = __turbopack_context__.r("[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/client/components/router-reducer/fetch-server-response.js [app-ssr] (ecmascript)"); +const _pprnavigations = __turbopack_context__.r("[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/client/components/router-reducer/ppr-navigations.js [app-ssr] (ecmascript)"); +const _createhreffromurl = __turbopack_context__.r("[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)"); +const _cache = __turbopack_context__.r("[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/client/components/segment-cache/cache.js [app-ssr] (ecmascript)"); +const _cachekey = __turbopack_context__.r("[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/client/components/segment-cache/cache-key.js [app-ssr] (ecmascript)"); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +function navigate(url, currentUrl, currentCacheNode, currentFlightRouterState, nextUrl, shouldScroll, accumulation) { + const now = Date.now(); + const href = url.href; + // We special case navigations to the exact same URL as the current location. + // It's a common UI pattern for apps to refresh when you click a link to the + // current page. So when this happens, we refresh the dynamic data in the page + // segments. + // + // Note that this does not apply if the any part of the hash or search query + // has changed. This might feel a bit weird but it makes more sense when you + // consider that the way to trigger this behavior is to click the same link + // multiple times. + // + // TODO: We should probably refresh the *entire* route when this case occurs, + // not just the page segments. Essentially treating it the same as a refresh() + // triggered by an action, which is the more explicit way of modeling the UI + // pattern described above. + // + // Also note that this only refreshes the dynamic data, not static/ cached + // data. If the page segment is fully static and prefetched, the request is + // skipped. (This is also how refresh() works.) + const isSamePageNavigation = // consider storing the current URL in the router state instead of reading + // from the location object. In practice I don't think this matters much + // since we keep them in sync anyway, but having two sources of truth can + // lead to subtle bugs and race conditions. + href === window.location.href; + const cacheKey = (0, _cachekey.createCacheKey)(href, nextUrl); + const route = (0, _cache.readRouteCacheEntry)(now, cacheKey); + if (route !== null && route.status === _cache.EntryStatus.Fulfilled) { + // We have a matching prefetch. + const snapshot = readRenderSnapshotFromCache(now, route, route.tree); + const prefetchFlightRouterState = snapshot.flightRouterState; + const prefetchSeedData = snapshot.seedData; + const headSnapshot = readHeadSnapshotFromCache(now, route); + const prefetchHead = headSnapshot.rsc; + const isPrefetchHeadPartial = headSnapshot.isPartial; + // TODO: The "canonicalUrl" stored in the cache doesn't include the hash, + // because hash entries do not vary by hash fragment. However, the one + // we set in the router state *does* include the hash, and it's used to + // sync with the actual browser location. To make this less of a refactor + // hazard, we should always track the hash separately from the rest of + // the URL. + const newCanonicalUrl = route.canonicalUrl + url.hash; + const renderedSearch = route.renderedSearch; + return navigateUsingPrefetchedRouteTree(now, url, currentUrl, nextUrl, isSamePageNavigation, currentCacheNode, currentFlightRouterState, prefetchFlightRouterState, prefetchSeedData, prefetchHead, isPrefetchHeadPartial, newCanonicalUrl, renderedSearch, shouldScroll, url.hash); + } + // There was no matching route tree in the cache. Let's see if we can + // construct an "optimistic" route tree. + // + // Do not construct an optimistic route tree if there was a cache hit, but + // the entry has a rejected status, since it may have been rejected due to a + // rewrite or redirect based on the search params. + // + // TODO: There are multiple reasons a prefetch might be rejected; we should + // track them explicitly and choose what to do here based on that. + if (route === null || route.status !== _cache.EntryStatus.Rejected) { + const optimisticRoute = (0, _cache.requestOptimisticRouteCacheEntry)(now, url, nextUrl); + if (optimisticRoute !== null) { + // We have an optimistic route tree. Proceed with the normal flow. + const snapshot = readRenderSnapshotFromCache(now, optimisticRoute, optimisticRoute.tree); + const prefetchFlightRouterState = snapshot.flightRouterState; + const prefetchSeedData = snapshot.seedData; + const headSnapshot = readHeadSnapshotFromCache(now, optimisticRoute); + const prefetchHead = headSnapshot.rsc; + const isPrefetchHeadPartial = headSnapshot.isPartial; + const newCanonicalUrl = optimisticRoute.canonicalUrl + url.hash; + const newRenderedSearch = optimisticRoute.renderedSearch; + return navigateUsingPrefetchedRouteTree(now, url, currentUrl, nextUrl, isSamePageNavigation, currentCacheNode, currentFlightRouterState, prefetchFlightRouterState, prefetchSeedData, prefetchHead, isPrefetchHeadPartial, newCanonicalUrl, newRenderedSearch, shouldScroll, url.hash); + } + } + // There's no matching prefetch for this route in the cache. + let collectedDebugInfo = accumulation.collectedDebugInfo ?? []; + if (accumulation.collectedDebugInfo === undefined) { + collectedDebugInfo = accumulation.collectedDebugInfo = []; + } + return { + tag: _types.NavigationResultTag.Async, + data: navigateDynamicallyWithNoPrefetch(now, url, currentUrl, nextUrl, isSamePageNavigation, currentCacheNode, currentFlightRouterState, shouldScroll, url.hash, collectedDebugInfo) + }; +} +function navigateUsingPrefetchedRouteTree(now, url, currentUrl, nextUrl, isSamePageNavigation, currentCacheNode, currentFlightRouterState, prefetchFlightRouterState, prefetchSeedData, prefetchHead, isPrefetchHeadPartial, canonicalUrl, renderedSearch, shouldScroll, hash) { + // Recursively construct a prefetch tree by reading from the Segment Cache. To + // maintain compatibility, we output the same data structures as the old + // prefetching implementation: FlightRouterState and CacheNodeSeedData. + // TODO: Eventually updateCacheNodeOnNavigation (or the equivalent) should + // read from the Segment Cache directly. It's only structured this way for now + // so we can share code with the old prefetching implementation. + const scrollableSegments = []; + const task = (0, _pprnavigations.startPPRNavigation)(now, currentUrl, currentCacheNode, currentFlightRouterState, prefetchFlightRouterState, prefetchSeedData, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, scrollableSegments); + if (task !== null) { + const dynamicRequestTree = task.dynamicRequestTree; + if (dynamicRequestTree !== null) { + const promiseForDynamicServerResponse = (0, _fetchserverresponse.fetchServerResponse)(new URL(canonicalUrl, url.origin), { + flightRouterState: dynamicRequestTree, + nextUrl + }); + (0, _pprnavigations.listenForDynamicRequest)(task, promiseForDynamicServerResponse); + } else { + // The prefetched tree does not contain dynamic holes — it's + // fully static. We can skip the dynamic request. + } + return navigationTaskToResult(task, currentCacheNode, canonicalUrl, renderedSearch, scrollableSegments, shouldScroll, hash); + } + // The server sent back an empty tree patch. There's nothing to update, except + // possibly the URL. + return { + tag: _types.NavigationResultTag.NoOp, + data: { + canonicalUrl, + shouldScroll + } + }; +} +function navigationTaskToResult(task, currentCacheNode, canonicalUrl, renderedSearch, scrollableSegments, shouldScroll, hash) { + const flightRouterState = task.route; + if (flightRouterState === null) { + // When no router state is provided, it signals that we should perform an + // MPA navigation. + return { + tag: _types.NavigationResultTag.MPA, + data: canonicalUrl + }; + } + const newCacheNode = task.node; + return { + tag: _types.NavigationResultTag.Success, + data: { + flightRouterState, + cacheNode: newCacheNode !== null ? newCacheNode : currentCacheNode, + canonicalUrl, + renderedSearch, + scrollableSegments, + shouldScroll, + hash + } + }; +} +function readRenderSnapshotFromCache(now, route, tree) { + let childRouterStates = {}; + let childSeedDatas = {}; + const slots = tree.slots; + if (slots !== null) { + for(const parallelRouteKey in slots){ + const childTree = slots[parallelRouteKey]; + const childResult = readRenderSnapshotFromCache(now, route, childTree); + childRouterStates[parallelRouteKey] = childResult.flightRouterState; + childSeedDatas[parallelRouteKey] = childResult.seedData; + } + } + let rsc = null; + let loading = null; + let isPartial = true; + const segmentEntry = (0, _cache.readSegmentCacheEntry)(now, tree.varyPath); + if (segmentEntry !== null) { + switch(segmentEntry.status){ + case _cache.EntryStatus.Fulfilled: + { + // Happy path: a cache hit + rsc = segmentEntry.rsc; + loading = segmentEntry.loading; + isPartial = segmentEntry.isPartial; + break; + } + case _cache.EntryStatus.Pending: + { + // We haven't received data for this segment yet, but there's already + // an in-progress request. Since it's extremely likely to arrive + // before the dynamic data response, we might as well use it. + const promiseForFulfilledEntry = (0, _cache.waitForSegmentCacheEntry)(segmentEntry); + rsc = promiseForFulfilledEntry.then((entry)=>entry !== null ? entry.rsc : null); + loading = promiseForFulfilledEntry.then((entry)=>entry !== null ? entry.loading : null); + // Since we don't know yet whether the segment is partial or fully + // static, we must assume it's partial; we can't skip the + // dynamic request. + isPartial = true; + break; + } + case _cache.EntryStatus.Empty: + case _cache.EntryStatus.Rejected: + break; + default: + segmentEntry; + } + } + // The navigation implementation expects the search params to be + // included in the segment. However, the Segment Cache tracks search + // params separately from the rest of the segment key. So we need to + // add them back here. + // + // See corresponding comment in convertFlightRouterStateToTree. + // + // TODO: What we should do instead is update the navigation diffing + // logic to compare search params explicitly. This is a temporary + // solution until more of the Segment Cache implementation has settled. + const segment = (0, _segment.addSearchParamsIfPageSegment)(tree.segment, Object.fromEntries(new URLSearchParams(route.renderedSearch))); + // We don't need this information in a render snapshot, so this can just be a placeholder. + const hasRuntimePrefetch = false; + return { + flightRouterState: [ + segment, + childRouterStates, + null, + null, + tree.isRootLayout + ], + seedData: [ + rsc, + childSeedDatas, + loading, + isPartial, + hasRuntimePrefetch + ] + }; +} +function readHeadSnapshotFromCache(now, route) { + // Same as readRenderSnapshotFromCache, but for the head + let rsc = null; + let isPartial = true; + const segmentEntry = (0, _cache.readSegmentCacheEntry)(now, route.metadata.varyPath); + if (segmentEntry !== null) { + switch(segmentEntry.status){ + case _cache.EntryStatus.Fulfilled: + { + rsc = segmentEntry.rsc; + isPartial = segmentEntry.isPartial; + break; + } + case _cache.EntryStatus.Pending: + { + const promiseForFulfilledEntry = (0, _cache.waitForSegmentCacheEntry)(segmentEntry); + rsc = promiseForFulfilledEntry.then((entry)=>entry !== null ? entry.rsc : null); + isPartial = true; + break; + } + case _cache.EntryStatus.Empty: + case _cache.EntryStatus.Rejected: + break; + default: + segmentEntry; + } + } + return { + rsc, + isPartial + }; +} +async function navigateDynamicallyWithNoPrefetch(now, url, currentUrl, nextUrl, isSamePageNavigation, currentCacheNode, currentFlightRouterState, shouldScroll, hash, collectedDebugInfo) { + // Runs when a navigation happens but there's no cached prefetch we can use. + // Don't bother to wait for a prefetch response; go straight to a full + // navigation that contains both static and dynamic data in a single stream. + // (This is unlike the old navigation implementation, which instead blocks + // the dynamic request until a prefetch request is received.) + // + // To avoid duplication of logic, we're going to pretend that the tree + // returned by the dynamic request is, in fact, a prefetch tree. Then we can + // use the same server response to write the actual data into the CacheNode + // tree. So it's the same flow as the "happy path" (prefetch, then + // navigation), except we use a single server response for both stages. + const promiseForDynamicServerResponse = (0, _fetchserverresponse.fetchServerResponse)(url, { + flightRouterState: currentFlightRouterState, + nextUrl + }); + const result = await promiseForDynamicServerResponse; + if (typeof result === 'string') { + // This is an MPA navigation. + const newUrl = result; + return { + tag: _types.NavigationResultTag.MPA, + data: newUrl + }; + } + const { flightData, canonicalUrl, renderedSearch, debugInfo: debugInfoFromResponse } = result; + if (debugInfoFromResponse !== null) { + collectedDebugInfo.push(...debugInfoFromResponse); + } + // Since the response format of dynamic requests and prefetches is slightly + // different, we'll need to massage the data a bit. Create FlightRouterState + // tree that simulates what we'd receive as the result of a prefetch. + const prefetchFlightRouterState = simulatePrefetchTreeUsingDynamicTreePatch(currentFlightRouterState, flightData); + // In our simulated prefetch payload, we pretend that there's no seed data + // nor a prefetch head. + const prefetchSeedData = null; + const prefetchHead = null; + const isPrefetchHeadPartial = true; + // Now we proceed exactly as we would for normal navigation. + const scrollableSegments = []; + const task = (0, _pprnavigations.startPPRNavigation)(now, currentUrl, currentCacheNode, currentFlightRouterState, prefetchFlightRouterState, prefetchSeedData, prefetchHead, isPrefetchHeadPartial, isSamePageNavigation, scrollableSegments); + if (task !== null) { + // In this case, we've already sent the dynamic request, so we don't + // actually use the request tree created by `startPPRNavigation`, + // except to check if it contains dynamic holes. + // + // This is almost always true, but it could be false if all the segment data + // was present in the cache, but the route tree was not. E.g. navigating + // to a URL that was not prefetched but rewrites to a different URL + // that was. + const hasDynamicHoles = task.dynamicRequestTree !== null; + if (hasDynamicHoles) { + (0, _pprnavigations.listenForDynamicRequest)(task, promiseForDynamicServerResponse); + } else { + // The prefetched tree does not contain dynamic holes — it's + // fully static. We don't need to process the server response further. + } + return navigationTaskToResult(task, currentCacheNode, (0, _createhreffromurl.createHrefFromUrl)(canonicalUrl), renderedSearch, scrollableSegments, shouldScroll, hash); + } + // The server sent back an empty tree patch. There's nothing to update, except + // possibly the URL. + return { + tag: _types.NavigationResultTag.NoOp, + data: { + canonicalUrl: (0, _createhreffromurl.createHrefFromUrl)(canonicalUrl), + shouldScroll + } + }; +} +function simulatePrefetchTreeUsingDynamicTreePatch(currentTree, flightData) { + // Takes the current FlightRouterState and applies the router state patch + // received from the server, to create a full FlightRouterState tree that we + // can pretend was returned by a prefetch. + // + // (It sounds similar to what applyRouterStatePatch does, but it doesn't need + // to handle stuff like interception routes or diffing since that will be + // handled later.) + let baseTree = currentTree; + for (const { segmentPath, tree: treePatch } of flightData){ + // If the server sends us multiple tree patches, we only need to clone the + // base tree when applying the first patch. After the first patch, we can + // apply the remaining patches in place without copying. + const canMutateInPlace = baseTree !== currentTree; + baseTree = simulatePrefetchTreeUsingDynamicTreePatchImpl(baseTree, treePatch, segmentPath, canMutateInPlace, 0); + } + return baseTree; +} +function simulatePrefetchTreeUsingDynamicTreePatchImpl(baseRouterState, patch, segmentPath, canMutateInPlace, index) { + if (index === segmentPath.length) { + // We reached the part of the tree that we need to patch. + return patch; + } + // segmentPath represents the parent path of subtree. It's a repeating + // pattern of parallel route key and segment: + // + // [string, Segment, string, Segment, string, Segment, ...] + // + // This path tells us which part of the base tree to apply the tree patch. + // + // NOTE: In the case of a fully dynamic request with no prefetch, we receive + // the FlightRouterState patch in the same request as the dynamic data. + // Therefore we don't need to worry about diffing the segment values; we can + // assume the server sent us a correct result. + const updatedParallelRouteKey = segmentPath[index]; + // const segment: Segment = segmentPath[index + 1] <-- Not used, see note above + const baseChildren = baseRouterState[1]; + const newChildren = {}; + for(const parallelRouteKey in baseChildren){ + if (parallelRouteKey === updatedParallelRouteKey) { + const childBaseRouterState = baseChildren[parallelRouteKey]; + newChildren[parallelRouteKey] = simulatePrefetchTreeUsingDynamicTreePatchImpl(childBaseRouterState, patch, segmentPath, canMutateInPlace, // the end of the segment path. + index + 2); + } else { + // This child is not being patched. Copy it over as-is. + newChildren[parallelRouteKey] = baseChildren[parallelRouteKey]; + } + } + if (canMutateInPlace) { + // We can mutate the base tree in place, because the base tree is already + // a clone. + baseRouterState[1] = newChildren; + return baseRouterState; + } + // Clone all the fields except the children. + // + // Based on equivalent logic in apply-router-state-patch-to-tree, but should + // confirm whether we need to copy all of these fields. Not sure the server + // ever sends, e.g. the refetch marker. + const clone = [ + baseRouterState[0], + newChildren + ]; + if (2 in baseRouterState) { + clone[2] = baseRouterState[2]; + } + if (3 in baseRouterState) { + clone[3] = baseRouterState[3]; + } + if (4 in baseRouterState) { + clone[4] = baseRouterState[4]; + } + return clone; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=navigation.js.map +}), +"[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/client/components/router-reducer/reducers/navigate-reducer.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + DYNAMIC_STALETIME_MS: null, + STATIC_STALETIME_MS: null, + generateSegmentsFromPatch: null, + handleExternalUrl: null, + navigateReducer: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + DYNAMIC_STALETIME_MS: function() { + return DYNAMIC_STALETIME_MS; + }, + STATIC_STALETIME_MS: function() { + return STATIC_STALETIME_MS; + }, + generateSegmentsFromPatch: function() { + return generateSegmentsFromPatch; + }, + handleExternalUrl: function() { + return handleExternalUrl; + }, + navigateReducer: function() { + return navigateReducer; + } +}); +const _createhreffromurl = __turbopack_context__.r("[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)"); +const _handlemutable = __turbopack_context__.r("[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/client/components/router-reducer/handle-mutable.js [app-ssr] (ecmascript)"); +const _navigation = __turbopack_context__.r("[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/client/components/segment-cache/navigation.js [app-ssr] (ecmascript)"); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _cache = __turbopack_context__.r("[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/client/components/segment-cache/cache.js [app-ssr] (ecmascript)"); +const DYNAMIC_STALETIME_MS = Number(("TURBOPACK compile-time value", "0")) * 1000; +const STATIC_STALETIME_MS = (0, _cache.getStaleTimeMs)(Number(("TURBOPACK compile-time value", "300"))); +function handleExternalUrl(state, mutable, url, pendingPush) { + mutable.mpaNavigation = true; + mutable.canonicalUrl = url; + mutable.pendingPush = pendingPush; + mutable.scrollableSegments = undefined; + return (0, _handlemutable.handleMutable)(state, mutable); +} +function generateSegmentsFromPatch(flightRouterPatch) { + const segments = []; + const [segment, parallelRoutes] = flightRouterPatch; + if (Object.keys(parallelRoutes).length === 0) { + return [ + [ + segment + ] + ]; + } + for (const [parallelRouteKey, parallelRoute] of Object.entries(parallelRoutes)){ + for (const childSegment of generateSegmentsFromPatch(parallelRoute)){ + // If the segment is empty, it means we are at the root of the tree + if (segment === '') { + segments.push([ + parallelRouteKey, + ...childSegment + ]); + } else { + segments.push([ + segment, + parallelRouteKey, + ...childSegment + ]); + } + } + } + return segments; +} +function handleNavigationResult(url, state, mutable, pendingPush, result) { + switch(result.tag){ + case _types.NavigationResultTag.MPA: + { + // Perform an MPA navigation. + const newUrl = result.data; + return handleExternalUrl(state, mutable, newUrl, pendingPush); + } + case _types.NavigationResultTag.NoOp: + { + // The server responded with no change to the current page. However, if + // the URL changed, we still need to update that. + const newCanonicalUrl = result.data.canonicalUrl; + mutable.canonicalUrl = newCanonicalUrl; + // Check if the only thing that changed was the hash fragment. + const oldUrl = new URL(state.canonicalUrl, url); + const onlyHashChange = // navigations are always same-origin. + url.pathname === oldUrl.pathname && url.search === oldUrl.search && url.hash !== oldUrl.hash; + if (onlyHashChange) { + // The only updated part of the URL is the hash. + mutable.onlyHashChange = true; + mutable.shouldScroll = result.data.shouldScroll; + mutable.hashFragment = url.hash; + // Setting this to an empty array triggers a scroll for all new and + // updated segments. See `ScrollAndFocusHandler` for more details. + mutable.scrollableSegments = []; + } + return (0, _handlemutable.handleMutable)(state, mutable); + } + case _types.NavigationResultTag.Success: + { + // Received a new result. + mutable.cache = result.data.cacheNode; + mutable.patchedTree = result.data.flightRouterState; + mutable.renderedSearch = result.data.renderedSearch; + mutable.canonicalUrl = result.data.canonicalUrl; + mutable.scrollableSegments = result.data.scrollableSegments; + mutable.shouldScroll = result.data.shouldScroll; + mutable.hashFragment = result.data.hash; + return (0, _handlemutable.handleMutable)(state, mutable); + } + case _types.NavigationResultTag.Async: + { + return result.data.then((asyncResult)=>handleNavigationResult(url, state, mutable, pendingPush, asyncResult), // TODO: This matches the current behavior but we need to do something + // better here if the network fails. + ()=>{ + return state; + }); + } + default: + { + result; + return state; + } + } +} +function navigateReducer(state, action) { + const { url, isExternalUrl, navigateType, shouldScroll } = action; + const mutable = {}; + const href = (0, _createhreffromurl.createHrefFromUrl)(url); + const pendingPush = navigateType === 'push'; + mutable.preserveCustomHistoryState = false; + mutable.pendingPush = pendingPush; + if (isExternalUrl) { + return handleExternalUrl(state, mutable, url.toString(), pendingPush); + } + // Handles case where `` tag is present, + // which will trigger an MPA navigation. + if (document.getElementById('__next-page-redirect')) { + return handleExternalUrl(state, mutable, href, pendingPush); + } + // Temporary glue code between the router reducer and the new navigation + // implementation. Eventually we'll rewrite the router reducer to a + // state machine. + const currentUrl = new URL(state.canonicalUrl, location.origin); + const result = (0, _navigation.navigate)(url, currentUrl, state.cache, state.tree, state.nextUrl, shouldScroll, mutable); + return handleNavigationResult(url, state, mutable, pendingPush, result); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=navigate-reducer.js.map +}), +"[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/shared/lib/segment-cache/output-export-prefetch-encoding.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +// In output: export mode, the build id is added to the start of the HTML +// document, directly after the doctype declaration. During a prefetch, the +// client performs a range request to get the build id, so it can check whether +// the target page belongs to the same build. +// +// The first 64 bytes of the document are requested. The exact number isn't +// too important; it must be larger than the build id + doctype + closing and +// ending comment markers, but it doesn't need to match the end of the +// comment exactly. +// +// Build ids are 21 bytes long in the default implementation, though this +// can be overridden in the Next.js config. For the purposes of this check, +// it's OK to only match the start of the id, so we'll truncate it if exceeds +// a certain length. +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + DOC_PREFETCH_RANGE_HEADER_VALUE: null, + doesExportedHtmlMatchBuildId: null, + insertBuildIdComment: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + DOC_PREFETCH_RANGE_HEADER_VALUE: function() { + return DOC_PREFETCH_RANGE_HEADER_VALUE; + }, + doesExportedHtmlMatchBuildId: function() { + return doesExportedHtmlMatchBuildId; + }, + insertBuildIdComment: function() { + return insertBuildIdComment; + } +}); +const DOCTYPE_PREFIX = '' // 15 bytes +; +const MAX_BUILD_ID_LENGTH = 24; +const DOC_PREFETCH_RANGE_HEADER_VALUE = 'bytes=0-63'; +function escapeBuildId(buildId) { + // If the build id is longer than the given limit, it's OK for our purposes + // to only match the beginning. + const truncated = buildId.slice(0, MAX_BUILD_ID_LENGTH); + // Replace hyphens with underscores so it doesn't break the HTML comment. + // (Unlikely, but if this did happen it would break the whole document.) + return truncated.replace(/-/g, '_'); +} +function insertBuildIdComment(originalHtml, buildId) { + if (buildId.includes('-->') || // React always inserts a doctype at the start of the document. Skip if it + // isn't present. Shouldn't happen; suggests an issue elsewhere. + !originalHtml.startsWith(DOCTYPE_PREFIX)) { + // Return the original HTML unchanged. This means the document will not + // be prefetched. + // TODO: The build id comment is currently only used during prefetches, but + // if we eventually use this mechanism for regular navigations, we may need + // to error during build if we fail to insert it for some reason. + return originalHtml; + } + // The comment must be inserted after the doctype. + return originalHtml.replace(DOCTYPE_PREFIX, DOCTYPE_PREFIX + ''); +} +function doesExportedHtmlMatchBuildId(partialHtmlDocument, buildId) { + // Check whether the document starts with the expected buildId. + return partialHtmlDocument.startsWith(DOCTYPE_PREFIX + ''); +} //# sourceMappingURL=output-export-prefetch-encoding.js.map +}), +"[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/client/components/segment-cache/cache.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + EntryStatus: null, + canNewFetchStrategyProvideMoreContent: null, + convertRouteTreeToFlightRouterState: null, + createDetachedSegmentCacheEntry: null, + fetchRouteOnCacheMiss: null, + fetchSegmentOnCacheMiss: null, + fetchSegmentPrefetchesUsingDynamicRequest: null, + getCurrentCacheVersion: null, + getStaleTimeMs: null, + overwriteRevalidatingSegmentCacheEntry: null, + pingInvalidationListeners: null, + readOrCreateRevalidatingSegmentEntry: null, + readOrCreateRouteCacheEntry: null, + readOrCreateSegmentCacheEntry: null, + readRouteCacheEntry: null, + readSegmentCacheEntry: null, + requestOptimisticRouteCacheEntry: null, + revalidateEntireCache: null, + upgradeToPendingSegment: null, + upsertSegmentEntry: null, + waitForSegmentCacheEntry: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + EntryStatus: function() { + return EntryStatus; + }, + canNewFetchStrategyProvideMoreContent: function() { + return canNewFetchStrategyProvideMoreContent; + }, + convertRouteTreeToFlightRouterState: function() { + return convertRouteTreeToFlightRouterState; + }, + createDetachedSegmentCacheEntry: function() { + return createDetachedSegmentCacheEntry; + }, + fetchRouteOnCacheMiss: function() { + return fetchRouteOnCacheMiss; + }, + fetchSegmentOnCacheMiss: function() { + return fetchSegmentOnCacheMiss; + }, + fetchSegmentPrefetchesUsingDynamicRequest: function() { + return fetchSegmentPrefetchesUsingDynamicRequest; + }, + getCurrentCacheVersion: function() { + return getCurrentCacheVersion; + }, + getStaleTimeMs: function() { + return getStaleTimeMs; + }, + overwriteRevalidatingSegmentCacheEntry: function() { + return overwriteRevalidatingSegmentCacheEntry; + }, + pingInvalidationListeners: function() { + return pingInvalidationListeners; + }, + readOrCreateRevalidatingSegmentEntry: function() { + return readOrCreateRevalidatingSegmentEntry; + }, + readOrCreateRouteCacheEntry: function() { + return readOrCreateRouteCacheEntry; + }, + readOrCreateSegmentCacheEntry: function() { + return readOrCreateSegmentCacheEntry; + }, + readRouteCacheEntry: function() { + return readRouteCacheEntry; + }, + readSegmentCacheEntry: function() { + return readSegmentCacheEntry; + }, + requestOptimisticRouteCacheEntry: function() { + return requestOptimisticRouteCacheEntry; + }, + revalidateEntireCache: function() { + return revalidateEntireCache; + }, + upgradeToPendingSegment: function() { + return upgradeToPendingSegment; + }, + upsertSegmentEntry: function() { + return upsertSegmentEntry; + }, + waitForSegmentCacheEntry: function() { + return waitForSegmentCacheEntry; + } +}); +const _approutertypes = __turbopack_context__.r("[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/shared/lib/app-router-types.js [app-ssr] (ecmascript)"); +const _approuterheaders = __turbopack_context__.r("[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/client/components/app-router-headers.js [app-ssr] (ecmascript)"); +const _fetchserverresponse = __turbopack_context__.r("[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/client/components/router-reducer/fetch-server-response.js [app-ssr] (ecmascript)"); +const _scheduler = __turbopack_context__.r("[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/client/components/segment-cache/scheduler.js [app-ssr] (ecmascript)"); +const _varypath = __turbopack_context__.r("[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/client/components/segment-cache/vary-path.js [app-ssr] (ecmascript)"); +const _appbuildid = __turbopack_context__.r("[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/client/app-build-id.js [app-ssr] (ecmascript)"); +const _createhreffromurl = __turbopack_context__.r("[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/client/components/router-reducer/create-href-from-url.js [app-ssr] (ecmascript)"); +const _cachekey = __turbopack_context__.r("[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/client/components/segment-cache/cache-key.js [app-ssr] (ecmascript)"); +const _routeparams = __turbopack_context__.r("[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/client/route-params.js [app-ssr] (ecmascript)"); +const _cachemap = __turbopack_context__.r("[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/client/components/segment-cache/cache-map.js [app-ssr] (ecmascript)"); +const _segmentvalueencoding = __turbopack_context__.r("[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/shared/lib/segment-cache/segment-value-encoding.js [app-ssr] (ecmascript)"); +const _flightdatahelpers = __turbopack_context__.r("[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/client/flight-data-helpers.js [app-ssr] (ecmascript)"); +const _navigatereducer = __turbopack_context__.r("[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/client/components/router-reducer/reducers/navigate-reducer.js [app-ssr] (ecmascript)"); +const _links = __turbopack_context__.r("[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/client/components/links.js [app-ssr] (ecmascript)"); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const _outputexportprefetchencoding = __turbopack_context__.r("[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/shared/lib/segment-cache/output-export-prefetch-encoding.js [app-ssr] (ecmascript)"); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _promisewithresolvers = __turbopack_context__.r("[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/shared/lib/promise-with-resolvers.js [app-ssr] (ecmascript)"); +function getStaleTimeMs(staleTimeSeconds) { + return Math.max(staleTimeSeconds, 30) * 1000; +} +var EntryStatus = /*#__PURE__*/ function(EntryStatus) { + EntryStatus[EntryStatus["Empty"] = 0] = "Empty"; + EntryStatus[EntryStatus["Pending"] = 1] = "Pending"; + EntryStatus[EntryStatus["Fulfilled"] = 2] = "Fulfilled"; + EntryStatus[EntryStatus["Rejected"] = 3] = "Rejected"; + return EntryStatus; +}({}); +const isOutputExportMode = ("TURBOPACK compile-time value", "development") === 'production' && ("TURBOPACK compile-time value", void 0) === 'export'; +const MetadataOnlyRequestTree = [ + '', + {}, + null, + 'metadata-only' +]; +let routeCacheMap = (0, _cachemap.createCacheMap)(); +let segmentCacheMap = (0, _cachemap.createCacheMap)(); +// All invalidation listeners for the whole cache are tracked in single set. +// Since we don't yet support tag or path-based invalidation, there's no point +// tracking them any more granularly than this. Once we add granular +// invalidation, that may change, though generally the model is to just notify +// the listeners and allow the caller to poll the prefetch cache with a new +// prefetch task if desired. +let invalidationListeners = null; +// Incrementing counter used to track cache invalidations. +let currentCacheVersion = 0; +function getCurrentCacheVersion() { + return currentCacheVersion; +} +function revalidateEntireCache(nextUrl, tree) { + // Increment the current cache version. This does not eagerly evict anything + // from the cache, but because all the entries are versioned, and we check + // the version when reading from the cache, this effectively causes all + // entries to be evicted lazily. We do it lazily because in the future, + // actions like revalidateTag or refresh will not evict the entire cache, + // but rather some subset of the entries. + currentCacheVersion++; + // Start a cooldown before re-prefetching to allow CDN cache propagation. + (0, _scheduler.startRevalidationCooldown)(); + // Prefetch all the currently visible links again, to re-fill the cache. + (0, _links.pingVisibleLinks)(nextUrl, tree); + // Similarly, notify all invalidation listeners (i.e. those passed to + // `router.prefetch(onInvalidate)`), so they can trigger a new prefetch + // if needed. + pingInvalidationListeners(nextUrl, tree); +} +function attachInvalidationListener(task) { + // This function is called whenever a prefetch task reads a cache entry. If + // the task has an onInvalidate function associated with it — i.e. the one + // optionally passed to router.prefetch(onInvalidate) — then we attach that + // listener to the every cache entry that the task reads. Then, if an entry + // is invalidated, we call the function. + if (task.onInvalidate !== null) { + if (invalidationListeners === null) { + invalidationListeners = new Set([ + task + ]); + } else { + invalidationListeners.add(task); + } + } +} +function notifyInvalidationListener(task) { + const onInvalidate = task.onInvalidate; + if (onInvalidate !== null) { + // Clear the callback from the task object to guarantee it's not called more + // than once. + task.onInvalidate = null; + // This is a user-space function, so we must wrap in try/catch. + try { + onInvalidate(); + } catch (error) { + if (typeof reportError === 'function') { + reportError(error); + } else { + console.error(error); + } + } + } +} +function pingInvalidationListeners(nextUrl, tree) { + // The rough equivalent of pingVisibleLinks, but for onInvalidate callbacks. + // This is called when the Next-Url or the base tree changes, since those + // may affect the result of a prefetch task. It's also called after a + // cache invalidation. + if (invalidationListeners !== null) { + const tasks = invalidationListeners; + invalidationListeners = null; + for (const task of tasks){ + if ((0, _scheduler.isPrefetchTaskDirty)(task, nextUrl, tree)) { + notifyInvalidationListener(task); + } + } + } +} +function readRouteCacheEntry(now, key) { + const varyPath = (0, _varypath.getRouteVaryPath)(key.pathname, key.search, key.nextUrl); + const isRevalidation = false; + return (0, _cachemap.getFromCacheMap)(now, getCurrentCacheVersion(), routeCacheMap, varyPath, isRevalidation); +} +function readSegmentCacheEntry(now, varyPath) { + const isRevalidation = false; + return (0, _cachemap.getFromCacheMap)(now, getCurrentCacheVersion(), segmentCacheMap, varyPath, isRevalidation); +} +function readRevalidatingSegmentCacheEntry(now, varyPath) { + const isRevalidation = true; + return (0, _cachemap.getFromCacheMap)(now, getCurrentCacheVersion(), segmentCacheMap, varyPath, isRevalidation); +} +function waitForSegmentCacheEntry(pendingEntry) { + // Because the entry is pending, there's already a in-progress request. + // Attach a promise to the entry that will resolve when the server responds. + let promiseWithResolvers = pendingEntry.promise; + if (promiseWithResolvers === null) { + promiseWithResolvers = pendingEntry.promise = (0, _promisewithresolvers.createPromiseWithResolvers)(); + } else { + // There's already a promise we can use + } + return promiseWithResolvers.promise; +} +function readOrCreateRouteCacheEntry(now, task, key) { + attachInvalidationListener(task); + const existingEntry = readRouteCacheEntry(now, key); + if (existingEntry !== null) { + return existingEntry; + } + // Create a pending entry and add it to the cache. + const pendingEntry = { + canonicalUrl: null, + status: 0, + blockedTasks: null, + tree: null, + metadata: null, + // This is initialized to true because we don't know yet whether the route + // could be intercepted. It's only set to false once we receive a response + // from the server. + couldBeIntercepted: true, + // Similarly, we don't yet know if the route supports PPR. + isPPREnabled: false, + renderedSearch: null, + // Map-related fields + ref: null, + size: 0, + // Since this is an empty entry, there's no reason to ever evict it. It will + // be updated when the data is populated. + staleAt: Infinity, + version: getCurrentCacheVersion() + }; + const varyPath = (0, _varypath.getRouteVaryPath)(key.pathname, key.search, key.nextUrl); + const isRevalidation = false; + (0, _cachemap.setInCacheMap)(routeCacheMap, varyPath, pendingEntry, isRevalidation); + return pendingEntry; +} +function requestOptimisticRouteCacheEntry(now, requestedUrl, nextUrl) { + // This function is called during a navigation when there was no matching + // route tree in the prefetch cache. Before de-opting to a blocking, + // unprefetched navigation, we will first attempt to construct an "optimistic" + // route tree by checking the cache for similar routes. + // + // Check if there's a route with the same pathname, but with different + // search params. We can then base our optimistic route tree on this entry. + // + // Conceptually, we are simulating what would happen if we did perform a + // prefetch the requested URL, under the assumption that the server will + // not redirect or rewrite the request in a different manner than the + // base route tree. This assumption might not hold, in which case we'll have + // to recover when we perform the dynamic navigation request. However, this + // is what would happen if a route were dynamically rewritten/redirected + // in between the prefetch and the navigation. So the logic needs to exist + // to handle this case regardless. + // Look for a route with the same pathname, but with an empty search string. + // TODO: There's nothing inherently special about the empty search string; + // it's chosen somewhat arbitrarily, with the rationale that it's the most + // likely one to exist. But we should update this to match _any_ search + // string. The plan is to generalize this logic alongside other improvements + // related to "fallback" cache entries. + const requestedSearch = requestedUrl.search; + if (requestedSearch === '') { + // The caller would have already checked if a route with an empty search + // string is in the cache. So we can bail out here. + return null; + } + const urlWithoutSearchParams = new URL(requestedUrl); + urlWithoutSearchParams.search = ''; + const routeWithNoSearchParams = readRouteCacheEntry(now, (0, _cachekey.createCacheKey)(urlWithoutSearchParams.href, nextUrl)); + if (routeWithNoSearchParams === null || routeWithNoSearchParams.status !== 2) { + // Bail out of constructing an optimistic route tree. This will result in + // a blocking, unprefetched navigation. + return null; + } + // Now we have a base route tree we can "patch" with our optimistic values. + // Optimistically assume that redirects for the requested pathname do + // not vary on the search string. Therefore, if the base route was + // redirected to a different search string, then the optimistic route + // should be redirected to the same search string. Otherwise, we use + // the requested search string. + const canonicalUrlForRouteWithNoSearchParams = new URL(routeWithNoSearchParams.canonicalUrl, requestedUrl.origin); + const optimisticCanonicalSearch = canonicalUrlForRouteWithNoSearchParams.search !== '' ? canonicalUrlForRouteWithNoSearchParams.search : requestedSearch; + // Similarly, optimistically assume that rewrites for the requested + // pathname do not vary on the search string. Therefore, if the base + // route was rewritten to a different search string, then the optimistic + // route should be rewritten to the same search string. Otherwise, we use + // the requested search string. + const optimisticRenderedSearch = routeWithNoSearchParams.renderedSearch !== '' ? routeWithNoSearchParams.renderedSearch : requestedSearch; + const optimisticUrl = new URL(routeWithNoSearchParams.canonicalUrl, location.origin); + optimisticUrl.search = optimisticCanonicalSearch; + const optimisticCanonicalUrl = (0, _createhreffromurl.createHrefFromUrl)(optimisticUrl); + const optimisticRouteTree = createOptimisticRouteTree(routeWithNoSearchParams.tree, optimisticRenderedSearch); + const optimisticMetadataTree = createOptimisticRouteTree(routeWithNoSearchParams.metadata, optimisticRenderedSearch); + // Clone the base route tree, and override the relevant fields with our + // optimistic values. + const optimisticEntry = { + canonicalUrl: optimisticCanonicalUrl, + status: 2, + // This isn't cloned because it's instance-specific + blockedTasks: null, + tree: optimisticRouteTree, + metadata: optimisticMetadataTree, + couldBeIntercepted: routeWithNoSearchParams.couldBeIntercepted, + isPPREnabled: routeWithNoSearchParams.isPPREnabled, + // Override the rendered search with the optimistic value. + renderedSearch: optimisticRenderedSearch, + // Map-related fields + ref: null, + size: 0, + staleAt: routeWithNoSearchParams.staleAt, + version: routeWithNoSearchParams.version + }; + // Do not insert this entry into the cache. It only exists so we can + // perform the current navigation. Just return it to the caller. + return optimisticEntry; +} +function createOptimisticRouteTree(tree, newRenderedSearch) { + // Create a new route tree that identical to the original one except for + // the rendered search string, which is contained in the vary path. + let clonedSlots = null; + const originalSlots = tree.slots; + if (originalSlots !== null) { + clonedSlots = {}; + for(const parallelRouteKey in originalSlots){ + const childTree = originalSlots[parallelRouteKey]; + clonedSlots[parallelRouteKey] = createOptimisticRouteTree(childTree, newRenderedSearch); + } + } + // We only need to clone the vary path if the route is a page. + if (tree.isPage) { + return { + requestKey: tree.requestKey, + segment: tree.segment, + varyPath: (0, _varypath.clonePageVaryPathWithNewSearchParams)(tree.varyPath, newRenderedSearch), + isPage: true, + slots: clonedSlots, + isRootLayout: tree.isRootLayout, + hasLoadingBoundary: tree.hasLoadingBoundary, + hasRuntimePrefetch: tree.hasRuntimePrefetch + }; + } + return { + requestKey: tree.requestKey, + segment: tree.segment, + varyPath: tree.varyPath, + isPage: false, + slots: clonedSlots, + isRootLayout: tree.isRootLayout, + hasLoadingBoundary: tree.hasLoadingBoundary, + hasRuntimePrefetch: tree.hasRuntimePrefetch + }; +} +function readOrCreateSegmentCacheEntry(now, fetchStrategy, route, tree) { + const existingEntry = readSegmentCacheEntry(now, tree.varyPath); + if (existingEntry !== null) { + return existingEntry; + } + // Create a pending entry and add it to the cache. + const varyPathForRequest = (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree); + const pendingEntry = createDetachedSegmentCacheEntry(route.staleAt); + const isRevalidation = false; + (0, _cachemap.setInCacheMap)(segmentCacheMap, varyPathForRequest, pendingEntry, isRevalidation); + return pendingEntry; +} +function readOrCreateRevalidatingSegmentEntry(now, fetchStrategy, route, tree) { + // This function is called when we've already confirmed that a particular + // segment is cached, but we want to perform another request anyway in case it + // returns more complete and/or fresher data than we already have. The logic + // for deciding whether to replace the existing entry is handled elsewhere; + // this function just handles retrieving a cache entry that we can use to + // track the revalidation. + // + // The reason revalidations are stored in the cache is because we need to be + // able to dedupe multiple revalidation requests. The reason they have to be + // handled specially is because we shouldn't overwrite a "normal" entry if + // one exists at the same keypath. So, for each internal cache location, there + // is a special "revalidation" slot that is used solely for this purpose. + // + // You can think of it as if all the revalidation entries were stored in a + // separate cache map from the canonical entries, and then transfered to the + // canonical cache map once the request is complete — this isn't how it's + // actually implemented, since it's more efficient to store them in the same + // data structure as the normal entries, but that's how it's modeled + // conceptually. + // TODO: Once we implement Fallback behavior for params, where an entry is + // re-keyed based on response information, we'll need to account for the + // possibility that the keypath of the previous entry is more generic than + // the keypath of the revalidating entry. In other words, the server could + // return a less generic entry upon revalidation. For now, though, this isn't + // a concern because the keypath is based solely on the prefetch strategy, + // not on data contained in the response. + const existingEntry = readRevalidatingSegmentCacheEntry(now, tree.varyPath); + if (existingEntry !== null) { + return existingEntry; + } + // Create a pending entry and add it to the cache. + const varyPathForRequest = (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree); + const pendingEntry = createDetachedSegmentCacheEntry(route.staleAt); + const isRevalidation = true; + (0, _cachemap.setInCacheMap)(segmentCacheMap, varyPathForRequest, pendingEntry, isRevalidation); + return pendingEntry; +} +function overwriteRevalidatingSegmentCacheEntry(fetchStrategy, route, tree) { + // This function is called when we've already decided to replace an existing + // revalidation entry. Create a new entry and write it into the cache, + // overwriting the previous value. + const varyPathForRequest = (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree); + const pendingEntry = createDetachedSegmentCacheEntry(route.staleAt); + const isRevalidation = true; + (0, _cachemap.setInCacheMap)(segmentCacheMap, varyPathForRequest, pendingEntry, isRevalidation); + return pendingEntry; +} +function upsertSegmentEntry(now, varyPath, candidateEntry) { + // We have a new entry that has not yet been inserted into the cache. Before + // we do so, we need to confirm whether it takes precedence over the existing + // entry (if one exists). + // TODO: We should not upsert an entry if its key was invalidated in the time + // since the request was made. We can do that by passing the "owner" entry to + // this function and confirming it's the same as `existingEntry`. + if ((0, _cachemap.isValueExpired)(now, getCurrentCacheVersion(), candidateEntry)) { + // The entry is expired. We cannot upsert it. + return null; + } + const existingEntry = readSegmentCacheEntry(now, varyPath); + if (existingEntry !== null) { + // Don't replace a more specific segment with a less-specific one. A case where this + // might happen is if the existing segment was fetched via + // ``. + if (// than the segment we already have in the cache, so it can't have more content. + candidateEntry.fetchStrategy !== existingEntry.fetchStrategy && !canNewFetchStrategyProvideMoreContent(existingEntry.fetchStrategy, candidateEntry.fetchStrategy) || // The existing entry isn't partial, but the new one is. + // (TODO: can this be true if `candidateEntry.fetchStrategy >= existingEntry.fetchStrategy`?) + !existingEntry.isPartial && candidateEntry.isPartial) { + // We're going to leave revalidating entry in the cache so that it doesn't + // get revalidated again unnecessarily. Downgrade the Fulfilled entry to + // Rejected and null out the data so it can be garbage collected. We leave + // `staleAt` intact to prevent subsequent revalidation attempts only until + // the entry expires. + const rejectedEntry = candidateEntry; + rejectedEntry.status = 3; + rejectedEntry.loading = null; + rejectedEntry.rsc = null; + return null; + } + // Evict the existing entry from the cache. + (0, _cachemap.deleteFromCacheMap)(existingEntry); + } + const isRevalidation = false; + (0, _cachemap.setInCacheMap)(segmentCacheMap, varyPath, candidateEntry, isRevalidation); + return candidateEntry; +} +function createDetachedSegmentCacheEntry(staleAt) { + const emptyEntry = { + status: 0, + // Default to assuming the fetch strategy will be PPR. This will be updated + // when a fetch is actually initiated. + fetchStrategy: _types.FetchStrategy.PPR, + rsc: null, + loading: null, + isPartial: true, + promise: null, + // Map-related fields + ref: null, + size: 0, + staleAt, + version: 0 + }; + return emptyEntry; +} +function upgradeToPendingSegment(emptyEntry, fetchStrategy) { + const pendingEntry = emptyEntry; + pendingEntry.status = 1; + pendingEntry.fetchStrategy = fetchStrategy; + // Set the version here, since this is right before the request is initiated. + // The next time the global cache version is incremented, the entry will + // effectively be evicted. This happens before initiating the request, rather + // than when receiving the response, because it's guaranteed to happen + // before the data is read on the server. + pendingEntry.version = getCurrentCacheVersion(); + return pendingEntry; +} +function pingBlockedTasks(entry) { + const blockedTasks = entry.blockedTasks; + if (blockedTasks !== null) { + for (const task of blockedTasks){ + (0, _scheduler.pingPrefetchTask)(task); + } + entry.blockedTasks = null; + } +} +function fulfillRouteCacheEntry(entry, tree, metadataVaryPath, staleAt, couldBeIntercepted, canonicalUrl, renderedSearch, isPPREnabled) { + // The Head is not actually part of the route tree, but other than that, it's + // fetched and cached like a segment. Some functions expect a RouteTree + // object, so rather than fork the logic in all those places, we use this + // "fake" one. + const metadata = { + requestKey: _segmentvalueencoding.HEAD_REQUEST_KEY, + segment: _segmentvalueencoding.HEAD_REQUEST_KEY, + varyPath: metadataVaryPath, + // The metadata isn't really a "page" (though it isn't really a "segment" + // either) but for the purposes of how this field is used, it behaves like + // one. If this logic ever gets more complex we can change this to an enum. + isPage: true, + slots: null, + isRootLayout: false, + hasLoadingBoundary: _approutertypes.HasLoadingBoundary.SubtreeHasNoLoadingBoundary, + hasRuntimePrefetch: false + }; + const fulfilledEntry = entry; + fulfilledEntry.status = 2; + fulfilledEntry.tree = tree; + fulfilledEntry.metadata = metadata; + fulfilledEntry.staleAt = staleAt; + fulfilledEntry.couldBeIntercepted = couldBeIntercepted; + fulfilledEntry.canonicalUrl = canonicalUrl; + fulfilledEntry.renderedSearch = renderedSearch; + fulfilledEntry.isPPREnabled = isPPREnabled; + pingBlockedTasks(entry); + return fulfilledEntry; +} +function fulfillSegmentCacheEntry(segmentCacheEntry, rsc, loading, staleAt, isPartial) { + const fulfilledEntry = segmentCacheEntry; + fulfilledEntry.status = 2; + fulfilledEntry.rsc = rsc; + fulfilledEntry.loading = loading; + fulfilledEntry.staleAt = staleAt; + fulfilledEntry.isPartial = isPartial; + // Resolve any listeners that were waiting for this data. + if (segmentCacheEntry.promise !== null) { + segmentCacheEntry.promise.resolve(fulfilledEntry); + // Free the promise for garbage collection. + fulfilledEntry.promise = null; + } + return fulfilledEntry; +} +function rejectRouteCacheEntry(entry, staleAt) { + const rejectedEntry = entry; + rejectedEntry.status = 3; + rejectedEntry.staleAt = staleAt; + pingBlockedTasks(entry); +} +function rejectSegmentCacheEntry(entry, staleAt) { + const rejectedEntry = entry; + rejectedEntry.status = 3; + rejectedEntry.staleAt = staleAt; + if (entry.promise !== null) { + // NOTE: We don't currently propagate the reason the prefetch was canceled + // but we could by accepting a `reason` argument. + entry.promise.resolve(null); + entry.promise = null; + } +} +function convertRootTreePrefetchToRouteTree(rootTree, renderedPathname, renderedSearch, acc) { + // Remove trailing and leading slashes + const pathnameParts = renderedPathname.split('/').filter((p)=>p !== ''); + const index = 0; + const rootSegment = _segmentvalueencoding.ROOT_SEGMENT_REQUEST_KEY; + return convertTreePrefetchToRouteTree(rootTree.tree, rootSegment, null, _segmentvalueencoding.ROOT_SEGMENT_REQUEST_KEY, pathnameParts, index, renderedSearch, acc); +} +function convertTreePrefetchToRouteTree(prefetch, segment, partialVaryPath, requestKey, pathnameParts, pathnamePartsIndex, renderedSearch, acc) { + // Converts the route tree sent by the server into the format used by the + // cache. The cached version of the tree includes additional fields, such as a + // cache key for each segment. Since this is frequently accessed, we compute + // it once instead of on every access. This same cache key is also used to + // request the segment from the server. + let slots = null; + let isPage; + let varyPath; + const prefetchSlots = prefetch.slots; + if (prefetchSlots !== null) { + isPage = false; + varyPath = (0, _varypath.finalizeLayoutVaryPath)(requestKey, partialVaryPath); + slots = {}; + for(let parallelRouteKey in prefetchSlots){ + const childPrefetch = prefetchSlots[parallelRouteKey]; + const childParamName = childPrefetch.name; + const childParamType = childPrefetch.paramType; + const childServerSentParamKey = childPrefetch.paramKey; + let childDoesAppearInURL; + let childSegment; + let childPartialVaryPath; + if (childParamType !== null) { + // This segment is parameterized. Get the param from the pathname. + const childParamValue = (0, _routeparams.parseDynamicParamFromURLPart)(childParamType, pathnameParts, pathnamePartsIndex); + // Assign a cache key to the segment, based on the param value. In the + // pre-Segment Cache implementation, the server computes this and sends + // it in the body of the response. In the Segment Cache implementation, + // the server sends an empty string and we fill it in here. + // TODO: We're intentionally not adding the search param to page + // segments here; it's tracked separately and added back during a read. + // This would clearer if we waited to construct the segment until it's + // read from the cache, since that's effectively what we're + // doing anyway. + const childParamKey = // cacheComponents is enabled. + childServerSentParamKey !== null ? childServerSentParamKey : (0, _routeparams.getCacheKeyForDynamicParam)(childParamValue, ''); + childPartialVaryPath = (0, _varypath.appendLayoutVaryPath)(partialVaryPath, childParamKey); + childSegment = [ + childParamName, + childParamKey, + childParamType + ]; + childDoesAppearInURL = true; + } else { + // This segment does not have a param. Inherit the partial vary path of + // the parent. + childPartialVaryPath = partialVaryPath; + childSegment = childParamName; + childDoesAppearInURL = (0, _routeparams.doesStaticSegmentAppearInURL)(childParamName); + } + // Only increment the index if the segment appears in the URL. If it's a + // "virtual" segment, like a route group, it remains the same. + const childPathnamePartsIndex = childDoesAppearInURL ? pathnamePartsIndex + 1 : pathnamePartsIndex; + const childRequestKeyPart = (0, _segmentvalueencoding.createSegmentRequestKeyPart)(childSegment); + const childRequestKey = (0, _segmentvalueencoding.appendSegmentRequestKeyPart)(requestKey, parallelRouteKey, childRequestKeyPart); + slots[parallelRouteKey] = convertTreePrefetchToRouteTree(childPrefetch, childSegment, childPartialVaryPath, childRequestKey, pathnameParts, childPathnamePartsIndex, renderedSearch, acc); + } + } else { + if (requestKey.endsWith(_segment.PAGE_SEGMENT_KEY)) { + // This is a page segment. + isPage = true; + varyPath = (0, _varypath.finalizePageVaryPath)(requestKey, renderedSearch, partialVaryPath); + // The metadata "segment" is not part the route tree, but it has the same + // conceptual params as a page segment. Write the vary path into the + // accumulator object. If there are multiple parallel pages, we use the + // first one. Which page we choose is arbitrary as long as it's + // consistently the same one every time every time. See + // finalizeMetadataVaryPath for more details. + if (acc.metadataVaryPath === null) { + acc.metadataVaryPath = (0, _varypath.finalizeMetadataVaryPath)(requestKey, renderedSearch, partialVaryPath); + } + } else { + // This is a layout segment. + isPage = false; + varyPath = (0, _varypath.finalizeLayoutVaryPath)(requestKey, partialVaryPath); + } + } + return { + requestKey, + segment, + varyPath, + // TODO: Cheating the type system here a bit because TypeScript can't tell + // that the type of isPage and varyPath are consistent. The fix would be to + // create separate constructors and call the appropriate one from each of + // the branches above. Just seems a bit overkill only for one field so I'll + // leave it as-is for now. If isPage were wrong it would break the behavior + // and we'd catch it quickly, anyway. + isPage: isPage, + slots, + isRootLayout: prefetch.isRootLayout, + // This field is only relevant to dynamic routes. For a PPR/static route, + // there's always some partial loading state we can fetch. + hasLoadingBoundary: _approutertypes.HasLoadingBoundary.SegmentHasLoadingBoundary, + hasRuntimePrefetch: prefetch.hasRuntimePrefetch + }; +} +function convertRootFlightRouterStateToRouteTree(flightRouterState, renderedSearch, acc) { + return convertFlightRouterStateToRouteTree(flightRouterState, _segmentvalueencoding.ROOT_SEGMENT_REQUEST_KEY, null, renderedSearch, acc); +} +function convertFlightRouterStateToRouteTree(flightRouterState, requestKey, parentPartialVaryPath, renderedSearch, acc) { + const originalSegment = flightRouterState[0]; + let segment; + let partialVaryPath; + let isPage; + let varyPath; + if (Array.isArray(originalSegment)) { + isPage = false; + const paramCacheKey = originalSegment[1]; + partialVaryPath = (0, _varypath.appendLayoutVaryPath)(parentPartialVaryPath, paramCacheKey); + varyPath = (0, _varypath.finalizeLayoutVaryPath)(requestKey, partialVaryPath); + segment = originalSegment; + } else { + // This segment does not have a param. Inherit the partial vary path of + // the parent. + partialVaryPath = parentPartialVaryPath; + if (requestKey.endsWith(_segment.PAGE_SEGMENT_KEY)) { + // This is a page segment. + isPage = true; + // The navigation implementation expects the search params to be included + // in the segment. However, in the case of a static response, the search + // params are omitted. So the client needs to add them back in when reading + // from the Segment Cache. + // + // For consistency, we'll do this for dynamic responses, too. + // + // TODO: We should move search params out of FlightRouterState and handle + // them entirely on the client, similar to our plan for dynamic params. + segment = _segment.PAGE_SEGMENT_KEY; + varyPath = (0, _varypath.finalizePageVaryPath)(requestKey, renderedSearch, partialVaryPath); + // The metadata "segment" is not part the route tree, but it has the same + // conceptual params as a page segment. Write the vary path into the + // accumulator object. If there are multiple parallel pages, we use the + // first one. Which page we choose is arbitrary as long as it's + // consistently the same one every time every time. See + // finalizeMetadataVaryPath for more details. + if (acc.metadataVaryPath === null) { + acc.metadataVaryPath = (0, _varypath.finalizeMetadataVaryPath)(requestKey, renderedSearch, partialVaryPath); + } + } else { + // This is a layout segment. + isPage = false; + segment = originalSegment; + varyPath = (0, _varypath.finalizeLayoutVaryPath)(requestKey, partialVaryPath); + } + } + let slots = null; + const parallelRoutes = flightRouterState[1]; + for(let parallelRouteKey in parallelRoutes){ + const childRouterState = parallelRoutes[parallelRouteKey]; + const childSegment = childRouterState[0]; + // TODO: Eventually, the param values will not be included in the response + // from the server. We'll instead fill them in on the client by parsing + // the URL. This is where we'll do that. + const childRequestKeyPart = (0, _segmentvalueencoding.createSegmentRequestKeyPart)(childSegment); + const childRequestKey = (0, _segmentvalueencoding.appendSegmentRequestKeyPart)(requestKey, parallelRouteKey, childRequestKeyPart); + const childTree = convertFlightRouterStateToRouteTree(childRouterState, childRequestKey, partialVaryPath, renderedSearch, acc); + if (slots === null) { + slots = { + [parallelRouteKey]: childTree + }; + } else { + slots[parallelRouteKey] = childTree; + } + } + return { + requestKey, + segment, + varyPath, + // TODO: Cheating the type system here a bit because TypeScript can't tell + // that the type of isPage and varyPath are consistent. The fix would be to + // create separate constructors and call the appropriate one from each of + // the branches above. Just seems a bit overkill only for one field so I'll + // leave it as-is for now. If isPage were wrong it would break the behavior + // and we'd catch it quickly, anyway. + isPage: isPage, + slots, + isRootLayout: flightRouterState[4] === true, + hasLoadingBoundary: flightRouterState[5] !== undefined ? flightRouterState[5] : _approutertypes.HasLoadingBoundary.SubtreeHasNoLoadingBoundary, + // Non-static tree responses are only used by apps that haven't adopted + // Cache Components. So this is always false. + hasRuntimePrefetch: false + }; +} +function convertRouteTreeToFlightRouterState(routeTree) { + const parallelRoutes = {}; + if (routeTree.slots !== null) { + for(const parallelRouteKey in routeTree.slots){ + parallelRoutes[parallelRouteKey] = convertRouteTreeToFlightRouterState(routeTree.slots[parallelRouteKey]); + } + } + const flightRouterState = [ + routeTree.segment, + parallelRoutes, + null, + null, + routeTree.isRootLayout + ]; + return flightRouterState; +} +async function fetchRouteOnCacheMiss(entry, task, key) { + // This function is allowed to use async/await because it contains the actual + // fetch that gets issued on a cache miss. Notice it writes the result to the + // cache entry directly, rather than return data that is then written by + // the caller. + const pathname = key.pathname; + const search = key.search; + const nextUrl = key.nextUrl; + const segmentPath = '/_tree'; + const headers = { + [_approuterheaders.RSC_HEADER]: '1', + [_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER]: '1', + [_approuterheaders.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]: segmentPath + }; + if (nextUrl !== null) { + headers[_approuterheaders.NEXT_URL] = nextUrl; + } + try { + const url = new URL(pathname + search, location.origin); + let response; + let urlAfterRedirects; + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + else { + // "Server" mode. We can use request headers instead of the pathname. + // TODO: The eventual plan is to get rid of our custom request headers and + // encode everything into the URL, using a similar strategy to the + // "output: export" block above. + response = await fetchPrefetchResponse(url, headers); + urlAfterRedirects = response !== null && response.redirected ? new URL(response.url) : url; + } + if (!response || !response.ok || // 204 is a Cache miss. Though theoretically this shouldn't happen when + // PPR is enabled, because we always respond to route tree requests, even + // if it needs to be blockingly generated on demand. + response.status === 204 || !response.body) { + // Server responded with an error, or with a miss. We should still cache + // the response, but we can try again after 10 seconds. + rejectRouteCacheEntry(entry, Date.now() + 10 * 1000); + return null; + } + // TODO: The canonical URL is the href without the origin. I think + // historically the reason for this is because the initial canonical URL + // gets passed as a prop to the top-level React component, which means it + // needs to be computed during SSR. If it were to include the origin, it + // would need to always be same as location.origin on the client, to prevent + // a hydration mismatch. To sidestep this complexity, we omit the origin. + // + // However, since this is neither a native URL object nor a fully qualified + // URL string, we need to be careful about how we use it. To prevent subtle + // mistakes, we should create a special type for it, instead of just string. + // Or, we should just use a (readonly) URL object instead. The type of the + // prop that we pass to seed the initial state does not need to be the same + // type as the state itself. + const canonicalUrl = (0, _createhreffromurl.createHrefFromUrl)(urlAfterRedirects); + // Check whether the response varies based on the Next-Url header. + const varyHeader = response.headers.get('vary'); + const couldBeIntercepted = varyHeader !== null && varyHeader.includes(_approuterheaders.NEXT_URL); + // Track when the network connection closes. + const closed = (0, _promisewithresolvers.createPromiseWithResolvers)(); + // This checks whether the response was served from the per-segment cache, + // rather than the old prefetching flow. If it fails, it implies that PPR + // is disabled on this route. + const routeIsPPREnabled = response.headers.get(_approuterheaders.NEXT_DID_POSTPONE_HEADER) === '2' || // In output: "export" mode, we can't rely on response headers. But if we + // receive a well-formed response, we can assume it's a static response, + // because all data is static in this mode. + isOutputExportMode; + if (routeIsPPREnabled) { + const prefetchStream = createPrefetchResponseStream(response.body, closed.resolve, function onResponseSizeUpdate(size) { + (0, _cachemap.setSizeInCacheMap)(entry, size); + }); + const serverData = await (0, _fetchserverresponse.createFromNextReadableStream)(prefetchStream, headers); + if (serverData.buildId !== (0, _appbuildid.getAppBuildId)()) { + // The server build does not match the client. Treat as a 404. During + // an actual navigation, the router will trigger an MPA navigation. + // TODO: Consider moving the build ID to a response header so we can check + // it before decoding the response, and so there's one way of checking + // across all response types. + // TODO: We should cache the fact that this is an MPA navigation. + rejectRouteCacheEntry(entry, Date.now() + 10 * 1000); + return null; + } + // Get the params that were used to render the target page. These may + // be different from the params in the request URL, if the page + // was rewritten. + const renderedPathname = (0, _routeparams.getRenderedPathname)(response); + const renderedSearch = (0, _routeparams.getRenderedSearch)(response); + // Convert the server-sent data into the RouteTree format used by the + // client cache. + // + // During this traversal, we accumulate additional data into this + // "accumulator" object. + const acc = { + metadataVaryPath: null + }; + const routeTree = convertRootTreePrefetchToRouteTree(serverData, renderedPathname, renderedSearch, acc); + const metadataVaryPath = acc.metadataVaryPath; + if (metadataVaryPath === null) { + rejectRouteCacheEntry(entry, Date.now() + 10 * 1000); + return null; + } + const staleTimeMs = getStaleTimeMs(serverData.staleTime); + fulfillRouteCacheEntry(entry, routeTree, metadataVaryPath, Date.now() + staleTimeMs, couldBeIntercepted, canonicalUrl, renderedSearch, routeIsPPREnabled); + } else { + // PPR is not enabled for this route. The server responds with a + // different format (FlightRouterState) that we need to convert. + // TODO: We will unify the responses eventually. I'm keeping the types + // separate for now because FlightRouterState has so many + // overloaded concerns. + const prefetchStream = createPrefetchResponseStream(response.body, closed.resolve, function onResponseSizeUpdate(size) { + (0, _cachemap.setSizeInCacheMap)(entry, size); + }); + const serverData = await (0, _fetchserverresponse.createFromNextReadableStream)(prefetchStream, headers); + if (serverData.b !== (0, _appbuildid.getAppBuildId)()) { + // The server build does not match the client. Treat as a 404. During + // an actual navigation, the router will trigger an MPA navigation. + // TODO: Consider moving the build ID to a response header so we can check + // it before decoding the response, and so there's one way of checking + // across all response types. + // TODO: We should cache the fact that this is an MPA navigation. + rejectRouteCacheEntry(entry, Date.now() + 10 * 1000); + return null; + } + writeDynamicTreeResponseIntoCache(Date.now(), task, // using the LoadingBoundary fetch strategy, so mark their cache entries accordingly. + _types.FetchStrategy.LoadingBoundary, response, serverData, entry, couldBeIntercepted, canonicalUrl, routeIsPPREnabled); + } + if (!couldBeIntercepted) { + // This route will never be intercepted. So we can use this entry for all + // requests to this route, regardless of the Next-Url header. This works + // because when reading the cache we always check for a valid + // non-intercepted entry first. + // Re-key the entry. The `set` implementation handles removing it from + // its previous position in the cache. We don't need to do anything to + // update the LRU, because the entry is already in it. + // TODO: Treat this as an upsert — should check if an entry already + // exists at the new keypath, and if so, whether we should keep that + // one instead. + const fulfilledVaryPath = (0, _varypath.getFulfilledRouteVaryPath)(pathname, search, nextUrl, couldBeIntercepted); + const isRevalidation = false; + (0, _cachemap.setInCacheMap)(routeCacheMap, fulfilledVaryPath, entry, isRevalidation); + } + // Return a promise that resolves when the network connection closes, so + // the scheduler can track the number of concurrent network connections. + return { + value: null, + closed: closed.promise + }; + } catch (error) { + // Either the connection itself failed, or something bad happened while + // decoding the response. + rejectRouteCacheEntry(entry, Date.now() + 10 * 1000); + return null; + } +} +async function fetchSegmentOnCacheMiss(route, segmentCacheEntry, routeKey, tree) { + // This function is allowed to use async/await because it contains the actual + // fetch that gets issued on a cache miss. Notice it writes the result to the + // cache entry directly, rather than return data that is then written by + // the caller. + // + // Segment fetches are non-blocking so we don't need to ping the scheduler + // on completion. + // Use the canonical URL to request the segment, not the original URL. These + // are usually the same, but the canonical URL will be different if the route + // tree response was redirected. To avoid an extra waterfall on every segment + // request, we pass the redirected URL instead of the original one. + const url = new URL(route.canonicalUrl, location.origin); + const nextUrl = routeKey.nextUrl; + const requestKey = tree.requestKey; + const normalizedRequestKey = requestKey === _segmentvalueencoding.ROOT_SEGMENT_REQUEST_KEY ? // `_index` instead of as an empty string. This should be treated as + // an implementation detail and not as a stable part of the protocol. + // It just needs to match the equivalent logic that happens when + // prerendering the responses. It should not leak outside of Next.js. + '/_index' : requestKey; + const headers = { + [_approuterheaders.RSC_HEADER]: '1', + [_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER]: '1', + [_approuterheaders.NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]: normalizedRequestKey + }; + if (nextUrl !== null) { + headers[_approuterheaders.NEXT_URL] = nextUrl; + } + const requestUrl = ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : url; + try { + const response = await fetchPrefetchResponse(requestUrl, headers); + if (!response || !response.ok || response.status === 204 || // Cache miss + // This checks whether the response was served from the per-segment cache, + // rather than the old prefetching flow. If it fails, it implies that PPR + // is disabled on this route. Theoretically this should never happen + // because we only issue requests for segments once we've verified that + // the route supports PPR. + response.headers.get(_approuterheaders.NEXT_DID_POSTPONE_HEADER) !== '2' && // In output: "export" mode, we can't rely on response headers. But if + // we receive a well-formed response, we can assume it's a static + // response, because all data is static in this mode. + !isOutputExportMode || !response.body) { + // Server responded with an error, or with a miss. We should still cache + // the response, but we can try again after 10 seconds. + rejectSegmentCacheEntry(segmentCacheEntry, Date.now() + 10 * 1000); + return null; + } + // Track when the network connection closes. + const closed = (0, _promisewithresolvers.createPromiseWithResolvers)(); + // Wrap the original stream in a new stream that never closes. That way the + // Flight client doesn't error if there's a hanging promise. + const prefetchStream = createPrefetchResponseStream(response.body, closed.resolve, function onResponseSizeUpdate(size) { + (0, _cachemap.setSizeInCacheMap)(segmentCacheEntry, size); + }); + const serverData = await (0, _fetchserverresponse.createFromNextReadableStream)(prefetchStream, headers); + if (serverData.buildId !== (0, _appbuildid.getAppBuildId)()) { + // The server build does not match the client. Treat as a 404. During + // an actual navigation, the router will trigger an MPA navigation. + // TODO: Consider moving the build ID to a response header so we can check + // it before decoding the response, and so there's one way of checking + // across all response types. + rejectSegmentCacheEntry(segmentCacheEntry, Date.now() + 10 * 1000); + return null; + } + return { + value: fulfillSegmentCacheEntry(segmentCacheEntry, serverData.rsc, serverData.loading, // So we use the stale time of the route. + route.staleAt, serverData.isPartial), + // Return a promise that resolves when the network connection closes, so + // the scheduler can track the number of concurrent network connections. + closed: closed.promise + }; + } catch (error) { + // Either the connection itself failed, or something bad happened while + // decoding the response. + rejectSegmentCacheEntry(segmentCacheEntry, Date.now() + 10 * 1000); + return null; + } +} +async function fetchSegmentPrefetchesUsingDynamicRequest(task, route, fetchStrategy, dynamicRequestTree, spawnedEntries) { + const key = task.key; + const url = new URL(route.canonicalUrl, location.origin); + const nextUrl = key.nextUrl; + if (spawnedEntries.size === 1 && spawnedEntries.has(route.metadata.requestKey)) { + // The only thing pending is the head. Instruct the server to + // skip over everything else. + dynamicRequestTree = MetadataOnlyRequestTree; + } + const headers = { + [_approuterheaders.RSC_HEADER]: '1', + [_approuterheaders.NEXT_ROUTER_STATE_TREE_HEADER]: (0, _flightdatahelpers.prepareFlightRouterStateForRequest)(dynamicRequestTree) + }; + if (nextUrl !== null) { + headers[_approuterheaders.NEXT_URL] = nextUrl; + } + switch(fetchStrategy){ + case _types.FetchStrategy.Full: + { + break; + } + case _types.FetchStrategy.PPRRuntime: + { + headers[_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER] = '2'; + break; + } + case _types.FetchStrategy.LoadingBoundary: + { + headers[_approuterheaders.NEXT_ROUTER_PREFETCH_HEADER] = '1'; + break; + } + default: + { + fetchStrategy; + } + } + try { + const response = await fetchPrefetchResponse(url, headers); + if (!response || !response.ok || !response.body) { + // Server responded with an error, or with a miss. We should still cache + // the response, but we can try again after 10 seconds. + rejectSegmentEntriesIfStillPending(spawnedEntries, Date.now() + 10 * 1000); + return null; + } + const renderedSearch = (0, _routeparams.getRenderedSearch)(response); + if (renderedSearch !== route.renderedSearch) { + // The search params that were used to render the target page are + // different from the search params in the request URL. This only happens + // when there's a dynamic rewrite in between the tree prefetch and the + // data prefetch. + // TODO: For now, since this is an edge case, we reject the prefetch, but + // the proper way to handle this is to evict the stale route tree entry + // then fill the cache with the new response. + rejectSegmentEntriesIfStillPending(spawnedEntries, Date.now() + 10 * 1000); + return null; + } + // Track when the network connection closes. + const closed = (0, _promisewithresolvers.createPromiseWithResolvers)(); + let fulfilledEntries = null; + const prefetchStream = createPrefetchResponseStream(response.body, closed.resolve, function onResponseSizeUpdate(totalBytesReceivedSoFar) { + // When processing a dynamic response, we don't know how large each + // individual segment is, so approximate by assiging each segment + // the average of the total response size. + if (fulfilledEntries === null) { + // Haven't received enough data yet to know which segments + // were included. + return; + } + const averageSize = totalBytesReceivedSoFar / fulfilledEntries.length; + for (const entry of fulfilledEntries){ + (0, _cachemap.setSizeInCacheMap)(entry, averageSize); + } + }); + const serverData = await (0, _fetchserverresponse.createFromNextReadableStream)(prefetchStream, headers); + const isResponsePartial = fetchStrategy === _types.FetchStrategy.PPRRuntime ? serverData.rp?.[0] === true : false; + // Aside from writing the data into the cache, this function also returns + // the entries that were fulfilled, so we can streamingly update their sizes + // in the LRU as more data comes in. + fulfilledEntries = writeDynamicRenderResponseIntoCache(Date.now(), task, fetchStrategy, response, serverData, isResponsePartial, route, spawnedEntries); + // Return a promise that resolves when the network connection closes, so + // the scheduler can track the number of concurrent network connections. + return { + value: null, + closed: closed.promise + }; + } catch (error) { + rejectSegmentEntriesIfStillPending(spawnedEntries, Date.now() + 10 * 1000); + return null; + } +} +function writeDynamicTreeResponseIntoCache(now, task, fetchStrategy, response, serverData, entry, couldBeIntercepted, canonicalUrl, routeIsPPREnabled) { + // Get the URL that was used to render the target page. This may be different + // from the URL in the request URL, if the page was rewritten. + const renderedSearch = (0, _routeparams.getRenderedSearch)(response); + const normalizedFlightDataResult = (0, _flightdatahelpers.normalizeFlightData)(serverData.f); + if (// MPA navigation. + typeof normalizedFlightDataResult === 'string' || normalizedFlightDataResult.length !== 1) { + rejectRouteCacheEntry(entry, now + 10 * 1000); + return; + } + const flightData = normalizedFlightDataResult[0]; + if (!flightData.isRootRender) { + // Unexpected response format. + rejectRouteCacheEntry(entry, now + 10 * 1000); + return; + } + const flightRouterState = flightData.tree; + // For runtime prefetches, stale time is in the payload at rp[1]. + // For other responses, fall back to the header. + const staleTimeSeconds = typeof serverData.rp?.[1] === 'number' ? serverData.rp[1] : parseInt(response.headers.get(_approuterheaders.NEXT_ROUTER_STALE_TIME_HEADER) ?? '', 10); + const staleTimeMs = !isNaN(staleTimeSeconds) ? getStaleTimeMs(staleTimeSeconds) : _navigatereducer.STATIC_STALETIME_MS; + // If the response contains dynamic holes, then we must conservatively assume + // that any individual segment might contain dynamic holes, and also the + // head. If it did not contain dynamic holes, then we can assume every segment + // and the head is completely static. + const isResponsePartial = response.headers.get(_approuterheaders.NEXT_DID_POSTPONE_HEADER) === '1'; + // Convert the server-sent data into the RouteTree format used by the + // client cache. + // + // During this traversal, we accumulate additional data into this + // "accumulator" object. + const acc = { + metadataVaryPath: null + }; + const routeTree = convertRootFlightRouterStateToRouteTree(flightRouterState, renderedSearch, acc); + const metadataVaryPath = acc.metadataVaryPath; + if (metadataVaryPath === null) { + rejectRouteCacheEntry(entry, now + 10 * 1000); + return; + } + const fulfilledEntry = fulfillRouteCacheEntry(entry, routeTree, metadataVaryPath, now + staleTimeMs, couldBeIntercepted, canonicalUrl, renderedSearch, routeIsPPREnabled); + // If the server sent segment data as part of the response, we should write + // it into the cache to prevent a second, redundant prefetch request. + // + // TODO: When `clientSegmentCache` is enabled, the server does not include + // segment data when responding to a route tree prefetch request. However, + // when `clientSegmentCache` is set to "client-only", and PPR is enabled (or + // the page is fully static), the normal check is bypassed and the server + // responds with the full page. This is a temporary situation until we can + // remove the "client-only" option. Then, we can delete this function call. + writeDynamicRenderResponseIntoCache(now, task, fetchStrategy, response, serverData, isResponsePartial, fulfilledEntry, null); +} +function rejectSegmentEntriesIfStillPending(entries, staleAt) { + const fulfilledEntries = []; + for (const entry of entries.values()){ + if (entry.status === 1) { + rejectSegmentCacheEntry(entry, staleAt); + } else if (entry.status === 2) { + fulfilledEntries.push(entry); + } + } + return fulfilledEntries; +} +function writeDynamicRenderResponseIntoCache(now, task, fetchStrategy, response, serverData, isResponsePartial, route, spawnedEntries) { + if (serverData.b !== (0, _appbuildid.getAppBuildId)()) { + // The server build does not match the client. Treat as a 404. During + // an actual navigation, the router will trigger an MPA navigation. + // TODO: Consider moving the build ID to a response header so we can check + // it before decoding the response, and so there's one way of checking + // across all response types. + if (spawnedEntries !== null) { + rejectSegmentEntriesIfStillPending(spawnedEntries, now + 10 * 1000); + } + return null; + } + const flightDatas = (0, _flightdatahelpers.normalizeFlightData)(serverData.f); + if (typeof flightDatas === 'string') { + // This means navigating to this route will result in an MPA navigation. + // TODO: We should cache this, too, so that the MPA navigation is immediate. + return null; + } + // For runtime prefetches, stale time is in the payload at rp[1]. + // For other responses, fall back to the header. + const staleTimeSeconds = typeof serverData.rp?.[1] === 'number' ? serverData.rp[1] : parseInt(response.headers.get(_approuterheaders.NEXT_ROUTER_STALE_TIME_HEADER) ?? '', 10); + const staleTimeMs = !isNaN(staleTimeSeconds) ? getStaleTimeMs(staleTimeSeconds) : _navigatereducer.STATIC_STALETIME_MS; + const staleAt = now + staleTimeMs; + for (const flightData of flightDatas){ + const seedData = flightData.seedData; + if (seedData !== null) { + // The data sent by the server represents only a subtree of the app. We + // need to find the part of the task tree that matches the response. + // + // segmentPath represents the parent path of subtree. It's a repeating + // pattern of parallel route key and segment: + // + // [string, Segment, string, Segment, string, Segment, ...] + const segmentPath = flightData.segmentPath; + let tree = route.tree; + for(let i = 0; i < segmentPath.length; i += 2){ + const parallelRouteKey = segmentPath[i]; + if (tree?.slots?.[parallelRouteKey] !== undefined) { + tree = tree.slots[parallelRouteKey]; + } else { + if (spawnedEntries !== null) { + rejectSegmentEntriesIfStillPending(spawnedEntries, now + 10 * 1000); + } + return null; + } + } + writeSeedDataIntoCache(now, task, fetchStrategy, route, tree, staleAt, seedData, isResponsePartial, spawnedEntries); + } + const head = flightData.head; + if (head !== null) { + fulfillEntrySpawnedByRuntimePrefetch(now, fetchStrategy, route, head, null, flightData.isHeadPartial, staleAt, route.metadata, spawnedEntries); + } + } + // Any entry that's still pending was intentionally not rendered by the + // server, because it was inside the loading boundary. Mark them as rejected + // so we know not to fetch them again. + // TODO: If PPR is enabled on some routes but not others, then it's possible + // that a different page is able to do a per-segment prefetch of one of the + // segments we're marking as rejected here. We should mark on the segment + // somehow that the reason for the rejection is because of a non-PPR prefetch. + // That way a per-segment prefetch knows to disregard the rejection. + if (spawnedEntries !== null) { + const fulfilledEntries = rejectSegmentEntriesIfStillPending(spawnedEntries, now + 10 * 1000); + return fulfilledEntries; + } + return null; +} +function writeSeedDataIntoCache(now, task, fetchStrategy, route, tree, staleAt, seedData, isResponsePartial, entriesOwnedByCurrentTask) { + // This function is used to write the result of a runtime server request + // (CacheNodeSeedData) into the prefetch cache. + const rsc = seedData[0]; + const loading = seedData[2]; + const isPartial = rsc === null || isResponsePartial; + fulfillEntrySpawnedByRuntimePrefetch(now, fetchStrategy, route, rsc, loading, isPartial, staleAt, tree, entriesOwnedByCurrentTask); + // Recursively write the child data into the cache. + const slots = tree.slots; + if (slots !== null) { + const seedDataChildren = seedData[1]; + for(const parallelRouteKey in slots){ + const childTree = slots[parallelRouteKey]; + const childSeedData = seedDataChildren[parallelRouteKey]; + if (childSeedData !== null && childSeedData !== undefined) { + writeSeedDataIntoCache(now, task, fetchStrategy, route, childTree, staleAt, childSeedData, isResponsePartial, entriesOwnedByCurrentTask); + } + } + } +} +function fulfillEntrySpawnedByRuntimePrefetch(now, fetchStrategy, route, rsc, loading, isPartial, staleAt, tree, entriesOwnedByCurrentTask) { + // We should only write into cache entries that are owned by us. Or create + // a new one and write into that. We must never write over an entry that was + // created by a different task, because that causes data races. + const ownedEntry = entriesOwnedByCurrentTask !== null ? entriesOwnedByCurrentTask.get(tree.requestKey) : undefined; + if (ownedEntry !== undefined) { + fulfillSegmentCacheEntry(ownedEntry, rsc, loading, staleAt, isPartial); + } else { + // There's no matching entry. Attempt to create a new one. + const possiblyNewEntry = readOrCreateSegmentCacheEntry(now, fetchStrategy, route, tree); + if (possiblyNewEntry.status === 0) { + // Confirmed this is a new entry. We can fulfill it. + const newEntry = possiblyNewEntry; + fulfillSegmentCacheEntry(upgradeToPendingSegment(newEntry, fetchStrategy), rsc, loading, staleAt, isPartial); + } else { + // There was already an entry in the cache. But we may be able to + // replace it with the new one from the server. + const newEntry = fulfillSegmentCacheEntry(upgradeToPendingSegment(createDetachedSegmentCacheEntry(staleAt), fetchStrategy), rsc, loading, staleAt, isPartial); + upsertSegmentEntry(now, (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree), newEntry); + } + } +} +async function fetchPrefetchResponse(url, headers) { + const fetchPriority = 'low'; + // When issuing a prefetch request, don't immediately decode the response; we + // use the lower level `createFromResponse` API instead because we need to do + // some extra processing of the response stream. See + // `createPrefetchResponseStream` for more details. + const shouldImmediatelyDecode = false; + const response = await (0, _fetchserverresponse.createFetch)(url, headers, fetchPriority, shouldImmediatelyDecode); + if (!response.ok) { + return null; + } + // Check the content type + if ("TURBOPACK compile-time falsy", 0) { + // In output: "export" mode, we relaxed about the content type, since it's + // not Next.js that's serving the response. If the status is OK, assume the + // response is valid. If it's not a valid response, the Flight client won't + // be able to decode it, and we'll treat it as a miss. + } else { + const contentType = response.headers.get('content-type'); + const isFlightResponse = contentType && contentType.startsWith(_approuterheaders.RSC_CONTENT_TYPE_HEADER); + if (!isFlightResponse) { + return null; + } + } + return response; +} +function createPrefetchResponseStream(originalFlightStream, onStreamClose, onResponseSizeUpdate) { + // When PPR is enabled, prefetch streams may contain references that never + // resolve, because that's how we encode dynamic data access. In the decoded + // object returned by the Flight client, these are reified into hanging + // promises that suspend during render, which is effectively what we want. + // The UI resolves when it switches to the dynamic data stream + // (via useDeferredValue(dynamic, static)). + // + // However, the Flight implementation currently errors if the server closes + // the response before all the references are resolved. As a cheat to work + // around this, we wrap the original stream in a new stream that never closes, + // and therefore doesn't error. + // + // While processing the original stream, we also incrementally update the size + // of the cache entry in the LRU. + let totalByteLength = 0; + const reader = originalFlightStream.getReader(); + return new ReadableStream({ + async pull (controller) { + while(true){ + const { done, value } = await reader.read(); + if (!done) { + // Pass to the target stream and keep consuming the Flight response + // from the server. + controller.enqueue(value); + // Incrementally update the size of the cache entry in the LRU. + // NOTE: Since prefetch responses are delivered in a single chunk, + // it's not really necessary to do this streamingly, but I'm doing it + // anyway in case this changes in the future. + totalByteLength += value.byteLength; + onResponseSizeUpdate(totalByteLength); + continue; + } + // The server stream has closed. Exit, but intentionally do not close + // the target stream. We do notify the caller, though. + onStreamClose(); + return; + } + } + }); +} +function addSegmentPathToUrlInOutputExportMode(url, segmentPath) { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + return url; +} +function canNewFetchStrategyProvideMoreContent(currentStrategy, newStrategy) { + return currentStrategy < newStrategy; +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=cache.js.map +}), +"[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/client/components/segment-cache/scheduler.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + cancelPrefetchTask: null, + isPrefetchTaskDirty: null, + pingPrefetchTask: null, + reschedulePrefetchTask: null, + schedulePrefetchTask: null, + startRevalidationCooldown: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + cancelPrefetchTask: function() { + return cancelPrefetchTask; + }, + isPrefetchTaskDirty: function() { + return isPrefetchTaskDirty; + }, + pingPrefetchTask: function() { + return pingPrefetchTask; + }, + reschedulePrefetchTask: function() { + return reschedulePrefetchTask; + }, + schedulePrefetchTask: function() { + return schedulePrefetchTask; + }, + startRevalidationCooldown: function() { + return startRevalidationCooldown; + } +}); +const _approutertypes = __turbopack_context__.r("[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/shared/lib/app-router-types.js [app-ssr] (ecmascript)"); +const _matchsegments = __turbopack_context__.r("[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/client/components/match-segments.js [app-ssr] (ecmascript)"); +const _cache = __turbopack_context__.r("[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/client/components/segment-cache/cache.js [app-ssr] (ecmascript)"); +const _varypath = __turbopack_context__.r("[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/client/components/segment-cache/vary-path.js [app-ssr] (ecmascript)"); +const _cachekey = __turbopack_context__.r("[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/client/components/segment-cache/cache-key.js [app-ssr] (ecmascript)"); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _segment = __turbopack_context__.r("[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/shared/lib/segment.js [app-ssr] (ecmascript)"); +const scheduleMicrotask = typeof queueMicrotask === 'function' ? queueMicrotask : (fn)=>Promise.resolve().then(fn).catch((error)=>setTimeout(()=>{ + throw error; + })); +const taskHeap = []; +let inProgressRequests = 0; +let sortIdCounter = 0; +let didScheduleMicrotask = false; +// The most recently hovered (or touched, etc) link, i.e. the most recent task +// scheduled at Intent priority. There's only ever a single task at Intent +// priority at a time. We reserve special network bandwidth for this task only. +let mostRecentlyHoveredLink = null; +// CDN cache propagation delay after revalidation (in milliseconds) +const REVALIDATION_COOLDOWN_MS = 300; +// Timeout handle for the revalidation cooldown. When non-null, prefetch +// requests are blocked to allow CDN cache propagation. +let revalidationCooldownTimeoutHandle = null; +function startRevalidationCooldown() { + // Clear any existing timeout in case multiple revalidations happen + // in quick succession. + if (revalidationCooldownTimeoutHandle !== null) { + clearTimeout(revalidationCooldownTimeoutHandle); + } + // Schedule the cooldown to expire after the delay. + revalidationCooldownTimeoutHandle = setTimeout(()=>{ + revalidationCooldownTimeoutHandle = null; + // Retry the prefetch queue now that the cooldown has expired. + ensureWorkIsScheduled(); + }, REVALIDATION_COOLDOWN_MS); +} +function schedulePrefetchTask(key, treeAtTimeOfPrefetch, fetchStrategy, priority, onInvalidate) { + // Spawn a new prefetch task + const task = { + key, + treeAtTimeOfPrefetch, + cacheVersion: (0, _cache.getCurrentCacheVersion)(), + priority, + phase: 1, + hasBackgroundWork: false, + spawnedRuntimePrefetches: null, + fetchStrategy, + sortId: sortIdCounter++, + isCanceled: false, + onInvalidate, + _heapIndex: -1 + }; + trackMostRecentlyHoveredLink(task); + heapPush(taskHeap, task); + // Schedule an async task to process the queue. + // + // The main reason we process the queue in an async task is for batching. + // It's common for a single JS task/event to trigger multiple prefetches. + // By deferring to a microtask, we only process the queue once per JS task. + // If they have different priorities, it also ensures they are processed in + // the optimal order. + ensureWorkIsScheduled(); + return task; +} +function cancelPrefetchTask(task) { + // Remove the prefetch task from the queue. If the task already completed, + // then this is a no-op. + // + // We must also explicitly mark the task as canceled so that a blocked task + // does not get added back to the queue when it's pinged by the network. + task.isCanceled = true; + heapDelete(taskHeap, task); +} +function reschedulePrefetchTask(task, treeAtTimeOfPrefetch, fetchStrategy, priority) { + // Bump the prefetch task to the top of the queue, as if it were a fresh + // task. This is essentially the same as canceling the task and scheduling + // a new one, except it reuses the original object. + // + // The primary use case is to increase the priority of a Link-initated + // prefetch on hover. + // Un-cancel the task, in case it was previously canceled. + task.isCanceled = false; + task.phase = 1; + // Assign a new sort ID to move it ahead of all other tasks at the same + // priority level. (Higher sort IDs are processed first.) + task.sortId = sortIdCounter++; + task.priority = // Intent priority, even if the rescheduled priority is lower. + task === mostRecentlyHoveredLink ? _types.PrefetchPriority.Intent : priority; + task.treeAtTimeOfPrefetch = treeAtTimeOfPrefetch; + task.fetchStrategy = fetchStrategy; + trackMostRecentlyHoveredLink(task); + if (task._heapIndex !== -1) { + // The task is already in the queue. + heapResift(taskHeap, task); + } else { + heapPush(taskHeap, task); + } + ensureWorkIsScheduled(); +} +function isPrefetchTaskDirty(task, nextUrl, tree) { + // This is used to quickly bail out of a prefetch task if the result is + // guaranteed to not have changed since the task was initiated. This is + // strictly an optimization — theoretically, if it always returned true, no + // behavior should change because a full prefetch task will effectively + // perform the same checks. + const currentCacheVersion = (0, _cache.getCurrentCacheVersion)(); + return task.cacheVersion !== currentCacheVersion || task.treeAtTimeOfPrefetch !== tree || task.key.nextUrl !== nextUrl; +} +function trackMostRecentlyHoveredLink(task) { + // Track the mostly recently hovered link, i.e. the most recently scheduled + // task at Intent priority. There must only be one such task at a time. + if (task.priority === _types.PrefetchPriority.Intent && task !== mostRecentlyHoveredLink) { + if (mostRecentlyHoveredLink !== null) { + // Bump the previously hovered link's priority down to Default. + if (mostRecentlyHoveredLink.priority !== _types.PrefetchPriority.Background) { + mostRecentlyHoveredLink.priority = _types.PrefetchPriority.Default; + heapResift(taskHeap, mostRecentlyHoveredLink); + } + } + mostRecentlyHoveredLink = task; + } +} +function ensureWorkIsScheduled() { + if (didScheduleMicrotask) { + // Already scheduled a task to process the queue + return; + } + didScheduleMicrotask = true; + scheduleMicrotask(processQueueInMicrotask); +} +/** + * Checks if we've exceeded the maximum number of concurrent prefetch requests, + * to avoid saturating the browser's internal network queue. This is a + * cooperative limit — prefetch tasks should check this before issuing + * new requests. + * + * Also checks if we're within the revalidation cooldown window, during which + * prefetch requests are delayed to allow CDN cache propagation. + */ function hasNetworkBandwidth(task) { + // Check if we're within the revalidation cooldown window + if (revalidationCooldownTimeoutHandle !== null) { + // We're within the cooldown window. Return false to prevent prefetching. + // When the cooldown expires, the timeout will call ensureWorkIsScheduled() + // to retry the queue. + return false; + } + // TODO: Also check if there's an in-progress navigation. We should never + // add prefetch requests to the network queue if an actual navigation is + // taking place, to ensure there's sufficient bandwidth for render-blocking + // data and resources. + // TODO: Consider reserving some amount of bandwidth for static prefetches. + if (task.priority === _types.PrefetchPriority.Intent) { + // The most recently hovered link is allowed to exceed the default limit. + // + // The goal is to always have enough bandwidth to start a new prefetch + // request when hovering over a link. + // + // However, because we don't abort in-progress requests, it's still possible + // we'll run out of bandwidth. When links are hovered in quick succession, + // there could be multiple hover requests running simultaneously. + return inProgressRequests < 12; + } + // The default limit is lower than the limit for a hovered link. + return inProgressRequests < 4; +} +function spawnPrefetchSubtask(prefetchSubtask) { + // When the scheduler spawns an async task, we don't await its result. + // Instead, the async task writes its result directly into the cache, then + // pings the scheduler to continue. + // + // We process server responses streamingly, so the prefetch subtask will + // likely resolve before we're finished receiving all the data. The subtask + // result includes a promise that resolves once the network connection is + // closed. The scheduler uses this to control network bandwidth by tracking + // and limiting the number of concurrent requests. + inProgressRequests++; + return prefetchSubtask.then((result)=>{ + if (result === null) { + // The prefetch task errored before it could start processing the + // network stream. Assume the connection is closed. + onPrefetchConnectionClosed(); + return null; + } + // Wait for the connection to close before freeing up more bandwidth. + result.closed.then(onPrefetchConnectionClosed); + return result.value; + }); +} +function onPrefetchConnectionClosed() { + inProgressRequests--; + // Notify the scheduler that we have more bandwidth, and can continue + // processing tasks. + ensureWorkIsScheduled(); +} +function pingPrefetchTask(task) { + // "Ping" a prefetch that's already in progress to notify it of new data. + if (task.isCanceled || // Check if prefetch is already queued. + task._heapIndex !== -1) { + return; + } + // Add the task back to the queue. + heapPush(taskHeap, task); + ensureWorkIsScheduled(); +} +function processQueueInMicrotask() { + didScheduleMicrotask = false; + // We aim to minimize how often we read the current time. Since nearly all + // functions in the prefetch scheduler are synchronous, we can read the time + // once and pass it as an argument wherever it's needed. + const now = Date.now(); + // Process the task queue until we run out of network bandwidth. + let task = heapPeek(taskHeap); + while(task !== null && hasNetworkBandwidth(task)){ + task.cacheVersion = (0, _cache.getCurrentCacheVersion)(); + const exitStatus = pingRoute(now, task); + // These fields are only valid for a single attempt. Reset them after each + // iteration of the task queue. + const hasBackgroundWork = task.hasBackgroundWork; + task.hasBackgroundWork = false; + task.spawnedRuntimePrefetches = null; + switch(exitStatus){ + case 0: + // The task yielded because there are too many requests in progress. + // Stop processing tasks until we have more bandwidth. + return; + case 1: + // The task is blocked. It needs more data before it can proceed. + // Keep the task out of the queue until the server responds. + heapPop(taskHeap); + // Continue to the next task + task = heapPeek(taskHeap); + continue; + case 2: + if (task.phase === 1) { + // Finished prefetching the route tree. Proceed to prefetching + // the segments. + task.phase = 0; + heapResift(taskHeap, task); + } else if (hasBackgroundWork) { + // The task spawned additional background work. Reschedule the task + // at background priority. + task.priority = _types.PrefetchPriority.Background; + heapResift(taskHeap, task); + } else { + // The prefetch is complete. Continue to the next task. + heapPop(taskHeap); + } + task = heapPeek(taskHeap); + continue; + default: + exitStatus; + } + } +} +/** + * Check this during a prefetch task to determine if background work can be + * performed. If so, it evaluates to `true`. Otherwise, it returns `false`, + * while also scheduling a background task to run later. Usage: + * + * @example + * if (background(task)) { + * // Perform background-pri work + * } + */ function background(task) { + if (task.priority === _types.PrefetchPriority.Background) { + return true; + } + task.hasBackgroundWork = true; + return false; +} +function pingRoute(now, task) { + const key = task.key; + const route = (0, _cache.readOrCreateRouteCacheEntry)(now, task, key); + const exitStatus = pingRootRouteTree(now, task, route); + if (exitStatus !== 0 && key.search !== '') { + // If the URL has a non-empty search string, also prefetch the pathname + // without the search string. We use the searchless route tree as a base for + // optimistic routing; see requestOptimisticRouteCacheEntry for details. + // + // Note that we don't need to prefetch any of the segment data. Just the + // route tree. + // + // TODO: This is a temporary solution; the plan is to replace this by adding + // a wildcard lookup method to the TupleMap implementation. This is + // non-trivial to implement because it needs to account for things like + // fallback route entries, hence this temporary workaround. + const url = new URL(key.pathname, location.origin); + const keyWithoutSearch = (0, _cachekey.createCacheKey)(url.href, key.nextUrl); + const routeWithoutSearch = (0, _cache.readOrCreateRouteCacheEntry)(now, task, keyWithoutSearch); + switch(routeWithoutSearch.status){ + case _cache.EntryStatus.Empty: + { + if (background(task)) { + routeWithoutSearch.status = _cache.EntryStatus.Pending; + spawnPrefetchSubtask((0, _cache.fetchRouteOnCacheMiss)(routeWithoutSearch, task, keyWithoutSearch)); + } + break; + } + case _cache.EntryStatus.Pending: + case _cache.EntryStatus.Fulfilled: + case _cache.EntryStatus.Rejected: + { + break; + } + default: + routeWithoutSearch; + } + } + return exitStatus; +} +function pingRootRouteTree(now, task, route) { + switch(route.status){ + case _cache.EntryStatus.Empty: + { + // Route is not yet cached, and there's no request already in progress. + // Spawn a task to request the route, load it into the cache, and ping + // the task to continue. + // TODO: There are multiple strategies in the API for prefetching + // a route. Currently we've only implemented the main one: per-segment, + // static-data only. + // + // There's also `` + // which prefetch both static *and* dynamic data. + // Similarly, we need to fallback to the old, per-page + // behavior if PPR is disabled for a route (via the incremental opt-in). + // + // Those cases will be handled here. + spawnPrefetchSubtask((0, _cache.fetchRouteOnCacheMiss)(route, task, task.key)); + // If the request takes longer than a minute, a subsequent request should + // retry instead of waiting for this one. When the response is received, + // this value will be replaced by a new value based on the stale time sent + // from the server. + // TODO: We should probably also manually abort the fetch task, to reclaim + // server bandwidth. + route.staleAt = now + 60 * 1000; + // Upgrade to Pending so we know there's already a request in progress + route.status = _cache.EntryStatus.Pending; + // Intentional fallthrough to the Pending branch + } + case _cache.EntryStatus.Pending: + { + // Still pending. We can't start prefetching the segments until the route + // tree has loaded. Add the task to the set of blocked tasks so that it + // is notified when the route tree is ready. + const blockedTasks = route.blockedTasks; + if (blockedTasks === null) { + route.blockedTasks = new Set([ + task + ]); + } else { + blockedTasks.add(task); + } + return 1; + } + case _cache.EntryStatus.Rejected: + { + // Route tree failed to load. Treat as a 404. + return 2; + } + case _cache.EntryStatus.Fulfilled: + { + if (task.phase !== 0) { + // Do not prefetch segment data until we've entered the segment phase. + return 2; + } + // Recursively fill in the segment tree. + if (!hasNetworkBandwidth(task)) { + // Stop prefetching segments until there's more bandwidth. + return 0; + } + const tree = route.tree; + // A task's fetch strategy gets set to `PPR` for any "auto" prefetch. + // If it turned out that the route isn't PPR-enabled, we need to use `LoadingBoundary` instead. + // We don't need to do this for runtime prefetches, because those are only available in + // `cacheComponents`, where every route is PPR. + const fetchStrategy = task.fetchStrategy === _types.FetchStrategy.PPR ? route.isPPREnabled ? _types.FetchStrategy.PPR : _types.FetchStrategy.LoadingBoundary : task.fetchStrategy; + switch(fetchStrategy){ + case _types.FetchStrategy.PPR: + { + // For Cache Components pages, each segment may be prefetched + // statically or using a runtime request, based on various + // configurations and heuristics. We'll do this in two passes: first + // traverse the tree and perform all the static prefetches. + // + // Then, if there are any segments that need a runtime request, + // do another pass to perform a runtime prefetch. + pingStaticHead(now, task, route); + const exitStatus = pingSharedPartOfCacheComponentsTree(now, task, route, task.treeAtTimeOfPrefetch, tree); + if (exitStatus === 0) { + // Child yielded without finishing. + return 0; + } + const spawnedRuntimePrefetches = task.spawnedRuntimePrefetches; + if (spawnedRuntimePrefetches !== null) { + // During the first pass, we discovered segments that require a + // runtime prefetch. Do a second pass to construct a request tree. + const spawnedEntries = new Map(); + pingRuntimeHead(now, task, route, spawnedEntries, _types.FetchStrategy.PPRRuntime); + const requestTree = pingRuntimePrefetches(now, task, route, tree, spawnedRuntimePrefetches, spawnedEntries); + let needsDynamicRequest = spawnedEntries.size > 0; + if (needsDynamicRequest) { + // Perform a dynamic prefetch request and populate the cache with + // the result. + spawnPrefetchSubtask((0, _cache.fetchSegmentPrefetchesUsingDynamicRequest)(task, route, _types.FetchStrategy.PPRRuntime, requestTree, spawnedEntries)); + } + } + return 2; + } + case _types.FetchStrategy.Full: + case _types.FetchStrategy.PPRRuntime: + case _types.FetchStrategy.LoadingBoundary: + { + // Prefetch multiple segments using a single dynamic request. + // TODO: We can consolidate this branch with previous one by modeling + // it as if the first segment in the new tree has runtime prefetching + // enabled. Will do this as a follow-up refactor. Might want to remove + // the special metatdata case below first. In the meantime, it's not + // really that much duplication, just would be nice to remove one of + // these codepaths. + const spawnedEntries = new Map(); + pingRuntimeHead(now, task, route, spawnedEntries, fetchStrategy); + const dynamicRequestTree = diffRouteTreeAgainstCurrent(now, task, route, task.treeAtTimeOfPrefetch, tree, spawnedEntries, fetchStrategy); + let needsDynamicRequest = spawnedEntries.size > 0; + if (needsDynamicRequest) { + spawnPrefetchSubtask((0, _cache.fetchSegmentPrefetchesUsingDynamicRequest)(task, route, fetchStrategy, dynamicRequestTree, spawnedEntries)); + } + return 2; + } + default: + fetchStrategy; + } + break; + } + default: + { + route; + } + } + return 2; +} +function pingStaticHead(now, task, route) { + // The Head data for a page (metadata, viewport) is not really a route + // segment, in the sense that it doesn't appear in the route tree. But we + // store it in the cache as if it were, using a special key. + pingStaticSegmentData(now, task, route, (0, _cache.readOrCreateSegmentCacheEntry)(now, _types.FetchStrategy.PPR, route, route.metadata), task.key, route.metadata); +} +function pingRuntimeHead(now, task, route, spawnedEntries, fetchStrategy) { + pingRouteTreeAndIncludeDynamicData(now, task, route, route.metadata, false, spawnedEntries, // and LoadingBoundary + fetchStrategy === _types.FetchStrategy.LoadingBoundary ? _types.FetchStrategy.Full : fetchStrategy); +} +// TODO: Rename dynamic -> runtime throughout this module +function pingSharedPartOfCacheComponentsTree(now, task, route, oldTree, newTree) { + // When Cache Components is enabled (or PPR, or a fully static route when PPR + // is disabled; those cases are treated equivalently to Cache Components), we + // start by prefetching each segment individually. Once we reach the "new" + // part of the tree — the part that doesn't exist on the current page — we + // may choose to switch to a runtime prefetch instead, based on the + // information sent by the server in the route tree. + // + // The traversal starts in the "shared" part of the tree. Once we reach the + // "new" part of the tree, we switch to a different traversal, + // pingNewPartOfCacheComponentsTree. + // Prefetch this segment's static data. + const segment = (0, _cache.readOrCreateSegmentCacheEntry)(now, task.fetchStrategy, route, newTree); + pingStaticSegmentData(now, task, route, segment, task.key, newTree); + // Recursively ping the children. + const oldTreeChildren = oldTree[1]; + const newTreeChildren = newTree.slots; + if (newTreeChildren !== null) { + for(const parallelRouteKey in newTreeChildren){ + if (!hasNetworkBandwidth(task)) { + // Stop prefetching segments until there's more bandwidth. + return 0; + } + const newTreeChild = newTreeChildren[parallelRouteKey]; + const newTreeChildSegment = newTreeChild.segment; + const oldTreeChild = oldTreeChildren[parallelRouteKey]; + const oldTreeChildSegment = oldTreeChild?.[0]; + let childExitStatus; + if (oldTreeChildSegment !== undefined && doesCurrentSegmentMatchCachedSegment(route, newTreeChildSegment, oldTreeChildSegment)) { + // We're still in the "shared" part of the tree. + childExitStatus = pingSharedPartOfCacheComponentsTree(now, task, route, oldTreeChild, newTreeChild); + } else { + // We've entered the "new" part of the tree. Switch + // traversal functions. + childExitStatus = pingNewPartOfCacheComponentsTree(now, task, route, newTreeChild); + } + if (childExitStatus === 0) { + // Child yielded without finishing. + return 0; + } + } + } + return 2; +} +function pingNewPartOfCacheComponentsTree(now, task, route, tree) { + // We're now prefetching in the "new" part of the tree, the part that doesn't + // exist on the current page. (In other words, we're deeper than the + // shared layouts.) Segments in here default to being prefetched statically. + // However, if the server instructs us to, we may switch to a runtime + // prefetch instead. Traverse the tree and check at each segment. + if (tree.hasRuntimePrefetch) { + // This route has a runtime prefetch response. Since we're below the shared + // layout, everything from this point should be prefetched using a single, + // combined runtime request, rather than using per-segment static requests. + // This is true even if some of the child segments are known to be fully + // static — once we've decided to perform a runtime prefetch, we might as + // well respond with the static segments in the same roundtrip. (That's how + // regular navigations work, too.) We'll still skip over segments that are + // already cached, though. + // + // It's the server's responsibility to set a reasonable value of + // `hasRuntimePrefetch`. Currently it's user-defined, but eventually, the + // server may send a value of `false` even if the user opts in, if it + // determines during build that the route is always fully static. There are + // more optimizations we can do once we implement fallback param + // tracking, too. + // + // Use the task object to collect the segments that need a runtime prefetch. + // This will signal to the outer task queue that a second traversal is + // required to construct a request tree. + if (task.spawnedRuntimePrefetches === null) { + task.spawnedRuntimePrefetches = new Set([ + tree.requestKey + ]); + } else { + task.spawnedRuntimePrefetches.add(tree.requestKey); + } + // Then exit the traversal without prefetching anything further. + return 2; + } + // This segment should not be runtime prefetched. Prefetch its static data. + const segment = (0, _cache.readOrCreateSegmentCacheEntry)(now, task.fetchStrategy, route, tree); + pingStaticSegmentData(now, task, route, segment, task.key, tree); + if (tree.slots !== null) { + if (!hasNetworkBandwidth(task)) { + // Stop prefetching segments until there's more bandwidth. + return 0; + } + // Recursively ping the children. + for(const parallelRouteKey in tree.slots){ + const childTree = tree.slots[parallelRouteKey]; + const childExitStatus = pingNewPartOfCacheComponentsTree(now, task, route, childTree); + if (childExitStatus === 0) { + // Child yielded without finishing. + return 0; + } + } + } + // This segment and all its children have finished prefetching. + return 2; +} +function diffRouteTreeAgainstCurrent(now, task, route, oldTree, newTree, spawnedEntries, fetchStrategy) { + // This is a single recursive traversal that does multiple things: + // - Finds the parts of the target route (newTree) that are not part of + // of the current page (oldTree) by diffing them, using the same algorithm + // as a real navigation. + // - Constructs a request tree (FlightRouterState) that describes which + // segments need to be prefetched and which ones are already cached. + // - Creates a set of pending cache entries for the segments that need to + // be prefetched, so that a subsequent prefetch task does not request the + // same segments again. + const oldTreeChildren = oldTree[1]; + const newTreeChildren = newTree.slots; + let requestTreeChildren = {}; + if (newTreeChildren !== null) { + for(const parallelRouteKey in newTreeChildren){ + const newTreeChild = newTreeChildren[parallelRouteKey]; + const newTreeChildSegment = newTreeChild.segment; + const oldTreeChild = oldTreeChildren[parallelRouteKey]; + const oldTreeChildSegment = oldTreeChild?.[0]; + if (oldTreeChildSegment !== undefined && doesCurrentSegmentMatchCachedSegment(route, newTreeChildSegment, oldTreeChildSegment)) { + // This segment is already part of the current route. Keep traversing. + const requestTreeChild = diffRouteTreeAgainstCurrent(now, task, route, oldTreeChild, newTreeChild, spawnedEntries, fetchStrategy); + requestTreeChildren[parallelRouteKey] = requestTreeChild; + } else { + // This segment is not part of the current route. We're entering a + // part of the tree that we need to prefetch (unless everything is + // already cached). + switch(fetchStrategy){ + case _types.FetchStrategy.LoadingBoundary: + { + // When PPR is disabled, we can't prefetch per segment. We must + // fallback to the old prefetch behavior and send a dynamic request. + // Only routes that include a loading boundary can be prefetched in + // this way. + // + // This is simlar to a "full" prefetch, but we're much more + // conservative about which segments to include in the request. + // + // The server will only render up to the first loading boundary + // inside new part of the tree. If there's no loading boundary + // anywhere in the tree, the server will never return any data, so + // we can skip the request. + const subtreeHasLoadingBoundary = newTreeChild.hasLoadingBoundary !== _approutertypes.HasLoadingBoundary.SubtreeHasNoLoadingBoundary; + const requestTreeChild = subtreeHasLoadingBoundary ? pingPPRDisabledRouteTreeUpToLoadingBoundary(now, task, route, newTreeChild, null, spawnedEntries) : (0, _cache.convertRouteTreeToFlightRouterState)(newTreeChild); + requestTreeChildren[parallelRouteKey] = requestTreeChild; + break; + } + case _types.FetchStrategy.PPRRuntime: + { + // This is a runtime prefetch. Fetch all cacheable data in the tree, + // not just the static PPR shell. + const requestTreeChild = pingRouteTreeAndIncludeDynamicData(now, task, route, newTreeChild, false, spawnedEntries, fetchStrategy); + requestTreeChildren[parallelRouteKey] = requestTreeChild; + break; + } + case _types.FetchStrategy.Full: + { + // This is a "full" prefetch. Fetch all the data in the tree, both + // static and dynamic. We issue roughly the same request that we + // would during a real navigation. The goal is that once the + // navigation occurs, the router should not have to fetch any + // additional data. + // + // Although the response will include dynamic data, opting into a + // Full prefetch — via — implicitly + // instructs the cache to treat the response as "static", or non- + // dynamic, since the whole point is to cache it for + // future navigations. + // + // Construct a tree (currently a FlightRouterState) that represents + // which segments need to be prefetched and which ones are already + // cached. If the tree is empty, then we can exit. Otherwise, we'll + // send the request tree to the server and use the response to + // populate the segment cache. + const requestTreeChild = pingRouteTreeAndIncludeDynamicData(now, task, route, newTreeChild, false, spawnedEntries, fetchStrategy); + requestTreeChildren[parallelRouteKey] = requestTreeChild; + break; + } + default: + fetchStrategy; + } + } + } + } + const requestTree = [ + newTree.segment, + requestTreeChildren, + null, + null, + newTree.isRootLayout + ]; + return requestTree; +} +function pingPPRDisabledRouteTreeUpToLoadingBoundary(now, task, route, tree, refetchMarkerContext, spawnedEntries) { + // This function is similar to pingRouteTreeAndIncludeDynamicData, except the + // server is only going to return a minimal loading state — it will stop + // rendering at the first loading boundary. Whereas a Full prefetch is + // intentionally aggressive and tries to pretfetch all the data that will be + // needed for a navigation, a LoadingBoundary prefetch is much more + // conservative. For example, it will omit from the request tree any segment + // that is already cached, regardles of whether it's partial or full. By + // contrast, a Full prefetch will refetch partial segments. + // "inside-shared-layout" tells the server where to start looking for a + // loading boundary. + let refetchMarker = refetchMarkerContext === null ? 'inside-shared-layout' : null; + const segment = (0, _cache.readOrCreateSegmentCacheEntry)(now, task.fetchStrategy, route, tree); + switch(segment.status){ + case _cache.EntryStatus.Empty: + { + // This segment is not cached. Add a refetch marker so the server knows + // to start rendering here. + // TODO: Instead of a "refetch" marker, we could just omit this subtree's + // FlightRouterState from the request tree. I think this would probably + // already work even without any updates to the server. For consistency, + // though, I'll send the full tree and we'll look into this later as part + // of a larger redesign of the request protocol. + // Add the pending cache entry to the result map. + spawnedEntries.set(tree.requestKey, (0, _cache.upgradeToPendingSegment)(segment, // might not include it in the pending response. If another route is able + // to issue a per-segment request, we'll do that in the background. + _types.FetchStrategy.LoadingBoundary)); + if (refetchMarkerContext !== 'refetch') { + refetchMarker = refetchMarkerContext = 'refetch'; + } else { + // There's already a parent with a refetch marker, so we don't need + // to add another one. + } + break; + } + case _cache.EntryStatus.Fulfilled: + { + // The segment is already cached. + const segmentHasLoadingBoundary = tree.hasLoadingBoundary === _approutertypes.HasLoadingBoundary.SegmentHasLoadingBoundary; + if (segmentHasLoadingBoundary) { + // This segment has a loading boundary, which means the server won't + // render its children. So there's nothing left to prefetch along this + // path. We can bail out. + return (0, _cache.convertRouteTreeToFlightRouterState)(tree); + } + break; + } + case _cache.EntryStatus.Pending: + { + break; + } + case _cache.EntryStatus.Rejected: + { + break; + } + default: + segment; + } + const requestTreeChildren = {}; + if (tree.slots !== null) { + for(const parallelRouteKey in tree.slots){ + const childTree = tree.slots[parallelRouteKey]; + requestTreeChildren[parallelRouteKey] = pingPPRDisabledRouteTreeUpToLoadingBoundary(now, task, route, childTree, refetchMarkerContext, spawnedEntries); + } + } + const requestTree = [ + tree.segment, + requestTreeChildren, + null, + refetchMarker, + tree.isRootLayout + ]; + return requestTree; +} +function pingRouteTreeAndIncludeDynamicData(now, task, route, tree, isInsideRefetchingParent, spawnedEntries, fetchStrategy) { + // The tree we're constructing is the same shape as the tree we're navigating + // to. But even though this is a "new" tree, some of the individual segments + // may be cached as a result of other route prefetches. + // + // So we need to find the first uncached segment along each path add an + // explicit "refetch" marker so the server knows where to start rendering. + // Once the server starts rendering along a path, it keeps rendering the + // entire subtree. + const segment = (0, _cache.readOrCreateSegmentCacheEntry)(now, // and we have to use the former here. + // We can have a task with `FetchStrategy.PPR` where some of its segments are configured to + // always use runtime prefetching (via `export const prefetch`), and those should check for + // entries that include search params. + fetchStrategy, route, tree); + let spawnedSegment = null; + switch(segment.status){ + case _cache.EntryStatus.Empty: + { + // This segment is not cached. Include it in the request. + spawnedSegment = (0, _cache.upgradeToPendingSegment)(segment, fetchStrategy); + break; + } + case _cache.EntryStatus.Fulfilled: + { + // The segment is already cached. + if (segment.isPartial && (0, _cache.canNewFetchStrategyProvideMoreContent)(segment.fetchStrategy, fetchStrategy)) { + // The cached segment contains dynamic holes, and was prefetched using a less specific strategy than the current one. + // This means we're in one of these cases: + // - we have a static prefetch, and we're doing a runtime prefetch + // - we have a static or runtime prefetch, and we're doing a Full prefetch (or a navigation). + // In either case, we need to include it in the request to get a more specific (or full) version. + spawnedSegment = pingFullSegmentRevalidation(now, route, tree, fetchStrategy); + } + break; + } + case _cache.EntryStatus.Pending: + case _cache.EntryStatus.Rejected: + { + // There's either another prefetch currently in progress, or the previous + // attempt failed. If the new strategy can provide more content, fetch it again. + if ((0, _cache.canNewFetchStrategyProvideMoreContent)(segment.fetchStrategy, fetchStrategy)) { + spawnedSegment = pingFullSegmentRevalidation(now, route, tree, fetchStrategy); + } + break; + } + default: + segment; + } + const requestTreeChildren = {}; + if (tree.slots !== null) { + for(const parallelRouteKey in tree.slots){ + const childTree = tree.slots[parallelRouteKey]; + requestTreeChildren[parallelRouteKey] = pingRouteTreeAndIncludeDynamicData(now, task, route, childTree, isInsideRefetchingParent || spawnedSegment !== null, spawnedEntries, fetchStrategy); + } + } + if (spawnedSegment !== null) { + // Add the pending entry to the result map. + spawnedEntries.set(tree.requestKey, spawnedSegment); + } + // Don't bother to add a refetch marker if one is already present in a parent. + const refetchMarker = !isInsideRefetchingParent && spawnedSegment !== null ? 'refetch' : null; + const requestTree = [ + tree.segment, + requestTreeChildren, + null, + refetchMarker, + tree.isRootLayout + ]; + return requestTree; +} +function pingRuntimePrefetches(now, task, route, tree, spawnedRuntimePrefetches, spawnedEntries) { + // Construct a request tree (FlightRouterState) for a runtime prefetch. If + // a segment is part of the runtime prefetch, the tree is constructed by + // diffing against what's already in the prefetch cache. Otherwise, we send + // a regular FlightRouterState with no special markers. + // + // See pingRouteTreeAndIncludeDynamicData for details. + if (spawnedRuntimePrefetches.has(tree.requestKey)) { + // This segment needs a runtime prefetch. + return pingRouteTreeAndIncludeDynamicData(now, task, route, tree, false, spawnedEntries, _types.FetchStrategy.PPRRuntime); + } + let requestTreeChildren = {}; + const slots = tree.slots; + if (slots !== null) { + for(const parallelRouteKey in slots){ + const childTree = slots[parallelRouteKey]; + requestTreeChildren[parallelRouteKey] = pingRuntimePrefetches(now, task, route, childTree, spawnedRuntimePrefetches, spawnedEntries); + } + } + // This segment is not part of the runtime prefetch. Clone the base tree. + const requestTree = [ + tree.segment, + requestTreeChildren, + null, + null + ]; + return requestTree; +} +function pingStaticSegmentData(now, task, route, segment, routeKey, tree) { + switch(segment.status){ + case _cache.EntryStatus.Empty: + // Upgrade to Pending so we know there's already a request in progress + spawnPrefetchSubtask((0, _cache.fetchSegmentOnCacheMiss)(route, (0, _cache.upgradeToPendingSegment)(segment, _types.FetchStrategy.PPR), routeKey, tree)); + break; + case _cache.EntryStatus.Pending: + { + // There's already a request in progress. Depending on what kind of + // request it is, we may want to revalidate it. + switch(segment.fetchStrategy){ + case _types.FetchStrategy.PPR: + case _types.FetchStrategy.PPRRuntime: + case _types.FetchStrategy.Full: + break; + case _types.FetchStrategy.LoadingBoundary: + // There's a pending request, but because it's using the old + // prefetching strategy, we can't be sure if it will be fulfilled by + // the response — it might be inside the loading boundary. Perform + // a revalidation, but because it's speculative, wait to do it at + // background priority. + if (background(task)) { + // TODO: Instead of speculatively revalidating, consider including + // `hasLoading` in the route tree prefetch response. + pingPPRSegmentRevalidation(now, route, routeKey, tree); + } + break; + default: + segment.fetchStrategy; + } + break; + } + case _cache.EntryStatus.Rejected: + { + // The existing entry in the cache was rejected. Depending on how it + // was originally fetched, we may or may not want to revalidate it. + switch(segment.fetchStrategy){ + case _types.FetchStrategy.PPR: + case _types.FetchStrategy.PPRRuntime: + case _types.FetchStrategy.Full: + break; + case _types.FetchStrategy.LoadingBoundary: + // There's a rejected entry, but it was fetched using the loading + // boundary strategy. So the reason it wasn't returned by the server + // might just be because it was inside a loading boundary. Or because + // there was a dynamic rewrite. Revalidate it using the per- + // segment strategy. + // + // Because a rejected segment will definitely prevent the segment (and + // all of its children) from rendering, we perform this revalidation + // immediately instead of deferring it to a background task. + pingPPRSegmentRevalidation(now, route, routeKey, tree); + break; + default: + segment.fetchStrategy; + } + break; + } + case _cache.EntryStatus.Fulfilled: + break; + default: + segment; + } +// Segments do not have dependent tasks, so once the prefetch is initiated, +// there's nothing else for us to do (except write the server data into the +// entry, which is handled by `fetchSegmentOnCacheMiss`). +} +function pingPPRSegmentRevalidation(now, route, routeKey, tree) { + const revalidatingSegment = (0, _cache.readOrCreateRevalidatingSegmentEntry)(now, _types.FetchStrategy.PPR, route, tree); + switch(revalidatingSegment.status){ + case _cache.EntryStatus.Empty: + // Spawn a prefetch request and upsert the segment into the cache + // upon completion. + upsertSegmentOnCompletion(spawnPrefetchSubtask((0, _cache.fetchSegmentOnCacheMiss)(route, (0, _cache.upgradeToPendingSegment)(revalidatingSegment, _types.FetchStrategy.PPR), routeKey, tree)), (0, _varypath.getSegmentVaryPathForRequest)(_types.FetchStrategy.PPR, tree)); + break; + case _cache.EntryStatus.Pending: + break; + case _cache.EntryStatus.Fulfilled: + case _cache.EntryStatus.Rejected: + break; + default: + revalidatingSegment; + } +} +function pingFullSegmentRevalidation(now, route, tree, fetchStrategy) { + const revalidatingSegment = (0, _cache.readOrCreateRevalidatingSegmentEntry)(now, fetchStrategy, route, tree); + if (revalidatingSegment.status === _cache.EntryStatus.Empty) { + // During a Full/PPRRuntime prefetch, a single dynamic request is made for all the + // segments that we need. So we don't initiate a request here directly. By + // returning a pending entry from this function, it signals to the caller + // that this segment should be included in the request that's sent to + // the server. + const pendingSegment = (0, _cache.upgradeToPendingSegment)(revalidatingSegment, fetchStrategy); + upsertSegmentOnCompletion((0, _cache.waitForSegmentCacheEntry)(pendingSegment), (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree)); + return pendingSegment; + } else { + // There's already a revalidation in progress. + const nonEmptyRevalidatingSegment = revalidatingSegment; + if ((0, _cache.canNewFetchStrategyProvideMoreContent)(nonEmptyRevalidatingSegment.fetchStrategy, fetchStrategy)) { + // The existing revalidation was fetched using a less specific strategy. + // Reset it and start a new revalidation. + const emptySegment = (0, _cache.overwriteRevalidatingSegmentCacheEntry)(fetchStrategy, route, tree); + const pendingSegment = (0, _cache.upgradeToPendingSegment)(emptySegment, fetchStrategy); + upsertSegmentOnCompletion((0, _cache.waitForSegmentCacheEntry)(pendingSegment), (0, _varypath.getSegmentVaryPathForRequest)(fetchStrategy, tree)); + return pendingSegment; + } + switch(nonEmptyRevalidatingSegment.status){ + case _cache.EntryStatus.Pending: + // There's already an in-progress prefetch that includes this segment. + return null; + case _cache.EntryStatus.Fulfilled: + case _cache.EntryStatus.Rejected: + // A previous revalidation attempt finished, but we chose not to replace + // the existing entry in the cache. Don't try again until or unless the + // revalidation entry expires. + return null; + default: + nonEmptyRevalidatingSegment; + return null; + } + } +} +const noop = ()=>{}; +function upsertSegmentOnCompletion(promise, varyPath) { + // Wait for a segment to finish loading, then upsert it into the cache + promise.then((fulfilled)=>{ + if (fulfilled !== null) { + // Received new data. Attempt to replace the existing entry in the cache. + (0, _cache.upsertSegmentEntry)(Date.now(), varyPath, fulfilled); + } + }, noop); +} +function doesCurrentSegmentMatchCachedSegment(route, currentSegment, cachedSegment) { + if (cachedSegment === _segment.PAGE_SEGMENT_KEY) { + // In the FlightRouterState stored by the router, the page segment has the + // rendered search params appended to the name of the segment. In the + // prefetch cache, however, this is stored separately. So, when comparing + // the router's current FlightRouterState to the cached FlightRouterState, + // we need to make sure we compare both parts of the segment. + // TODO: This is not modeled clearly. We use the same type, + // FlightRouterState, for both the CacheNode tree _and_ the prefetch cache + // _and_ the server response format, when conceptually those are three + // different things and treated in different ways. We should encode more of + // this information into the type design so mistakes are less likely. + return currentSegment === (0, _segment.addSearchParamsIfPageSegment)(_segment.PAGE_SEGMENT_KEY, Object.fromEntries(new URLSearchParams(route.renderedSearch))); + } + // Non-page segments are compared using the same function as the server + return (0, _matchsegments.matchSegment)(cachedSegment, currentSegment); +} +// ----------------------------------------------------------------------------- +// The remainder of the module is a MinHeap implementation. Try not to put any +// logic below here unless it's related to the heap algorithm. We can extract +// this to a separate module if/when we need multiple kinds of heaps. +// ----------------------------------------------------------------------------- +function compareQueuePriority(a, b) { + // Since the queue is a MinHeap, this should return a positive number if b is + // higher priority than a, and a negative number if a is higher priority + // than b. + // `priority` is an integer, where higher numbers are higher priority. + const priorityDiff = b.priority - a.priority; + if (priorityDiff !== 0) { + return priorityDiff; + } + // If the priority is the same, check which phase the prefetch is in — is it + // prefetching the route tree, or the segments? Route trees are prioritized. + const phaseDiff = b.phase - a.phase; + if (phaseDiff !== 0) { + return phaseDiff; + } + // Finally, check the insertion order. `sortId` is an incrementing counter + // assigned to prefetches. We want to process the newest prefetches first. + return b.sortId - a.sortId; +} +function heapPush(heap, node) { + const index = heap.length; + heap.push(node); + node._heapIndex = index; + heapSiftUp(heap, node, index); +} +function heapPeek(heap) { + return heap.length === 0 ? null : heap[0]; +} +function heapPop(heap) { + if (heap.length === 0) { + return null; + } + const first = heap[0]; + first._heapIndex = -1; + const last = heap.pop(); + if (last !== first) { + heap[0] = last; + last._heapIndex = 0; + heapSiftDown(heap, last, 0); + } + return first; +} +function heapDelete(heap, node) { + const index = node._heapIndex; + if (index !== -1) { + node._heapIndex = -1; + if (heap.length !== 0) { + const last = heap.pop(); + if (last !== node) { + heap[index] = last; + last._heapIndex = index; + heapSiftDown(heap, last, index); + } + } + } +} +function heapResift(heap, node) { + const index = node._heapIndex; + if (index !== -1) { + if (index === 0) { + heapSiftDown(heap, node, 0); + } else { + const parentIndex = index - 1 >>> 1; + const parent = heap[parentIndex]; + if (compareQueuePriority(parent, node) > 0) { + // The parent is larger. Sift up. + heapSiftUp(heap, node, index); + } else { + // The parent is smaller (or equal). Sift down. + heapSiftDown(heap, node, index); + } + } + } +} +function heapSiftUp(heap, node, i) { + let index = i; + while(index > 0){ + const parentIndex = index - 1 >>> 1; + const parent = heap[parentIndex]; + if (compareQueuePriority(parent, node) > 0) { + // The parent is larger. Swap positions. + heap[parentIndex] = node; + node._heapIndex = parentIndex; + heap[index] = parent; + parent._heapIndex = index; + index = parentIndex; + } else { + // The parent is smaller. Exit. + return; + } + } +} +function heapSiftDown(heap, node, i) { + let index = i; + const length = heap.length; + const halfLength = length >>> 1; + while(index < halfLength){ + const leftIndex = (index + 1) * 2 - 1; + const left = heap[leftIndex]; + const rightIndex = leftIndex + 1; + const right = heap[rightIndex]; + // If the left or right node is smaller, swap with the smaller of those. + if (compareQueuePriority(left, node) < 0) { + if (rightIndex < length && compareQueuePriority(right, left) < 0) { + heap[index] = right; + right._heapIndex = index; + heap[rightIndex] = node; + node._heapIndex = rightIndex; + index = rightIndex; + } else { + heap[index] = left; + left._heapIndex = index; + heap[leftIndex] = node; + node._heapIndex = leftIndex; + index = leftIndex; + } + } else if (rightIndex < length && compareQueuePriority(right, node) < 0) { + heap[index] = right; + right._heapIndex = index; + heap[rightIndex] = node; + node._heapIndex = rightIndex; + index = rightIndex; + } else { + // Neither child is smaller. Exit. + return; + } + } +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=scheduler.js.map +}), +"[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/client/components/links.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + IDLE_LINK_STATUS: null, + PENDING_LINK_STATUS: null, + mountFormInstance: null, + mountLinkInstance: null, + onLinkVisibilityChanged: null, + onNavigationIntent: null, + pingVisibleLinks: null, + setLinkForCurrentNavigation: null, + unmountLinkForCurrentNavigation: null, + unmountPrefetchableInstance: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + IDLE_LINK_STATUS: function() { + return IDLE_LINK_STATUS; + }, + PENDING_LINK_STATUS: function() { + return PENDING_LINK_STATUS; + }, + mountFormInstance: function() { + return mountFormInstance; + }, + mountLinkInstance: function() { + return mountLinkInstance; + }, + onLinkVisibilityChanged: function() { + return onLinkVisibilityChanged; + }, + onNavigationIntent: function() { + return onNavigationIntent; + }, + pingVisibleLinks: function() { + return pingVisibleLinks; + }, + setLinkForCurrentNavigation: function() { + return setLinkForCurrentNavigation; + }, + unmountLinkForCurrentNavigation: function() { + return unmountLinkForCurrentNavigation; + }, + unmountPrefetchableInstance: function() { + return unmountPrefetchableInstance; + } +}); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _cachekey = __turbopack_context__.r("[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/client/components/segment-cache/cache-key.js [app-ssr] (ecmascript)"); +const _scheduler = __turbopack_context__.r("[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/client/components/segment-cache/scheduler.js [app-ssr] (ecmascript)"); +const _react = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +// Tracks the most recently navigated link instance. When null, indicates +// the current navigation was not initiated by a link click. +let linkForMostRecentNavigation = null; +const PENDING_LINK_STATUS = { + pending: true +}; +const IDLE_LINK_STATUS = { + pending: false +}; +function setLinkForCurrentNavigation(link) { + (0, _react.startTransition)(()=>{ + linkForMostRecentNavigation?.setOptimisticLinkStatus(IDLE_LINK_STATUS); + link?.setOptimisticLinkStatus(PENDING_LINK_STATUS); + linkForMostRecentNavigation = link; + }); +} +function unmountLinkForCurrentNavigation(link) { + if (linkForMostRecentNavigation === link) { + linkForMostRecentNavigation = null; + } +} +// Use a WeakMap to associate a Link instance with its DOM element. This is +// used by the IntersectionObserver to track the link's visibility. +const prefetchable = typeof WeakMap === 'function' ? new WeakMap() : new Map(); +// A Set of the currently visible links. We re-prefetch visible links after a +// cache invalidation, or when the current URL changes. It's a separate data +// structure from the WeakMap above because only the visible links need to +// be enumerated. +const prefetchableAndVisible = new Set(); +// A single IntersectionObserver instance shared by all components. +const observer = typeof IntersectionObserver === 'function' ? new IntersectionObserver(handleIntersect, { + rootMargin: '200px' +}) : null; +function observeVisibility(element, instance) { + const existingInstance = prefetchable.get(element); + if (existingInstance !== undefined) { + // This shouldn't happen because each component should have its own + // anchor tag instance, but it's defensive coding to avoid a memory leak in + // case there's a logical error somewhere else. + unmountPrefetchableInstance(element); + } + // Only track prefetchable links that have a valid prefetch URL + prefetchable.set(element, instance); + if (observer !== null) { + observer.observe(element); + } +} +function coercePrefetchableUrl(href) { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + else { + return null; + } +} +function mountLinkInstance(element, href, router, fetchStrategy, prefetchEnabled, setOptimisticLinkStatus) { + if (prefetchEnabled) { + const prefetchURL = coercePrefetchableUrl(href); + if (prefetchURL !== null) { + const instance = { + router, + fetchStrategy, + isVisible: false, + prefetchTask: null, + prefetchHref: prefetchURL.href, + setOptimisticLinkStatus + }; + // We only observe the link's visibility if it's prefetchable. For + // example, this excludes links to external URLs. + observeVisibility(element, instance); + return instance; + } + } + // If the link is not prefetchable, we still create an instance so we can + // track its optimistic state (i.e. useLinkStatus). + const instance = { + router, + fetchStrategy, + isVisible: false, + prefetchTask: null, + prefetchHref: null, + setOptimisticLinkStatus + }; + return instance; +} +function mountFormInstance(element, href, router, fetchStrategy) { + const prefetchURL = coercePrefetchableUrl(href); + if (prefetchURL === null) { + // This href is not prefetchable, so we don't track it. + // TODO: We currently observe/unobserve a form every time its href changes. + // For Links, this isn't a big deal because the href doesn't usually change, + // but for forms it's extremely common. We should optimize this. + return; + } + const instance = { + router, + fetchStrategy, + isVisible: false, + prefetchTask: null, + prefetchHref: prefetchURL.href, + setOptimisticLinkStatus: null + }; + observeVisibility(element, instance); +} +function unmountPrefetchableInstance(element) { + const instance = prefetchable.get(element); + if (instance !== undefined) { + prefetchable.delete(element); + prefetchableAndVisible.delete(instance); + const prefetchTask = instance.prefetchTask; + if (prefetchTask !== null) { + (0, _scheduler.cancelPrefetchTask)(prefetchTask); + } + } + if (observer !== null) { + observer.unobserve(element); + } +} +function handleIntersect(entries) { + for (const entry of entries){ + // Some extremely old browsers or polyfills don't reliably support + // isIntersecting so we check intersectionRatio instead. (Do we care? Not + // really. But whatever this is fine.) + const isVisible = entry.intersectionRatio > 0; + onLinkVisibilityChanged(entry.target, isVisible); + } +} +function onLinkVisibilityChanged(element, isVisible) { + if ("TURBOPACK compile-time truthy", 1) { + // Prefetching on viewport is disabled in development for performance + // reasons, because it requires compiling the target page. + // TODO: Investigate re-enabling this. + return; + } + //TURBOPACK unreachable + ; + const instance = undefined; +} +function onNavigationIntent(element, unstable_upgradeToDynamicPrefetch) { + const instance = prefetchable.get(element); + if (instance === undefined) { + return; + } + // Prefetch the link on hover/touchstart. + if (instance !== undefined) { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + rescheduleLinkPrefetch(instance, _types.PrefetchPriority.Intent); + } +} +function rescheduleLinkPrefetch(instance, priority) { + // Ensures that app-router-instance is not compiled in the server bundle + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; +} +function pingVisibleLinks(nextUrl, tree) { + // For each currently visible link, cancel the existing prefetch task (if it + // exists) and schedule a new one. This is effectively the same as if all the + // visible links left and then re-entered the viewport. + // + // This is called when the Next-Url or the base tree changes, since those + // may affect the result of a prefetch task. It's also called after a + // cache invalidation. + for (const instance of prefetchableAndVisible){ + const task = instance.prefetchTask; + if (task !== null && !(0, _scheduler.isPrefetchTaskDirty)(task, nextUrl, tree)) { + continue; + } + // Something changed. Cancel the existing prefetch task and schedule a + // new one. + if (task !== null) { + (0, _scheduler.cancelPrefetchTask)(task); + } + const cacheKey = (0, _cachekey.createCacheKey)(instance.prefetchHref, nextUrl); + instance.prefetchTask = (0, _scheduler.schedulePrefetchTask)(cacheKey, tree, instance.fetchStrategy, _types.PrefetchPriority.Default, null); + } +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=links.js.map +}), +"[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/shared/lib/router/utils/path-has-prefix.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "pathHasPrefix", { + enumerable: true, + get: function() { + return pathHasPrefix; + } +}); +const _parsepath = __turbopack_context__.r("[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/shared/lib/router/utils/parse-path.js [app-ssr] (ecmascript)"); +function pathHasPrefix(path, prefix) { + if (typeof path !== 'string') { + return false; + } + const { pathname } = (0, _parsepath.parsePath)(path); + return pathname === prefix || pathname.startsWith(prefix + '/'); +} //# sourceMappingURL=path-has-prefix.js.map +}), +"[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/client/has-base-path.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "hasBasePath", { + enumerable: true, + get: function() { + return hasBasePath; + } +}); +const _pathhasprefix = __turbopack_context__.r("[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/shared/lib/router/utils/path-has-prefix.js [app-ssr] (ecmascript)"); +const basePath = ("TURBOPACK compile-time value", "") || ''; +function hasBasePath(path) { + return (0, _pathhasprefix.pathHasPrefix)(path, basePath); +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=has-base-path.js.map +}), +"[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/shared/lib/router/utils/is-local-url.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isLocalURL", { + enumerable: true, + get: function() { + return isLocalURL; + } +}); +const _utils = __turbopack_context__.r("[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/shared/lib/utils.js [app-ssr] (ecmascript)"); +const _hasbasepath = __turbopack_context__.r("[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/client/has-base-path.js [app-ssr] (ecmascript)"); +function isLocalURL(url) { + // prevent a hydration mismatch on href for url with anchor refs + if (!(0, _utils.isAbsoluteUrl)(url)) return true; + try { + // absolute urls can be local if they are on the same origin + const locationOrigin = (0, _utils.getLocationOrigin)(); + const resolved = new URL(url, locationOrigin); + return resolved.origin === locationOrigin && (0, _hasbasepath.hasBasePath)(resolved.pathname); + } catch (_) { + return false; + } +} //# sourceMappingURL=is-local-url.js.map +}), +"[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/shared/lib/utils/error-once.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "errorOnce", { + enumerable: true, + get: function() { + return errorOnce; + } +}); +let errorOnce = (_)=>{}; +if ("TURBOPACK compile-time truthy", 1) { + const errors = new Set(); + errorOnce = (msg)=>{ + if (!errors.has(msg)) { + console.error(msg); + } + errors.add(msg); + }; +} //# sourceMappingURL=error-once.js.map +}), +"[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/client/app-dir/link.js [app-ssr] (ecmascript)", ((__turbopack_context__, module, exports) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +0 && (module.exports = { + default: null, + useLinkStatus: null +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + /** + * A React component that extends the HTML `` element to provide + * [prefetching](https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching) + * and client-side navigation. This is the primary way to navigate between routes in Next.js. + * + * @remarks + * - Prefetching is only enabled in production. + * + * @see https://nextjs.org/docs/app/api-reference/components/link + */ default: function() { + return LinkComponent; + }, + useLinkStatus: function() { + return useLinkStatus; + } +}); +const _interop_require_wildcard = __turbopack_context__.r("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/cjs/_interop_require_wildcard.cjs [app-ssr] (ecmascript)"); +const _jsxruntime = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js [app-ssr] (ecmascript)"); +const _react = /*#__PURE__*/ _interop_require_wildcard._(__turbopack_context__.r("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)")); +const _formaturl = __turbopack_context__.r("[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/shared/lib/router/utils/format-url.js [app-ssr] (ecmascript)"); +const _approutercontextsharedruntime = __turbopack_context__.r("[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/server/route-modules/app-page/vendored/contexts/app-router-context.js [app-ssr] (ecmascript)"); +const _usemergedref = __turbopack_context__.r("[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/client/use-merged-ref.js [app-ssr] (ecmascript)"); +const _utils = __turbopack_context__.r("[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/shared/lib/utils.js [app-ssr] (ecmascript)"); +const _addbasepath = __turbopack_context__.r("[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/client/add-base-path.js [app-ssr] (ecmascript)"); +const _warnonce = __turbopack_context__.r("[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/shared/lib/utils/warn-once.js [app-ssr] (ecmascript)"); +const _links = __turbopack_context__.r("[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/client/components/links.js [app-ssr] (ecmascript)"); +const _islocalurl = __turbopack_context__.r("[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/shared/lib/router/utils/is-local-url.js [app-ssr] (ecmascript)"); +const _types = __turbopack_context__.r("[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/client/components/segment-cache/types.js [app-ssr] (ecmascript)"); +const _erroronce = __turbopack_context__.r("[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/shared/lib/utils/error-once.js [app-ssr] (ecmascript)"); +function isModifiedEvent(event) { + const eventTarget = event.currentTarget; + const target = eventTarget.getAttribute('target'); + return target && target !== '_self' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || // triggers resource download + event.nativeEvent && event.nativeEvent.which === 2; +} +function linkClicked(e, href, as, linkInstanceRef, replace, scroll, onNavigate) { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; +} +function formatStringOrUrl(urlObjOrString) { + if (typeof urlObjOrString === 'string') { + return urlObjOrString; + } + return (0, _formaturl.formatUrl)(urlObjOrString); +} +function LinkComponent(props) { + const [linkStatus, setOptimisticLinkStatus] = (0, _react.useOptimistic)(_links.IDLE_LINK_STATUS); + let children; + const linkInstanceRef = (0, _react.useRef)(null); + const { href: hrefProp, as: asProp, children: childrenProp, prefetch: prefetchProp = null, passHref, replace, shallow, scroll, onClick, onMouseEnter: onMouseEnterProp, onTouchStart: onTouchStartProp, legacyBehavior = false, onNavigate, ref: forwardedRef, unstable_dynamicOnHover, ...restProps } = props; + children = childrenProp; + if (legacyBehavior && (typeof children === 'string' || typeof children === 'number')) { + children = /*#__PURE__*/ (0, _jsxruntime.jsx)("a", { + children: children + }); + } + const router = _react.default.useContext(_approutercontextsharedruntime.AppRouterContext); + const prefetchEnabled = prefetchProp !== false; + const fetchStrategy = prefetchProp !== false ? getFetchStrategyFromPrefetchProp(prefetchProp) : _types.FetchStrategy.PPR; + if ("TURBOPACK compile-time truthy", 1) { + function createPropError(args) { + return Object.defineProperty(new Error(`Failed prop type: The prop \`${args.key}\` expects a ${args.expected} in \`\`, but got \`${args.actual}\` instead.` + (("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : '')), "__NEXT_ERROR_CODE", { + value: "E319", + enumerable: false, + configurable: true + }); + } + // TypeScript trick for type-guarding: + const requiredPropsGuard = { + href: true + }; + const requiredProps = Object.keys(requiredPropsGuard); + requiredProps.forEach((key)=>{ + if (key === 'href') { + if (props[key] == null || typeof props[key] !== 'string' && typeof props[key] !== 'object') { + throw createPropError({ + key, + expected: '`string` or `object`', + actual: props[key] === null ? 'null' : typeof props[key] + }); + } + } else { + // TypeScript trick for type-guarding: + const _ = key; + } + }); + // TypeScript trick for type-guarding: + const optionalPropsGuard = { + as: true, + replace: true, + scroll: true, + shallow: true, + passHref: true, + prefetch: true, + unstable_dynamicOnHover: true, + onClick: true, + onMouseEnter: true, + onTouchStart: true, + legacyBehavior: true, + onNavigate: true + }; + const optionalProps = Object.keys(optionalPropsGuard); + optionalProps.forEach((key)=>{ + const valType = typeof props[key]; + if (key === 'as') { + if (props[key] && valType !== 'string' && valType !== 'object') { + throw createPropError({ + key, + expected: '`string` or `object`', + actual: valType + }); + } + } else if (key === 'onClick' || key === 'onMouseEnter' || key === 'onTouchStart' || key === 'onNavigate') { + if (props[key] && valType !== 'function') { + throw createPropError({ + key, + expected: '`function`', + actual: valType + }); + } + } else if (key === 'replace' || key === 'scroll' || key === 'shallow' || key === 'passHref' || key === 'legacyBehavior' || key === 'unstable_dynamicOnHover') { + if (props[key] != null && valType !== 'boolean') { + throw createPropError({ + key, + expected: '`boolean`', + actual: valType + }); + } + } else if (key === 'prefetch') { + if (props[key] != null && valType !== 'boolean' && props[key] !== 'auto') { + throw createPropError({ + key, + expected: '`boolean | "auto"`', + actual: valType + }); + } + } else { + // TypeScript trick for type-guarding: + const _ = key; + } + }); + } + if ("TURBOPACK compile-time truthy", 1) { + if (props.locale) { + (0, _warnonce.warnOnce)('The `locale` prop is not supported in `next/link` while using the `app` router. Read more about app router internalization: https://nextjs.org/docs/app/building-your-application/routing/internationalization'); + } + if (!asProp) { + let href; + if (typeof hrefProp === 'string') { + href = hrefProp; + } else if (typeof hrefProp === 'object' && typeof hrefProp.pathname === 'string') { + href = hrefProp.pathname; + } + if (href) { + const hasDynamicSegment = href.split('/').some((segment)=>segment.startsWith('[') && segment.endsWith(']')); + if (hasDynamicSegment) { + throw Object.defineProperty(new Error(`Dynamic href \`${href}\` found in while using the \`/app\` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href`), "__NEXT_ERROR_CODE", { + value: "E267", + enumerable: false, + configurable: true + }); + } + } + } + } + const { href, as } = _react.default.useMemo(()=>{ + const resolvedHref = formatStringOrUrl(hrefProp); + return { + href: resolvedHref, + as: asProp ? formatStringOrUrl(asProp) : resolvedHref + }; + }, [ + hrefProp, + asProp + ]); + // This will return the first child, if multiple are provided it will throw an error + let child; + if (legacyBehavior) { + if (children?.$$typeof === Symbol.for('react.lazy')) { + throw Object.defineProperty(new Error(`\`\` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's \`\` tag.`), "__NEXT_ERROR_CODE", { + value: "E863", + enumerable: false, + configurable: true + }); + } + if ("TURBOPACK compile-time truthy", 1) { + if (onClick) { + console.warn(`"onClick" was passed to with \`href\` of \`${hrefProp}\` but "legacyBehavior" was set. The legacy behavior requires onClick be set on the child of next/link`); + } + if (onMouseEnterProp) { + console.warn(`"onMouseEnter" was passed to with \`href\` of \`${hrefProp}\` but "legacyBehavior" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`); + } + try { + child = _react.default.Children.only(children); + } catch (err) { + if (!children) { + throw Object.defineProperty(new Error(`No children were passed to with \`href\` of \`${hrefProp}\` but one child is required https://nextjs.org/docs/messages/link-no-children`), "__NEXT_ERROR_CODE", { + value: "E320", + enumerable: false, + configurable: true + }); + } + throw Object.defineProperty(new Error(`Multiple children were passed to with \`href\` of \`${hrefProp}\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` + (("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : '')), "__NEXT_ERROR_CODE", { + value: "E266", + enumerable: false, + configurable: true + }); + } + } else //TURBOPACK unreachable + ; + } else { + if ("TURBOPACK compile-time truthy", 1) { + if (children?.type === 'a') { + throw Object.defineProperty(new Error('Invalid with child. Please remove or use .\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor'), "__NEXT_ERROR_CODE", { + value: "E209", + enumerable: false, + configurable: true + }); + } + } + } + const childRef = legacyBehavior ? child && typeof child === 'object' && child.ref : forwardedRef; + // Use a callback ref to attach an IntersectionObserver to the anchor tag on + // mount. In the future we will also use this to keep track of all the + // currently mounted instances, e.g. so we can re-prefetch them after + // a revalidation or refresh. + const observeLinkVisibilityOnMount = _react.default.useCallback((element)=>{ + if (router !== null) { + linkInstanceRef.current = (0, _links.mountLinkInstance)(element, href, router, fetchStrategy, prefetchEnabled, setOptimisticLinkStatus); + } + return ()=>{ + if (linkInstanceRef.current) { + (0, _links.unmountLinkForCurrentNavigation)(linkInstanceRef.current); + linkInstanceRef.current = null; + } + (0, _links.unmountPrefetchableInstance)(element); + }; + }, [ + prefetchEnabled, + href, + router, + fetchStrategy, + setOptimisticLinkStatus + ]); + const mergedRef = (0, _usemergedref.useMergedRef)(observeLinkVisibilityOnMount, childRef); + const childProps = { + ref: mergedRef, + onClick (e) { + if ("TURBOPACK compile-time truthy", 1) { + if (!e) { + throw Object.defineProperty(new Error(`Component rendered inside next/link has to pass click event to "onClick" prop.`), "__NEXT_ERROR_CODE", { + value: "E312", + enumerable: false, + configurable: true + }); + } + } + if (!legacyBehavior && typeof onClick === 'function') { + onClick(e); + } + if (legacyBehavior && child.props && typeof child.props.onClick === 'function') { + child.props.onClick(e); + } + if (!router) { + return; + } + if (e.defaultPrevented) { + return; + } + linkClicked(e, href, as, linkInstanceRef, replace, scroll, onNavigate); + }, + onMouseEnter (e) { + if (!legacyBehavior && typeof onMouseEnterProp === 'function') { + onMouseEnterProp(e); + } + if (legacyBehavior && child.props && typeof child.props.onMouseEnter === 'function') { + child.props.onMouseEnter(e); + } + if (!router) { + return; + } + if ("TURBOPACK compile-time truthy", 1) { + return; + } + //TURBOPACK unreachable + ; + const upgradeToDynamicPrefetch = undefined; + }, + onTouchStart: ("TURBOPACK compile-time falsy", 0) ? "TURBOPACK unreachable" : function onTouchStart(e) { + if (!legacyBehavior && typeof onTouchStartProp === 'function') { + onTouchStartProp(e); + } + if (legacyBehavior && child.props && typeof child.props.onTouchStart === 'function') { + child.props.onTouchStart(e); + } + if (!router) { + return; + } + if (!prefetchEnabled) { + return; + } + const upgradeToDynamicPrefetch = unstable_dynamicOnHover === true; + (0, _links.onNavigationIntent)(e.currentTarget, upgradeToDynamicPrefetch); + } + }; + // If the url is absolute, we can bypass the logic to prepend the basePath. + if ((0, _utils.isAbsoluteUrl)(as)) { + childProps.href = as; + } else if (!legacyBehavior || passHref || child.type === 'a' && !('href' in child.props)) { + childProps.href = (0, _addbasepath.addBasePath)(as); + } + let link; + if (legacyBehavior) { + if ("TURBOPACK compile-time truthy", 1) { + (0, _erroronce.errorOnce)('`legacyBehavior` is deprecated and will be removed in a future ' + 'release. A codemod is available to upgrade your components:\n\n' + 'npx @next/codemod@latest new-link .\n\n' + 'Learn more: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#remove-a-tags-from-link-components'); + } + link = /*#__PURE__*/ _react.default.cloneElement(child, childProps); + } else { + link = /*#__PURE__*/ (0, _jsxruntime.jsx)("a", { + ...restProps, + ...childProps, + children: children + }); + } + return /*#__PURE__*/ (0, _jsxruntime.jsx)(LinkStatusContext.Provider, { + value: linkStatus, + children: link + }); +} +const LinkStatusContext = /*#__PURE__*/ (0, _react.createContext)(_links.IDLE_LINK_STATUS); +const useLinkStatus = ()=>{ + return (0, _react.useContext)(LinkStatusContext); +}; +function getFetchStrategyFromPrefetchProp(prefetchProp) { + if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable + ; + else { + return prefetchProp === null || prefetchProp === 'auto' ? _types.FetchStrategy.PPR : // (although invalid values should've been filtered out by prop validation in dev) + _types.FetchStrategy.Full; + } +} +if ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') { + Object.defineProperty(exports.default, '__esModule', { + value: true + }); + Object.assign(exports.default, exports); + module.exports = exports.default; +} //# sourceMappingURL=link.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>BookOpen +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const BookOpen = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("BookOpen", [ + [ + "path", + { + d: "M12 7v14", + key: "1akyts" + } + ], + [ + "path", + { + d: "M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z", + key: "ruj8y" + } + ] +]); +; + //# sourceMappingURL=book-open.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "BookOpen", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$book$2d$open$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/book-open.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>Search +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const Search = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("Search", [ + [ + "circle", + { + cx: "11", + cy: "11", + r: "8", + key: "4ej97u" + } + ], + [ + "path", + { + d: "m21 21-4.3-4.3", + key: "1qie3q" + } + ] +]); +; + //# sourceMappingURL=search.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Search", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$search$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/search.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>Bell +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const Bell = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("Bell", [ + [ + "path", + { + d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9", + key: "1qo2s2" + } + ], + [ + "path", + { + d: "M10.3 21a1.94 1.94 0 0 0 3.4 0", + key: "qgo35s" + } + ] +]); +; + //# sourceMappingURL=bell.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Bell", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$bell$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/bell.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>Settings +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const Settings = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("Settings", [ + [ + "path", + { + d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z", + key: "1qme2f" + } + ], + [ + "circle", + { + cx: "12", + cy: "12", + r: "3", + key: "1v7zrd" + } + ] +]); +; + //# sourceMappingURL=settings.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Settings", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$settings$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/settings.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>LogOut +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const LogOut = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("LogOut", [ + [ + "path", + { + d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4", + key: "1uf3rs" + } + ], + [ + "polyline", + { + points: "16 17 21 12 16 7", + key: "1gabdz" + } + ], + [ + "line", + { + x1: "21", + x2: "9", + y1: "12", + y2: "12", + key: "1uyos4" + } + ] +]); +; + //# sourceMappingURL=log-out.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "LogOut", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$log$2d$out$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/log-out.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>ChevronDown +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const ChevronDown = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("ChevronDown", [ + [ + "path", + { + d: "m6 9 6 6 6-6", + key: "qrunsl" + } + ] +]); +; + //# sourceMappingURL=chevron-down.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "ChevronDown", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$chevron$2d$down$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>Plus +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const Plus = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("Plus", [ + [ + "path", + { + d: "M5 12h14", + key: "1ays0h" + } + ], + [ + "path", + { + d: "M12 5v14", + key: "s699le" + } + ] +]); +; + //# sourceMappingURL=plus.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Plus", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$plus$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/plus.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */ __turbopack_context__.s([ + "default", + ()=>Trash2 +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/createLucideIcon.js [app-ssr] (ecmascript)"); +; +const Trash2 = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$createLucideIcon$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"])("Trash2", [ + [ + "path", + { + d: "M3 6h18", + key: "d0wm0j" + } + ], + [ + "path", + { + d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6", + key: "4alrt4" + } + ], + [ + "path", + { + d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2", + key: "v07s0e" + } + ], + [ + "line", + { + x1: "10", + x2: "10", + y1: "11", + y2: "17", + key: "1uufr5" + } + ], + [ + "line", + { + x1: "14", + x2: "14", + y1: "11", + y2: "17", + key: "xtxkd" + } + ] +]); +; + //# sourceMappingURL=trash-2.js.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Trash2", + ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"] +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$trash$2d$2$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/lucide-react@0.454.0_react@19.2.0/node_modules/lucide-react/dist/esm/icons/trash-2.js [app-ssr] (ecmascript)"); +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-avatar@1.1.2_@types+react-dom@19.2.3_@types+react@19.2.6__@types+react@_3ee3dafa662d71951c1a3d5b289c96d1/node_modules/@radix-ui/react-avatar/dist/index.mjs [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "Avatar", + ()=>Avatar, + "AvatarFallback", + ()=>AvatarFallback, + "AvatarImage", + ()=>AvatarImage, + "Fallback", + ()=>Fallback, + "Image", + ()=>Image, + "Root", + ()=>Root, + "createAvatarScope", + ()=>createAvatarScope +]); +// packages/react/avatar/src/Avatar.tsx +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$context$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$context$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-context@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$use$2d$callback$2d$ref$40$1$2e$1$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$use$2d$callback$2d$ref$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-use-callback-ref@1.1.0_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$use$2d$layout$2d$effect$40$1$2e$1$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$use$2d$layout$2d$effect$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-use-layout-effect@1.1.0_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$primitive$40$2$2e$0$2e$1_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$rea_4f53963f71a6eb8b0116fe0dd1078946$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$primitive$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-primitive@2.0.1_@types+react-dom@19.2.3_@types+react@19.2.6__@types+rea_4f53963f71a6eb8b0116fe0dd1078946/node_modules/@radix-ui/react-primitive/dist/index.mjs [app-ssr] (ecmascript)"); +var __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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +; +var AVATAR_NAME = "Avatar"; +var [createAvatarContext, createAvatarScope] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$context$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$context$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createContextScope"])(AVATAR_NAME); +var [AvatarProvider, useAvatarContext] = createAvatarContext(AVATAR_NAME); +var Avatar = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["forwardRef"]((props, forwardedRef)=>{ + const { __scopeAvatar, ...avatarProps } = props; + const [imageLoadingStatus, setImageLoadingStatus] = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"]("idle"); + 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$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(AvatarProvider, { + scope: __scopeAvatar, + imageLoadingStatus, + onImageLoadingStatusChange: setImageLoadingStatus, + 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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$primitive$40$2$2e$0$2e$1_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$rea_4f53963f71a6eb8b0116fe0dd1078946$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$primitive$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Primitive"].span, { + ...avatarProps, + ref: forwardedRef + }) + }); +}); +Avatar.displayName = AVATAR_NAME; +var IMAGE_NAME = "AvatarImage"; +var AvatarImage = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["forwardRef"]((props, forwardedRef)=>{ + const { __scopeAvatar, src, onLoadingStatusChange = ()=>{}, ...imageProps } = props; + const context = useAvatarContext(IMAGE_NAME, __scopeAvatar); + const imageLoadingStatus = useImageLoadingStatus(src, imageProps.referrerPolicy); + const handleLoadingStatusChange = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$use$2d$callback$2d$ref$40$1$2e$1$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$use$2d$callback$2d$ref$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallbackRef"])((status)=>{ + onLoadingStatusChange(status); + context.onImageLoadingStatusChange(status); + }); + (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$use$2d$layout$2d$effect$40$1$2e$1$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$use$2d$layout$2d$effect$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useLayoutEffect"])(()=>{ + if (imageLoadingStatus !== "idle") { + handleLoadingStatusChange(imageLoadingStatus); + } + }, [ + imageLoadingStatus, + handleLoadingStatusChange + ]); + return imageLoadingStatus === "loaded" ? /* @__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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$primitive$40$2$2e$0$2e$1_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$rea_4f53963f71a6eb8b0116fe0dd1078946$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$primitive$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Primitive"].img, { + ...imageProps, + ref: forwardedRef, + src + }) : null; +}); +AvatarImage.displayName = IMAGE_NAME; +var FALLBACK_NAME = "AvatarFallback"; +var AvatarFallback = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["forwardRef"]((props, forwardedRef)=>{ + const { __scopeAvatar, delayMs, ...fallbackProps } = props; + const context = useAvatarContext(FALLBACK_NAME, __scopeAvatar); + const [canRender, setCanRender] = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"](delayMs === void 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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"](()=>{ + if (delayMs !== void 0) { + const timerId = window.setTimeout(()=>setCanRender(true), delayMs); + return ()=>window.clearTimeout(timerId); + } + }, [ + delayMs + ]); + return canRender && context.imageLoadingStatus !== "loaded" ? /* @__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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$primitive$40$2$2e$0$2e$1_$40$types$2b$react$2d$dom$40$19$2e$2$2e$3_$40$types$2b$react$40$19$2e$2$2e$6_$5f40$types$2b$rea_4f53963f71a6eb8b0116fe0dd1078946$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$primitive$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Primitive"].span, { + ...fallbackProps, + ref: forwardedRef + }) : null; +}); +AvatarFallback.displayName = FALLBACK_NAME; +function useImageLoadingStatus(src, referrerPolicy) { + const [loadingStatus, setLoadingStatus] = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"]("idle"); + (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$use$2d$layout$2d$effect$40$1$2e$1$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$use$2d$layout$2d$effect$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useLayoutEffect"])(()=>{ + if (!src) { + setLoadingStatus("error"); + return; + } + let isMounted = true; + const image = new window.Image(); + const updateStatus = (status)=>()=>{ + if (!isMounted) return; + setLoadingStatus(status); + }; + setLoadingStatus("loading"); + image.onload = updateStatus("loaded"); + image.onerror = updateStatus("error"); + image.src = src; + if (referrerPolicy) { + image.referrerPolicy = referrerPolicy; + } + return ()=>{ + isMounted = false; + }; + }, [ + src, + referrerPolicy + ]); + return loadingStatus; +} +var Root = Avatar; +var Image = AvatarImage; +var Fallback = AvatarFallback; +; + //# sourceMappingURL=index.mjs.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-collection@1.1.1_@types+react-dom@19.2.3_@types+react@19.2.6__@types+re_1ad17166111274b6b451c5ad4817bfc8/node_modules/@radix-ui/react-collection/dist/index.mjs [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "createCollection", + ()=>createCollection +]); +// packages/react/collection/src/Collection.tsx +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$context$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$context$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-context@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$compose$2d$refs$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$compose$2d$refs$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-compose-refs@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-compose-refs/dist/index.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-slot@1.1.1_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-slot/dist/index.mjs [app-ssr] (ecmascript)"); +var __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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js [app-ssr] (ecmascript)"); +"use client"; +; +; +; +; +; +function createCollection(name) { + const PROVIDER_NAME = name + "CollectionProvider"; + const [createCollectionContext, createCollectionScope] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$context$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$context$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createContextScope"])(PROVIDER_NAME); + const [CollectionProviderImpl, useCollectionContext] = createCollectionContext(PROVIDER_NAME, { + collectionRef: { + current: null + }, + itemMap: /* @__PURE__ */ new Map() + }); + const CollectionProvider = (props)=>{ + const { scope, children } = props; + const ref = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].useRef(null); + const itemMap = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].useRef(/* @__PURE__ */ new Map()).current; + 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$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(CollectionProviderImpl, { + scope, + itemMap, + collectionRef: ref, + children + }); + }; + CollectionProvider.displayName = PROVIDER_NAME; + const COLLECTION_SLOT_NAME = name + "CollectionSlot"; + const CollectionSlot = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].forwardRef((props, forwardedRef)=>{ + const { scope, children } = props; + const context = useCollectionContext(COLLECTION_SLOT_NAME, scope); + const composedRefs = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$compose$2d$refs$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$compose$2d$refs$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useComposedRefs"])(forwardedRef, context.collectionRef); + 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$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Slot"], { + ref: composedRefs, + children + }); + }); + CollectionSlot.displayName = COLLECTION_SLOT_NAME; + const ITEM_SLOT_NAME = name + "CollectionItemSlot"; + const ITEM_DATA_ATTR = "data-radix-collection-item"; + const CollectionItemSlot = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].forwardRef((props, forwardedRef)=>{ + const { scope, children, ...itemData } = props; + const ref = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].useRef(null); + const composedRefs = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$compose$2d$refs$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$compose$2d$refs$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useComposedRefs"])(forwardedRef, ref); + const context = useCollectionContext(ITEM_SLOT_NAME, scope); + __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].useEffect(()=>{ + context.itemMap.set(ref, { + ref, + ...itemData + }); + return ()=>void context.itemMap.delete(ref); + }); + 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$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$radix$2d$ui$2b$react$2d$slot$40$1$2e$1$2e$1_$40$types$2b$react$40$19$2e$2$2e$6_react$40$19$2e$2$2e$0$2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["Slot"], { + ...{ + [ITEM_DATA_ATTR]: "" + }, + ref: composedRefs, + children + }); + }); + CollectionItemSlot.displayName = ITEM_SLOT_NAME; + function useCollection(scope) { + const context = useCollectionContext(name + "CollectionConsumer", scope); + const getItems = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].useCallback(()=>{ + const collectionNode = context.collectionRef.current; + if (!collectionNode) return []; + const orderedNodes = Array.from(collectionNode.querySelectorAll(`[${ITEM_DATA_ATTR}]`)); + const items = Array.from(context.itemMap.values()); + const orderedItems = items.sort((a, b)=>orderedNodes.indexOf(a.ref.current) - orderedNodes.indexOf(b.ref.current)); + return orderedItems; + }, [ + context.collectionRef, + context.itemMap + ]); + return getItems; + } + return [ + { + Provider: CollectionProvider, + Slot: CollectionSlot, + ItemSlot: CollectionItemSlot + }, + useCollection, + createCollectionScope + ]; +} +; + //# sourceMappingURL=index.mjs.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@radix-ui+react-direction@1.1.0_@types+react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-direction/dist/index.mjs [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +// packages/react/direction/src/Direction.tsx +__turbopack_context__.s([ + "DirectionProvider", + ()=>DirectionProvider, + "Provider", + ()=>Provider, + "useDirection", + ()=>useDirection +]); +var __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react.js [app-ssr] (ecmascript)"); +var __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$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[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/server/route-modules/app-page/vendored/ssr/react-jsx-runtime.js [app-ssr] (ecmascript)"); +; +; +var DirectionContext = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createContext"](void 0); +var DirectionProvider = (props)=>{ + const { dir, children } = props; + 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$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsx"])(DirectionContext.Provider, { + value: dir, + children + }); +}; +function useDirection(localDir) { + const globalDir = __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$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useContext"](DirectionContext); + return localDir || globalDir || "ltr"; +} +var Provider = DirectionProvider; +; + //# sourceMappingURL=index.mjs.map +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +/** + * Custom positioning reference element. + * @see https://floating-ui.com/docs/virtual-elements + */ __turbopack_context__.s([ + "alignments", + ()=>alignments, + "clamp", + ()=>clamp, + "createCoords", + ()=>createCoords, + "evaluate", + ()=>evaluate, + "expandPaddingObject", + ()=>expandPaddingObject, + "floor", + ()=>floor, + "getAlignment", + ()=>getAlignment, + "getAlignmentAxis", + ()=>getAlignmentAxis, + "getAlignmentSides", + ()=>getAlignmentSides, + "getAxisLength", + ()=>getAxisLength, + "getExpandedPlacements", + ()=>getExpandedPlacements, + "getOppositeAlignmentPlacement", + ()=>getOppositeAlignmentPlacement, + "getOppositeAxis", + ()=>getOppositeAxis, + "getOppositeAxisPlacements", + ()=>getOppositeAxisPlacements, + "getOppositePlacement", + ()=>getOppositePlacement, + "getPaddingObject", + ()=>getPaddingObject, + "getSide", + ()=>getSide, + "getSideAxis", + ()=>getSideAxis, + "max", + ()=>max, + "min", + ()=>min, + "placements", + ()=>placements, + "rectToClientRect", + ()=>rectToClientRect, + "round", + ()=>round, + "sides", + ()=>sides +]); +const sides = [ + 'top', + 'right', + 'bottom', + 'left' +]; +const alignments = [ + 'start', + 'end' +]; +const placements = /*#__PURE__*/ sides.reduce((acc, side)=>acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []); +const min = Math.min; +const max = Math.max; +const round = Math.round; +const floor = Math.floor; +const createCoords = (v)=>({ + x: v, + y: v + }); +const oppositeSideMap = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' +}; +const oppositeAlignmentMap = { + start: 'end', + end: 'start' +}; +function clamp(start, value, end) { + return max(start, min(value, end)); +} +function evaluate(value, param) { + return typeof value === 'function' ? value(param) : value; +} +function getSide(placement) { + return placement.split('-')[0]; +} +function getAlignment(placement) { + return placement.split('-')[1]; +} +function getOppositeAxis(axis) { + return axis === 'x' ? 'y' : 'x'; +} +function getAxisLength(axis) { + return axis === 'y' ? 'height' : 'width'; +} +const yAxisSides = /*#__PURE__*/ new Set([ + 'top', + 'bottom' +]); +function getSideAxis(placement) { + return yAxisSides.has(getSide(placement)) ? 'y' : 'x'; +} +function getAlignmentAxis(placement) { + return getOppositeAxis(getSideAxis(placement)); +} +function getAlignmentSides(placement, rects, rtl) { + if (rtl === void 0) { + rtl = false; + } + const alignment = getAlignment(placement); + const alignmentAxis = getAlignmentAxis(placement); + const length = getAxisLength(alignmentAxis); + let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top'; + if (rects.reference[length] > rects.floating[length]) { + mainAlignmentSide = getOppositePlacement(mainAlignmentSide); + } + return [ + mainAlignmentSide, + getOppositePlacement(mainAlignmentSide) + ]; +} +function getExpandedPlacements(placement) { + const oppositePlacement = getOppositePlacement(placement); + return [ + getOppositeAlignmentPlacement(placement), + oppositePlacement, + getOppositeAlignmentPlacement(oppositePlacement) + ]; +} +function getOppositeAlignmentPlacement(placement) { + return placement.replace(/start|end/g, (alignment)=>oppositeAlignmentMap[alignment]); +} +const lrPlacement = [ + 'left', + 'right' +]; +const rlPlacement = [ + 'right', + 'left' +]; +const tbPlacement = [ + 'top', + 'bottom' +]; +const btPlacement = [ + 'bottom', + 'top' +]; +function getSideList(side, isStart, rtl) { + switch(side){ + case 'top': + case 'bottom': + if (rtl) return isStart ? rlPlacement : lrPlacement; + return isStart ? lrPlacement : rlPlacement; + case 'left': + case 'right': + return isStart ? tbPlacement : btPlacement; + default: + return []; + } +} +function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { + const alignment = getAlignment(placement); + let list = getSideList(getSide(placement), direction === 'start', rtl); + if (alignment) { + list = list.map((side)=>side + "-" + alignment); + if (flipAlignment) { + list = list.concat(list.map(getOppositeAlignmentPlacement)); + } + } + return list; +} +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, (side)=>oppositeSideMap[side]); +} +function expandPaddingObject(padding) { + return { + top: 0, + right: 0, + bottom: 0, + left: 0, + ...padding + }; +} +function getPaddingObject(padding) { + return typeof padding !== 'number' ? expandPaddingObject(padding) : { + top: padding, + right: padding, + bottom: padding, + left: padding + }; +} +function rectToClientRect(rect) { + const { x, y, width, height } = rect; + return { + width, + height, + top: y, + left: x, + right: x + width, + bottom: y + height, + x, + y + }; +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "arrow", + ()=>arrow, + "autoPlacement", + ()=>autoPlacement, + "computePosition", + ()=>computePosition, + "detectOverflow", + ()=>detectOverflow, + "flip", + ()=>flip, + "hide", + ()=>hide, + "inline", + ()=>inline, + "limitShift", + ()=>limitShift, + "offset", + ()=>offset, + "shift", + ()=>shift, + "size", + ()=>size +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs [app-ssr] (ecmascript)"); +; +; +function computeCoordsFromPlacement(_ref, placement, rtl) { + let { reference, floating } = _ref; + const sideAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(placement); + const alignmentAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignmentAxis"])(placement); + const alignLength = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAxisLength"])(alignmentAxis); + const side = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement); + const isVertical = sideAxis === 'y'; + const commonX = reference.x + reference.width / 2 - floating.width / 2; + const commonY = reference.y + reference.height / 2 - floating.height / 2; + const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; + let coords; + switch(side){ + case 'top': + coords = { + x: commonX, + y: reference.y - floating.height + }; + break; + case 'bottom': + coords = { + x: commonX, + y: reference.y + reference.height + }; + break; + case 'right': + coords = { + x: reference.x + reference.width, + y: commonY + }; + break; + case 'left': + coords = { + x: reference.x - floating.width, + y: commonY + }; + break; + default: + coords = { + x: reference.x, + y: reference.y + }; + } + switch((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement)){ + case 'start': + coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); + break; + case 'end': + coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); + break; + } + return coords; +} +/** + * Computes the `x` and `y` coordinates that will place the floating element + * next to a given reference element. + * + * This export does not have any `platform` interface logic. You will need to + * write one for the platform you are using Floating UI with. + */ const computePosition = async (reference, floating, config)=>{ + const { placement = 'bottom', strategy = 'absolute', middleware = [], platform } = config; + const validMiddleware = middleware.filter(Boolean); + const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating)); + let rects = await platform.getElementRects({ + reference, + floating, + strategy + }); + let { x, y } = computeCoordsFromPlacement(rects, placement, rtl); + let statefulPlacement = placement; + let middlewareData = {}; + let resetCount = 0; + for(let i = 0; i < validMiddleware.length; i++){ + const { name, fn } = validMiddleware[i]; + const { x: nextX, y: nextY, data, reset } = await fn({ + x, + y, + initialPlacement: placement, + placement: statefulPlacement, + strategy, + middlewareData, + rects, + platform, + elements: { + reference, + floating + } + }); + x = nextX != null ? nextX : x; + y = nextY != null ? nextY : y; + middlewareData = { + ...middlewareData, + [name]: { + ...middlewareData[name], + ...data + } + }; + if (reset && resetCount <= 50) { + resetCount++; + if (typeof reset === 'object') { + if (reset.placement) { + statefulPlacement = reset.placement; + } + if (reset.rects) { + rects = reset.rects === true ? await platform.getElementRects({ + reference, + floating, + strategy + }) : reset.rects; + } + ({ x, y } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); + } + i = -1; + } + } + return { + x, + y, + placement: statefulPlacement, + strategy, + middlewareData + }; +}; +/** + * Resolves with an object of overflow side offsets that determine how much the + * element is overflowing a given clipping boundary on each side. + * - positive = overflowing the boundary by that number of pixels + * - negative = how many pixels left before it will overflow + * - 0 = lies flush with the boundary + * @see https://floating-ui.com/docs/detectOverflow + */ async function detectOverflow(state, options) { + var _await$platform$isEle; + if (options === void 0) { + options = {}; + } + const { x, y, platform, rects, elements, strategy } = state; + const { boundary = 'clippingAncestors', rootBoundary = 'viewport', elementContext = 'floating', altBoundary = false, padding = 0 } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const paddingObject = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getPaddingObject"])(padding); + const altContext = elementContext === 'floating' ? 'reference' : 'floating'; + const element = elements[altBoundary ? altContext : elementContext]; + const clippingClientRect = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])(await platform.getClippingRect({ + element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating)), + boundary, + rootBoundary, + strategy + })); + const rect = elementContext === 'floating' ? { + x, + y, + width: rects.floating.width, + height: rects.floating.height + } : rects.reference; + const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)); + const offsetScale = await (platform.isElement == null ? void 0 : platform.isElement(offsetParent)) ? await (platform.getScale == null ? void 0 : platform.getScale(offsetParent)) || { + x: 1, + y: 1 + } : { + x: 1, + y: 1 + }; + const elementClientRect = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({ + elements, + rect, + offsetParent, + strategy + }) : rect); + return { + top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, + bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, + left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, + right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x + }; +} +/** + * Provides data to position an inner element of the floating element so that it + * appears centered to the reference element. + * @see https://floating-ui.com/docs/arrow + */ const arrow = (options)=>({ + name: 'arrow', + options, + async fn (state) { + const { x, y, placement, rects, platform, elements, middlewareData } = state; + // Since `element` is required, we don't Partial<> the type. + const { element, padding = 0 } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state) || {}; + if (element == null) { + return {}; + } + const paddingObject = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getPaddingObject"])(padding); + const coords = { + x, + y + }; + const axis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignmentAxis"])(placement); + const length = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAxisLength"])(axis); + const arrowDimensions = await platform.getDimensions(element); + const isYAxis = axis === 'y'; + const minProp = isYAxis ? 'top' : 'left'; + const maxProp = isYAxis ? 'bottom' : 'right'; + const clientProp = isYAxis ? 'clientHeight' : 'clientWidth'; + const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; + const startDiff = coords[axis] - rects.reference[axis]; + const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element)); + let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; + // DOM platform can return `window` as the `offsetParent`. + if (!clientSize || !await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent))) { + clientSize = elements.floating[clientProp] || rects.floating[length]; + } + const centerToReference = endDiff / 2 - startDiff / 2; + // If the padding is large enough that it causes the arrow to no longer be + // centered, modify the padding so that it is centered. + const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; + const minPadding = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(paddingObject[minProp], largestPossiblePadding); + const maxPadding = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(paddingObject[maxProp], largestPossiblePadding); + // Make sure the arrow doesn't overflow the floating element if the center + // point is outside the floating element's bounds. + const min$1 = minPadding; + const max = clientSize - arrowDimensions[length] - maxPadding; + const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; + const offset = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["clamp"])(min$1, center, max); + // If the reference is small enough that the arrow's padding causes it to + // to point to nothing for an aligned placement, adjust the offset of the + // floating element itself. To ensure `shift()` continues to take action, + // a single reset is performed when this is true. + const shouldAddOffset = !middlewareData.arrow && (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; + const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0; + return { + [axis]: coords[axis] + alignmentOffset, + data: { + [axis]: offset, + centerOffset: center - offset - alignmentOffset, + ...shouldAddOffset && { + alignmentOffset + } + }, + reset: shouldAddOffset + }; + } + }); +function getPlacementList(alignment, autoAlignment, allowedPlacements) { + const allowedPlacementsSortedByAlignment = alignment ? [ + ...allowedPlacements.filter((placement)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement) === alignment), + ...allowedPlacements.filter((placement)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement) !== alignment) + ] : allowedPlacements.filter((placement)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement) === placement); + return allowedPlacementsSortedByAlignment.filter((placement)=>{ + if (alignment) { + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement) === alignment || (autoAlignment ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOppositeAlignmentPlacement"])(placement) !== placement : false); + } + return true; + }); +} +/** + * Optimizes the visibility of the floating element by choosing the placement + * that has the most space available automatically, without needing to specify a + * preferred placement. Alternative to `flip`. + * @see https://floating-ui.com/docs/autoPlacement + */ const autoPlacement = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'autoPlacement', + options, + async fn (state) { + var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE; + const { rects, middlewareData, placement, platform, elements } = state; + const { crossAxis = false, alignment, allowedPlacements = __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["placements"], autoAlignment = true, ...detectOverflowOptions } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const placements$1 = alignment !== undefined || allowedPlacements === __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["placements"] ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements; + const overflow = await detectOverflow(state, detectOverflowOptions); + const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0; + const currentPlacement = placements$1[currentIndex]; + if (currentPlacement == null) { + return {}; + } + const alignmentSides = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignmentSides"])(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); + // Make `computeCoords` start from the right place. + if (placement !== currentPlacement) { + return { + reset: { + placement: placements$1[0] + } + }; + } + const currentOverflows = [ + overflow[(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(currentPlacement)], + overflow[alignmentSides[0]], + overflow[alignmentSides[1]] + ]; + const allOverflows = [ + ...((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || [], + { + placement: currentPlacement, + overflows: currentOverflows + } + ]; + const nextPlacement = placements$1[currentIndex + 1]; + // There are more placements to check. + if (nextPlacement) { + return { + data: { + index: currentIndex + 1, + overflows: allOverflows + }, + reset: { + placement: nextPlacement + } + }; + } + const placementsSortedByMostSpace = allOverflows.map((d)=>{ + const alignment = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(d.placement); + return [ + d.placement, + alignment && crossAxis ? // Check along the mainAxis and main crossAxis side. + d.overflows.slice(0, 2).reduce((acc, v)=>acc + v, 0) : // Check only the mainAxis. + d.overflows[0], + d.overflows + ]; + }).sort((a, b)=>a[1] - b[1]); + const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter((d)=>d[2].slice(0, // Aligned placements should not check their opposite crossAxis + // side. + (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(d[0]) ? 2 : 3).every((v)=>v <= 0)); + const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0]; + if (resetPlacement !== placement) { + return { + data: { + index: currentIndex + 1, + overflows: allOverflows + }, + reset: { + placement: resetPlacement + } + }; + } + return {}; + } + }; +}; +/** + * Optimizes the visibility of the floating element by flipping the `placement` + * in order to keep it in view when the preferred placement(s) will overflow the + * clipping boundary. Alternative to `autoPlacement`. + * @see https://floating-ui.com/docs/flip + */ const flip = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'flip', + options, + async fn (state) { + var _middlewareData$arrow, _middlewareData$flip; + const { placement, middlewareData, rects, initialPlacement, platform, elements } = state; + const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = 'bestFit', fallbackAxisSideDirection = 'none', flipAlignment = true, ...detectOverflowOptions } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + // If a reset by the arrow was caused due to an alignment offset being + // added, we should skip any logic now since `flip()` has already done its + // work. + // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643 + if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + const side = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement); + const initialSideAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(initialPlacement); + const isBasePlacement = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(initialPlacement) === initialPlacement; + const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); + const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [ + (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOppositePlacement"])(initialPlacement) + ] : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getExpandedPlacements"])(initialPlacement)); + const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none'; + if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { + fallbackPlacements.push(...(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOppositeAxisPlacements"])(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); + } + const placements = [ + initialPlacement, + ...fallbackPlacements + ]; + const overflow = await detectOverflow(state, detectOverflowOptions); + const overflows = []; + let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; + if (checkMainAxis) { + overflows.push(overflow[side]); + } + if (checkCrossAxis) { + const sides = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignmentSides"])(placement, rects, rtl); + overflows.push(overflow[sides[0]], overflow[sides[1]]); + } + overflowsData = [ + ...overflowsData, + { + placement, + overflows + } + ]; + // One or more sides is overflowing. + if (!overflows.every((side)=>side <= 0)) { + var _middlewareData$flip2, _overflowsData$filter; + const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; + const nextPlacement = placements[nextIndex]; + if (nextPlacement) { + const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(nextPlacement) : false; + if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis + // overflows the main axis. + overflowsData.every((d)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) { + // Try next placement and re-run the lifecycle. + return { + data: { + index: nextIndex, + overflows: overflowsData + }, + reset: { + placement: nextPlacement + } + }; + } + } + // First, find the candidates that fit on the mainAxis side of overflow, + // then find the placement that fits the best on the main crossAxis side. + let resetPlacement = (_overflowsData$filter = overflowsData.filter((d)=>d.overflows[0] <= 0).sort((a, b)=>a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; + // Otherwise fallback. + if (!resetPlacement) { + switch(fallbackStrategy){ + case 'bestFit': + { + var _overflowsData$filter2; + const placement = (_overflowsData$filter2 = overflowsData.filter((d)=>{ + if (hasFallbackAxisSideDirection) { + const currentSideAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(d.placement); + return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal + // reading directions favoring greater width. + currentSideAxis === 'y'; + } + return true; + }).map((d)=>[ + d.placement, + d.overflows.filter((overflow)=>overflow > 0).reduce((acc, overflow)=>acc + overflow, 0) + ]).sort((a, b)=>a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; + if (placement) { + resetPlacement = placement; + } + break; + } + case 'initialPlacement': + resetPlacement = initialPlacement; + break; + } + } + if (placement !== resetPlacement) { + return { + reset: { + placement: resetPlacement + } + }; + } + } + return {}; + } + }; +}; +function getSideOffsets(overflow, rect) { + return { + top: overflow.top - rect.height, + right: overflow.right - rect.width, + bottom: overflow.bottom - rect.height, + left: overflow.left - rect.width + }; +} +function isAnySideFullyClipped(overflow) { + return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["sides"].some((side)=>overflow[side] >= 0); +} +/** + * Provides data to hide the floating element in applicable situations, such as + * when it is not in the same clipping context as the reference element. + * @see https://floating-ui.com/docs/hide + */ const hide = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'hide', + options, + async fn (state) { + const { rects } = state; + const { strategy = 'referenceHidden', ...detectOverflowOptions } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + switch(strategy){ + case 'referenceHidden': + { + const overflow = await detectOverflow(state, { + ...detectOverflowOptions, + elementContext: 'reference' + }); + const offsets = getSideOffsets(overflow, rects.reference); + return { + data: { + referenceHiddenOffsets: offsets, + referenceHidden: isAnySideFullyClipped(offsets) + } + }; + } + case 'escaped': + { + const overflow = await detectOverflow(state, { + ...detectOverflowOptions, + altBoundary: true + }); + const offsets = getSideOffsets(overflow, rects.floating); + return { + data: { + escapedOffsets: offsets, + escaped: isAnySideFullyClipped(offsets) + } + }; + } + default: + { + return {}; + } + } + } + }; +}; +function getBoundingRect(rects) { + const minX = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(...rects.map((rect)=>rect.left)); + const minY = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(...rects.map((rect)=>rect.top)); + const maxX = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(...rects.map((rect)=>rect.right)); + const maxY = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(...rects.map((rect)=>rect.bottom)); + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY + }; +} +function getRectsByLine(rects) { + const sortedRects = rects.slice().sort((a, b)=>a.y - b.y); + const groups = []; + let prevRect = null; + for(let i = 0; i < sortedRects.length; i++){ + const rect = sortedRects[i]; + if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) { + groups.push([ + rect + ]); + } else { + groups[groups.length - 1].push(rect); + } + prevRect = rect; + } + return groups.map((rect)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])(getBoundingRect(rect))); +} +/** + * Provides improved positioning for inline reference elements that can span + * over multiple lines, such as hyperlinks or range selections. + * @see https://floating-ui.com/docs/inline + */ const inline = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'inline', + options, + async fn (state) { + const { placement, elements, rects, platform, strategy } = state; + // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a + // ClientRect's bounds, despite the event listener being triggered. A + // padding of 2 seems to handle this issue. + const { padding = 2, x, y } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const nativeClientRects = Array.from(await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference)) || []); + const clientRects = getRectsByLine(nativeClientRects); + const fallback = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])(getBoundingRect(nativeClientRects)); + const paddingObject = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getPaddingObject"])(padding); + function getBoundingClientRect() { + // There are two rects and they are disjoined. + if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) { + // Find the first rect in which the point is fully inside. + return clientRects.find((rect)=>x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback; + } + // There are 2 or more connected rects. + if (clientRects.length >= 2) { + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(placement) === 'y') { + const firstRect = clientRects[0]; + const lastRect = clientRects[clientRects.length - 1]; + const isTop = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement) === 'top'; + const top = firstRect.top; + const bottom = lastRect.bottom; + const left = isTop ? firstRect.left : lastRect.left; + const right = isTop ? firstRect.right : lastRect.right; + const width = right - left; + const height = bottom - top; + return { + top, + bottom, + left, + right, + width, + height, + x: left, + y: top + }; + } + const isLeftSide = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement) === 'left'; + const maxRight = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(...clientRects.map((rect)=>rect.right)); + const minLeft = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(...clientRects.map((rect)=>rect.left)); + const measureRects = clientRects.filter((rect)=>isLeftSide ? rect.left === minLeft : rect.right === maxRight); + const top = measureRects[0].top; + const bottom = measureRects[measureRects.length - 1].bottom; + const left = minLeft; + const right = maxRight; + const width = right - left; + const height = bottom - top; + return { + top, + bottom, + left, + right, + width, + height, + x: left, + y: top + }; + } + return fallback; + } + const resetRects = await platform.getElementRects({ + reference: { + getBoundingClientRect + }, + floating: elements.floating, + strategy + }); + if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) { + return { + reset: { + rects: resetRects + } + }; + } + return {}; + } + }; +}; +const originSides = /*#__PURE__*/ new Set([ + 'left', + 'top' +]); +// For type backwards-compatibility, the `OffsetOptions` type was also +// Derivable. +async function convertValueToCoords(state, options) { + const { placement, platform, elements } = state; + const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)); + const side = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement); + const alignment = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement); + const isVertical = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(placement) === 'y'; + const mainAxisMulti = originSides.has(side) ? -1 : 1; + const crossAxisMulti = rtl && isVertical ? -1 : 1; + const rawValue = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + // eslint-disable-next-line prefer-const + let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === 'number' ? { + mainAxis: rawValue, + crossAxis: 0, + alignmentAxis: null + } : { + mainAxis: rawValue.mainAxis || 0, + crossAxis: rawValue.crossAxis || 0, + alignmentAxis: rawValue.alignmentAxis + }; + if (alignment && typeof alignmentAxis === 'number') { + crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis; + } + return isVertical ? { + x: crossAxis * crossAxisMulti, + y: mainAxis * mainAxisMulti + } : { + x: mainAxis * mainAxisMulti, + y: crossAxis * crossAxisMulti + }; +} +/** + * Modifies the placement by translating the floating element along the + * specified axes. + * A number (shorthand for `mainAxis` or distance), or an axes configuration + * object may be passed. + * @see https://floating-ui.com/docs/offset + */ const offset = function(options) { + if (options === void 0) { + options = 0; + } + return { + name: 'offset', + options, + async fn (state) { + var _middlewareData$offse, _middlewareData$arrow; + const { x, y, placement, middlewareData } = state; + const diffCoords = await convertValueToCoords(state, options); + // If the placement is the same and the arrow caused an alignment offset + // then we don't need to change the positioning coordinates. + if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + return { + x: x + diffCoords.x, + y: y + diffCoords.y, + data: { + ...diffCoords, + placement + } + }; + } + }; +}; +/** + * Optimizes the visibility of the floating element by shifting it in order to + * keep it in view when it will overflow the clipping boundary. + * @see https://floating-ui.com/docs/shift + */ const shift = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'shift', + options, + async fn (state) { + const { x, y, placement } = state; + const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { + fn: (_ref)=>{ + let { x, y } = _ref; + return { + x, + y + }; + } + }, ...detectOverflowOptions } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const coords = { + x, + y + }; + const overflow = await detectOverflow(state, detectOverflowOptions); + const crossAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement)); + const mainAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOppositeAxis"])(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + if (checkMainAxis) { + const minSide = mainAxis === 'y' ? 'top' : 'left'; + const maxSide = mainAxis === 'y' ? 'bottom' : 'right'; + const min = mainAxisCoord + overflow[minSide]; + const max = mainAxisCoord - overflow[maxSide]; + mainAxisCoord = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["clamp"])(min, mainAxisCoord, max); + } + if (checkCrossAxis) { + const minSide = crossAxis === 'y' ? 'top' : 'left'; + const maxSide = crossAxis === 'y' ? 'bottom' : 'right'; + const min = crossAxisCoord + overflow[minSide]; + const max = crossAxisCoord - overflow[maxSide]; + crossAxisCoord = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["clamp"])(min, crossAxisCoord, max); + } + const limitedCoords = limiter.fn({ + ...state, + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }); + return { + ...limitedCoords, + data: { + x: limitedCoords.x - x, + y: limitedCoords.y - y, + enabled: { + [mainAxis]: checkMainAxis, + [crossAxis]: checkCrossAxis + } + } + }; + } + }; +}; +/** + * Built-in `limiter` that will stop `shift()` at a certain point. + */ const limitShift = function(options) { + if (options === void 0) { + options = {}; + } + return { + options, + fn (state) { + const { x, y, placement, rects, middlewareData } = state; + const { offset = 0, mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const coords = { + x, + y + }; + const crossAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(placement); + const mainAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOppositeAxis"])(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + const rawOffset = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(offset, state); + const computedOffset = typeof rawOffset === 'number' ? { + mainAxis: rawOffset, + crossAxis: 0 + } : { + mainAxis: 0, + crossAxis: 0, + ...rawOffset + }; + if (checkMainAxis) { + const len = mainAxis === 'y' ? 'height' : 'width'; + const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; + const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; + if (mainAxisCoord < limitMin) { + mainAxisCoord = limitMin; + } else if (mainAxisCoord > limitMax) { + mainAxisCoord = limitMax; + } + } + if (checkCrossAxis) { + var _middlewareData$offse, _middlewareData$offse2; + const len = mainAxis === 'y' ? 'width' : 'height'; + const isOriginSide = originSides.has((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement)); + const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); + const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); + if (crossAxisCoord < limitMin) { + crossAxisCoord = limitMin; + } else if (crossAxisCoord > limitMax) { + crossAxisCoord = limitMax; + } + } + return { + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }; + } + }; +}; +/** + * Provides data that allows you to change the size of the floating element — + * for instance, prevent it from overflowing the clipping boundary or match the + * width of the reference element. + * @see https://floating-ui.com/docs/size + */ const size = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: 'size', + options, + async fn (state) { + var _state$middlewareData, _state$middlewareData2; + const { placement, rects, platform, elements } = state; + const { apply = ()=>{}, ...detectOverflowOptions } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["evaluate"])(options, state); + const overflow = await detectOverflow(state, detectOverflowOptions); + const side = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSide"])(placement); + const alignment = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getAlignment"])(placement); + const isYAxis = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getSideAxis"])(placement) === 'y'; + const { width, height } = rects.floating; + let heightSide; + let widthSide; + if (side === 'top' || side === 'bottom') { + heightSide = side; + widthSide = alignment === (await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)) ? 'start' : 'end') ? 'left' : 'right'; + } else { + widthSide = side; + heightSide = alignment === 'end' ? 'top' : 'bottom'; + } + const maximumClippingHeight = height - overflow.top - overflow.bottom; + const maximumClippingWidth = width - overflow.left - overflow.right; + const overflowAvailableHeight = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(height - overflow[heightSide], maximumClippingHeight); + const overflowAvailableWidth = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(width - overflow[widthSide], maximumClippingWidth); + const noShift = !state.middlewareData.shift; + let availableHeight = overflowAvailableHeight; + let availableWidth = overflowAvailableWidth; + if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { + availableWidth = maximumClippingWidth; + } + if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { + availableHeight = maximumClippingHeight; + } + if (noShift && !alignment) { + const xMin = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.left, 0); + const xMax = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.right, 0); + const yMin = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.top, 0); + const yMax = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.bottom, 0); + if (isYAxis) { + availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.left, overflow.right)); + } else { + availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(overflow.top, overflow.bottom)); + } + } + await apply({ + ...state, + availableWidth, + availableHeight + }); + const nextDimensions = await platform.getDimensions(elements.floating); + if (width !== nextDimensions.width || height !== nextDimensions.height) { + return { + reset: { + rects: true + } + }; + } + return {}; + } + }; +}; +; +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs [app-ssr] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "getComputedStyle", + ()=>getComputedStyle, + "getContainingBlock", + ()=>getContainingBlock, + "getDocumentElement", + ()=>getDocumentElement, + "getFrameElement", + ()=>getFrameElement, + "getNearestOverflowAncestor", + ()=>getNearestOverflowAncestor, + "getNodeName", + ()=>getNodeName, + "getNodeScroll", + ()=>getNodeScroll, + "getOverflowAncestors", + ()=>getOverflowAncestors, + "getParentNode", + ()=>getParentNode, + "getWindow", + ()=>getWindow, + "isContainingBlock", + ()=>isContainingBlock, + "isElement", + ()=>isElement, + "isHTMLElement", + ()=>isHTMLElement, + "isLastTraversableNode", + ()=>isLastTraversableNode, + "isNode", + ()=>isNode, + "isOverflowElement", + ()=>isOverflowElement, + "isShadowRoot", + ()=>isShadowRoot, + "isTableElement", + ()=>isTableElement, + "isTopLayer", + ()=>isTopLayer, + "isWebKit", + ()=>isWebKit +]); +function hasWindow() { + return ("TURBOPACK compile-time value", "undefined") !== 'undefined'; +} +function getNodeName(node) { + if (isNode(node)) { + return (node.nodeName || '').toLowerCase(); + } + // Mocked nodes in testing environments may not be instances of Node. By + // returning `#document` an infinite loop won't occur. + // https://github.com/floating-ui/floating-ui/issues/2317 + return '#document'; +} +function getWindow(node) { + var _node$ownerDocument; + return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; +} +function getDocumentElement(node) { + var _ref; + return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; +} +function isNode(value) { + if (!hasWindow()) { + return false; + } + //TURBOPACK unreachable + ; +} +function isElement(value) { + if (!hasWindow()) { + return false; + } + //TURBOPACK unreachable + ; +} +function isHTMLElement(value) { + if (!hasWindow()) { + return false; + } + //TURBOPACK unreachable + ; +} +function isShadowRoot(value) { + if (!hasWindow() || typeof ShadowRoot === 'undefined') { + return false; + } + //TURBOPACK unreachable + ; +} +const invalidOverflowDisplayValues = /*#__PURE__*/ new Set([ + 'inline', + 'contents' +]); +function isOverflowElement(element) { + const { overflow, overflowX, overflowY, display } = getComputedStyle(element); + return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display); +} +const tableElements = /*#__PURE__*/ new Set([ + 'table', + 'td', + 'th' +]); +function isTableElement(element) { + return tableElements.has(getNodeName(element)); +} +const topLayerSelectors = [ + ':popover-open', + ':modal' +]; +function isTopLayer(element) { + return topLayerSelectors.some((selector)=>{ + try { + return element.matches(selector); + } catch (_e) { + return false; + } + }); +} +const transformProperties = [ + 'transform', + 'translate', + 'scale', + 'rotate', + 'perspective' +]; +const willChangeValues = [ + 'transform', + 'translate', + 'scale', + 'rotate', + 'perspective', + 'filter' +]; +const containValues = [ + 'paint', + 'layout', + 'strict', + 'content' +]; +function isContainingBlock(elementOrCss) { + const webkit = isWebKit(); + const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss; + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + // https://drafts.csswg.org/css-transforms-2/#individual-transforms + return transformProperties.some((value)=>css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some((value)=>(css.willChange || '').includes(value)) || containValues.some((value)=>(css.contain || '').includes(value)); +} +function getContainingBlock(element) { + let currentNode = getParentNode(element); + while(isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)){ + if (isContainingBlock(currentNode)) { + return currentNode; + } else if (isTopLayer(currentNode)) { + return null; + } + currentNode = getParentNode(currentNode); + } + return null; +} +function isWebKit() { + if (typeof CSS === 'undefined' || !CSS.supports) return false; + return CSS.supports('-webkit-backdrop-filter', 'none'); +} +const lastTraversableNodeNames = /*#__PURE__*/ new Set([ + 'html', + 'body', + '#document' +]); +function isLastTraversableNode(node) { + return lastTraversableNodeNames.has(getNodeName(node)); +} +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} +function getNodeScroll(element) { + if (isElement(element)) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + return { + scrollLeft: element.scrollX, + scrollTop: element.scrollY + }; +} +function getParentNode(node) { + if (getNodeName(node) === 'html') { + return node; + } + const result = // Step into the shadow DOM of the parent of a slotted node. + node.assignedSlot || // DOM Element detected. + node.parentNode || // ShadowRoot detected. + isShadowRoot(node) && node.host || // Fallback. + getDocumentElement(node); + return isShadowRoot(result) ? result.host : result; +} +function getNearestOverflowAncestor(node) { + const parentNode = getParentNode(node); + if (isLastTraversableNode(parentNode)) { + return node.ownerDocument ? node.ownerDocument.body : node.body; + } + if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { + return parentNode; + } + return getNearestOverflowAncestor(parentNode); +} +function getOverflowAncestors(node, list, traverseIframes) { + var _node$ownerDocument2; + if (list === void 0) { + list = []; + } + if (traverseIframes === void 0) { + traverseIframes = true; + } + const scrollableAncestor = getNearestOverflowAncestor(node); + const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); + const win = getWindow(scrollableAncestor); + if (isBody) { + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); + } + return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); +} +function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; +} +; +}), +"[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs [app-ssr] (ecmascript) ", ((__turbopack_context__) => { +"use strict"; + +__turbopack_context__.s([ + "arrow", + ()=>arrow, + "autoPlacement", + ()=>autoPlacement, + "autoUpdate", + ()=>autoUpdate, + "computePosition", + ()=>computePosition, + "detectOverflow", + ()=>detectOverflow, + "flip", + ()=>flip, + "hide", + ()=>hide, + "inline", + ()=>inline, + "limitShift", + ()=>limitShift, + "offset", + ()=>offset, + "platform", + ()=>platform, + "shift", + ()=>shift, + "size", + ()=>size +]); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs [app-ssr] (ecmascript)"); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$core$40$1$2e$7$2e$3$2f$node_modules$2f40$floating$2d$ui$2f$core$2f$dist$2f$floating$2d$ui$2e$core$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs [app-ssr] (ecmascript) "); +var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs [app-ssr] (ecmascript)"); +; +; +; +; +function getCssDimensions(element) { + const css = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(element); + // In testing environments, the `width` and `height` properties are empty + // strings for SVG elements, returning NaN. Fallback to `0` in this case. + let width = parseFloat(css.width) || 0; + let height = parseFloat(css.height) || 0; + const hasOffset = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(element); + const offsetWidth = hasOffset ? element.offsetWidth : width; + const offsetHeight = hasOffset ? element.offsetHeight : height; + const shouldFallback = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["round"])(width) !== offsetWidth || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["round"])(height) !== offsetHeight; + if (shouldFallback) { + width = offsetWidth; + height = offsetHeight; + } + return { + width, + height, + $: shouldFallback + }; +} +function unwrapElement(element) { + return !(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(element) ? element.contextElement : element; +} +function getScale(element) { + const domElement = unwrapElement(element); + if (!(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(domElement)) { + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(1); + } + const rect = domElement.getBoundingClientRect(); + const { width, height, $ } = getCssDimensions(domElement); + let x = ($ ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["round"])(rect.width) : rect.width) / width; + let y = ($ ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["round"])(rect.height) : rect.height) / height; + // 0, NaN, or Infinity should always fallback to 1. + if (!x || !Number.isFinite(x)) { + x = 1; + } + if (!y || !Number.isFinite(y)) { + y = 1; + } + return { + x, + y + }; +} +const noOffsets = /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); +function getVisualOffsets(element) { + const win = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(element); + if (!(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isWebKit"])() || !win.visualViewport) { + return noOffsets; + } + return { + x: win.visualViewport.offsetLeft, + y: win.visualViewport.offsetTop + }; +} +function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { + if (isFixed === void 0) { + isFixed = false; + } + if (!floatingOffsetParent || isFixed && floatingOffsetParent !== (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(element)) { + return false; + } + return isFixed; +} +function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { + if (includeScale === void 0) { + includeScale = false; + } + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + const clientRect = element.getBoundingClientRect(); + const domElement = unwrapElement(element); + let scale = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(1); + if (includeScale) { + if (offsetParent) { + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(offsetParent)) { + scale = getScale(offsetParent); + } + } else { + scale = getScale(element); + } + } + const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); + let x = (clientRect.left + visualOffsets.x) / scale.x; + let y = (clientRect.top + visualOffsets.y) / scale.y; + let width = clientRect.width / scale.x; + let height = clientRect.height / scale.y; + if (domElement) { + const win = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(domElement); + const offsetWin = offsetParent && (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(offsetParent) ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(offsetParent) : offsetParent; + let currentWin = win; + let currentIFrame = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getFrameElement"])(currentWin); + while(currentIFrame && offsetParent && offsetWin !== currentWin){ + const iframeScale = getScale(currentIFrame); + const iframeRect = currentIFrame.getBoundingClientRect(); + const css = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(currentIFrame); + const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; + const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; + x *= iframeScale.x; + y *= iframeScale.y; + width *= iframeScale.x; + height *= iframeScale.y; + x += left; + y += top; + currentWin = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(currentIFrame); + currentIFrame = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getFrameElement"])(currentWin); + } + } + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])({ + width, + height, + x, + y + }); +} +// If has a CSS width greater than the viewport, then this will be +// incorrect for RTL. +function getWindowScrollBarX(element, rect) { + const leftScroll = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeScroll"])(element).scrollLeft; + if (!rect) { + return getBoundingClientRect((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element)).left + leftScroll; + } + return rect.left + leftScroll; +} +function getHTMLOffset(documentElement, scroll) { + const htmlRect = documentElement.getBoundingClientRect(); + const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); + const y = htmlRect.top + scroll.scrollTop; + return { + x, + y + }; +} +function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { + let { elements, rect, offsetParent, strategy } = _ref; + const isFixed = strategy === 'fixed'; + const documentElement = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(offsetParent); + const topLayer = elements ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isTopLayer"])(elements.floating) : false; + if (offsetParent === documentElement || topLayer && isFixed) { + return rect; + } + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + let scale = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(1); + const offsets = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); + const isOffsetParentAnElement = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(offsetParent); + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeName"])(offsetParent) !== 'body' || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isOverflowElement"])(documentElement)) { + scroll = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeScroll"])(offsetParent); + } + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(offsetParent)) { + const offsetRect = getBoundingClientRect(offsetParent); + scale = getScale(offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); + return { + width: rect.width * scale.x, + height: rect.height * scale.y, + x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, + y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y + }; +} +function getClientRects(element) { + return Array.from(element.getClientRects()); +} +// Gets the entire size of the scrollable document area, even extending outside +// of the `` and `` rect bounds if horizontally scrollable. +function getDocumentRect(element) { + const html = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element); + const scroll = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeScroll"])(element); + const body = element.ownerDocument.body; + const width = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); + const height = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); + let x = -scroll.scrollLeft + getWindowScrollBarX(element); + const y = -scroll.scrollTop; + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(body).direction === 'rtl') { + x += (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(html.clientWidth, body.clientWidth) - width; + } + return { + width, + height, + x, + y + }; +} +// Safety check: ensure the scrollbar space is reasonable in case this +// calculation is affected by unusual styles. +// Most scrollbars leave 15-18px of space. +const SCROLLBAR_MAX = 25; +function getViewportRect(element, strategy) { + const win = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(element); + const html = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element); + const visualViewport = win.visualViewport; + let width = html.clientWidth; + let height = html.clientHeight; + let x = 0; + let y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + const visualViewportBased = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isWebKit"])(); + if (!visualViewportBased || visualViewportBased && strategy === 'fixed') { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + const windowScrollbarX = getWindowScrollBarX(html); + // `overflow: hidden` + `scrollbar-gutter: stable` reduces the + // visual width of the but this is not considered in the size + // of `html.clientWidth`. + if (windowScrollbarX <= 0) { + const doc = html.ownerDocument; + const body = doc.body; + const bodyStyles = getComputedStyle(body); + const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; + const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); + if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { + width -= clippingStableScrollbarWidth; + } + } else if (windowScrollbarX <= SCROLLBAR_MAX) { + // If the scrollbar is on the left, the width needs to be extended + // by the scrollbar amount so there isn't extra space on the right. + width += windowScrollbarX; + } + return { + width, + height, + x, + y + }; +} +const absoluteOrFixed = /*#__PURE__*/ new Set([ + 'absolute', + 'fixed' +]); +// Returns the inner client rect, subtracting scrollbars if present. +function getInnerBoundingClientRect(element, strategy) { + const clientRect = getBoundingClientRect(element, true, strategy === 'fixed'); + const top = clientRect.top + element.clientTop; + const left = clientRect.left + element.clientLeft; + const scale = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(element) ? getScale(element) : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(1); + const width = element.clientWidth * scale.x; + const height = element.clientHeight * scale.y; + const x = left * scale.x; + const y = top * scale.y; + return { + width, + height, + x, + y + }; +} +function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { + let rect; + if (clippingAncestor === 'viewport') { + rect = getViewportRect(element, strategy); + } else if (clippingAncestor === 'document') { + rect = getDocumentRect((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element)); + } else if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(clippingAncestor)) { + rect = getInnerBoundingClientRect(clippingAncestor, strategy); + } else { + const visualOffsets = getVisualOffsets(element); + rect = { + x: clippingAncestor.x - visualOffsets.x, + y: clippingAncestor.y - visualOffsets.y, + width: clippingAncestor.width, + height: clippingAncestor.height + }; + } + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["rectToClientRect"])(rect); +} +function hasFixedPositionAncestor(element, stopNode) { + const parentNode = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getParentNode"])(element); + if (parentNode === stopNode || !(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(parentNode) || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isLastTraversableNode"])(parentNode)) { + return false; + } + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode); +} +// A "clipping ancestor" is an `overflow` element with the characteristic of +// clipping (or hiding) child elements. This returns all clipping ancestors +// of the given element up the tree. +function getClippingElementAncestors(element, cache) { + const cachedResult = cache.get(element); + if (cachedResult) { + return cachedResult; + } + let result = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getOverflowAncestors"])(element, [], false).filter((el)=>(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(el) && (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeName"])(el) !== 'body'); + let currentContainingBlockComputedStyle = null; + const elementIsFixed = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(element).position === 'fixed'; + let currentNode = elementIsFixed ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getParentNode"])(element) : element; + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + while((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(currentNode) && !(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isLastTraversableNode"])(currentNode)){ + const computedStyle = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(currentNode); + const currentNodeIsContaining = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isContainingBlock"])(currentNode); + if (!currentNodeIsContaining && computedStyle.position === 'fixed') { + currentContainingBlockComputedStyle = null; + } + const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isOverflowElement"])(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); + if (shouldDropCurrentNode) { + // Drop non-containing blocks. + result = result.filter((ancestor)=>ancestor !== currentNode); + } else { + // Record last containing block for next iteration. + currentContainingBlockComputedStyle = computedStyle; + } + currentNode = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getParentNode"])(currentNode); + } + cache.set(element, result); + return result; +} +// Gets the maximum area that the element is visible in due to any number of +// clipping ancestors. +function getClippingRect(_ref) { + let { element, boundary, rootBoundary, strategy } = _ref; + const elementClippingAncestors = boundary === 'clippingAncestors' ? (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isTopLayer"])(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); + const clippingAncestors = [ + ...elementClippingAncestors, + rootBoundary + ]; + const firstClippingAncestor = clippingAncestors[0]; + const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor)=>{ + const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); + accRect.top = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(rect.top, accRect.top); + accRect.right = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(rect.right, accRect.right); + accRect.bottom = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(rect.bottom, accRect.bottom); + accRect.left = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(rect.left, accRect.left); + return accRect; + }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); + return { + width: clippingRect.right - clippingRect.left, + height: clippingRect.bottom - clippingRect.top, + x: clippingRect.left, + y: clippingRect.top + }; +} +function getDimensions(element) { + const { width, height } = getCssDimensions(element); + return { + width, + height + }; +} +function getRectRelativeToOffsetParent(element, offsetParent, strategy) { + const isOffsetParentAnElement = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(offsetParent); + const documentElement = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(offsetParent); + const isFixed = strategy === 'fixed'; + const rect = getBoundingClientRect(element, true, isFixed, offsetParent); + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + const offsets = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); + // If the scrollbar appears on the left (e.g. RTL systems). Use + // Firefox with layout.scrollbar.side = 3 in about:config to test this. + function setLeftRTLScrollbarOffset() { + offsets.x = getWindowScrollBarX(documentElement); + } + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeName"])(offsetParent) !== 'body' || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isOverflowElement"])(documentElement)) { + scroll = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getNodeScroll"])(offsetParent); + } + if (isOffsetParentAnElement) { + const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } else if (documentElement) { + setLeftRTLScrollbarOffset(); + } + } + if (isFixed && !isOffsetParentAnElement && documentElement) { + setLeftRTLScrollbarOffset(); + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createCoords"])(0); + const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; + const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; + return { + x, + y, + width: rect.width, + height: rect.height + }; +} +function isStaticPositioned(element) { + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(element).position === 'static'; +} +function getTrueOffsetParent(element, polyfill) { + if (!(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(element) || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(element).position === 'fixed') { + return null; + } + if (polyfill) { + return polyfill(element); + } + let rawOffsetParent = element.offsetParent; + // Firefox returns the element as the offsetParent if it's non-static, + // while Chrome and Safari return the element. The element must + // be used to perform the correct calculations even if the element is + // non-static. + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element) === rawOffsetParent) { + rawOffsetParent = rawOffsetParent.ownerDocument.body; + } + return rawOffsetParent; +} +// Gets the closest ancestor positioned element. Handles some edge cases, +// such as table ancestors and cross browser bugs. +function getOffsetParent(element, polyfill) { + const win = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getWindow"])(element); + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isTopLayer"])(element)) { + return win; + } + if (!(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isHTMLElement"])(element)) { + let svgOffsetParent = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getParentNode"])(element); + while(svgOffsetParent && !(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isLastTraversableNode"])(svgOffsetParent)){ + if ((0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"])(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { + return svgOffsetParent; + } + svgOffsetParent = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getParentNode"])(svgOffsetParent); + } + return win; + } + let offsetParent = getTrueOffsetParent(element, polyfill); + while(offsetParent && (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isTableElement"])(offsetParent) && isStaticPositioned(offsetParent)){ + offsetParent = getTrueOffsetParent(offsetParent, polyfill); + } + if (offsetParent && (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isLastTraversableNode"])(offsetParent) && isStaticPositioned(offsetParent) && !(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isContainingBlock"])(offsetParent)) { + return win; + } + return offsetParent || (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getContainingBlock"])(element) || win; +} +const getElementRects = async function(data) { + const getOffsetParentFn = this.getOffsetParent || getOffsetParent; + const getDimensionsFn = this.getDimensions; + const floatingDimensions = await getDimensionsFn(data.floating); + return { + reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), + floating: { + x: 0, + y: 0, + width: floatingDimensions.width, + height: floatingDimensions.height + } + }; +}; +function isRTL(element) { + return (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getComputedStyle"])(element).direction === 'rtl'; +} +const platform = { + convertOffsetParentRelativeRectToViewportRelativeRect, + getDocumentElement: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"], + getClippingRect, + getOffsetParent, + getElementRects, + getClientRects, + getDimensions, + getScale, + isElement: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["isElement"], + isRTL +}; +function rectsAreEqual(a, b) { + return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; +} +// https://samthor.au/2021/observing-dom/ +function observeMove(element, onMove) { + let io = null; + let timeoutId; + const root = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$dom$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["getDocumentElement"])(element); + function cleanup() { + var _io; + clearTimeout(timeoutId); + (_io = io) == null || _io.disconnect(); + io = null; + } + function refresh(skip, threshold) { + if (skip === void 0) { + skip = false; + } + if (threshold === void 0) { + threshold = 1; + } + cleanup(); + const elementRectForRootMargin = element.getBoundingClientRect(); + const { left, top, width, height } = elementRectForRootMargin; + if (!skip) { + onMove(); + } + if (!width || !height) { + return; + } + const insetTop = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["floor"])(top); + const insetRight = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["floor"])(root.clientWidth - (left + width)); + const insetBottom = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["floor"])(root.clientHeight - (top + height)); + const insetLeft = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["floor"])(left); + const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; + const options = { + rootMargin, + threshold: (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["max"])(0, (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f40$floating$2d$ui$2b$utils$40$0$2e$2$2e$10$2f$node_modules$2f40$floating$2d$ui$2f$utils$2f$dist$2f$floating$2d$ui$2e$utils$2e$mjs__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["min"])(1, threshold)) || 1 + }; + let isFirstUpdate = true; + function handleObserve(entries) { + const ratio = entries[0].intersectionRatio; + if (ratio !== threshold) { + if (!isFirstUpdate) { + return refresh(); + } + if (!ratio) { + // If the reference is clipped, the ratio is 0. Throttle the refresh + // to prevent an infinite loop of updates. + timeoutId = setTimeout(()=>{ + refresh(false, 1e-7); + }, 1000); + } else { + refresh(false, ratio); + } + } + if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { + // It's possible that even though the ratio is reported as 1, the + // element is not actually fully within the IntersectionObserver's root + // area anymore. This can happen under performance constraints. This may + // be a bug in the browser's IntersectionObserver implementation. To + // work around this, we compare the element's bounding rect now with + // what it was at the time we created the IntersectionObserver. If they + // are not equal then the element moved, so we refresh. + refresh(); + } + isFirstUpdate = false; + } + // Older browsers don't support a `document` as the root and will throw an + // error. + try { + io = new IntersectionObserver(handleObserve, { + ...options, + // Handle