From d7bb86375d3ff481c7bb4b0e02211b6b025ffe46 Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Sun, 23 Nov 2025 16:46:36 +0800 Subject: [PATCH] 0.0.6.1 --- .next/dev/logs/next-development.log | 23 +++ .next/dev/server/app-paths-manifest.json | 5 +- ...s_go-new_chinese-family-tree_735c6a78._.js | 185 +++++++++--------- ...-new_chinese-family-tree_735c6a78._.js.map | 2 +- .../ssr/[root-of-the-server]__10b90bc2._.js | 2 +- .../[root-of-the-server]__10b90bc2._.js.map | 2 +- .../ssr/[root-of-the-server]__3f095049._.js | 2 +- .../[root-of-the-server]__3f095049._.js.map | 2 +- .next/dev/server/next-font-manifest.js | 2 +- .next/dev/server/next-font-manifest.json | 12 ++ ...s_go-new_chinese-family-tree_5461dd2a._.js | 2 +- ...-new_chinese-family-tree_5461dd2a._.js.map | 2 +- ...s_go-new_chinese-family-tree_c5040fe9._.js | 185 +++++++++--------- ...-new_chinese-family-tree_c5040fe9._.js.map | 2 +- ...s_go-new_chinese-family-tree_fa7c1a71._.js | 2 +- ...-new_chinese-family-tree_fa7c1a71._.js.map | 2 +- .next/dev/trace | 3 + app/members/page.tsx | 16 +- 18 files changed, 260 insertions(+), 191 deletions(-) diff --git a/.next/dev/logs/next-development.log b/.next/dev/logs/next-development.log index daddcdcd..9460303b 100644 --- a/.next/dev/logs/next-development.log +++ b/.next/dev/logs/next-development.log @@ -36,3 +36,26 @@ [00:02:30.526] Browser LOG %c[Vercel Web Analytics]%c Debug mode is enabled by default in development. No requests will be sent to the server. color: rgb(120, 120, 120) color: inherit [00:02:30.526] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/members","route":"/members"} [00:02:30.526] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members?treeId=cmib8zhrq0003hhxlvnsi96nh","r":"","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763887257144} +[00:03:19.864] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:21.135] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:21.194] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[00:03:21.200] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/cmib8zhse000jhhxlt3ppgfn2 color: rgb(120, 120, 120) color: inherit {"dp":"/members/[id]","o":"http://localhost:3000/members/cmib8zhse000jhhxlt3ppgfn2","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763887308083} +[00:03:21.417] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:21.434] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:23.218] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:23.253] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[00:03:23.301] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/new?spouseId=cmib8zhse000jhhxlt3ppgfn2&generation=3&gender=FEMALE color: rgb(120, 120, 120) color: inherit {"dp":"/members/new","o":"http://localhost:3000/members/new?spouseId=cmib8zhse000jhhxlt3ppgfn2&generation=3&gender=FEMALE","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763887310187} +[00:03:23.522] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:23.534] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:45.523] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:45.537] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:45.548] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:03:45.807] Server LOG 👥 GET /api/trees/[treeId]/members 返回数据: {} +[00:03:45.831] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members color: rgb(120, 120, 120) color: inherit {"dp":"/members","o":"http://localhost:3000/members","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763887332512} +[00:04:08.634] 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":1763887354886} +[00:04:08.793] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:04:08.807] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:04:24.908] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:04:24.920] Server LOG 🌳 GET /api/trees 返回数据: {} +[00:04:25.033] 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":1763887371872} +[00:07:02.684] Server LOG ✓ Compiled in 72ms diff --git a/.next/dev/server/app-paths-manifest.json b/.next/dev/server/app-paths-manifest.json index 14d5b9b6..56ba1137 100644 --- a/.next/dev/server/app-paths-manifest.json +++ b/.next/dev/server/app-paths-manifest.json @@ -4,6 +4,9 @@ "/api/trees/[treeId]/members/route": "app/api/trees/[treeId]/members/route.js", "/api/trees/[treeId]/route": "app/api/trees/[treeId]/route.js", "/api/trees/route": "app/api/trees/route.js", + "/members/[id]/page": "app/members/[id]/page.js", + "/members/new/page": "app/members/new/page.js", "/members/page": "app/members/page.js", - "/page": "app/page.js" + "/page": "app/page.js", + "/tree/page": "app/tree/page.js" } \ No newline at end of file diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js index 17cf750a..411ad077 100644 --- a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js @@ -1822,6 +1822,9 @@ function MembersPage() { const processedSpouses = new Set(); sortedFamilyMembers.forEach((member)=>{ result.push(member); + // 计算该家庭单元的成员数(主成员 + 配偶) + let familyUnitSize = 1 // 主成员自己 + ; // 如果有配偶,将配偶紧跟在后面 if (member.spouseIds && member.spouseIds.length > 0) { member.spouseIds.forEach((spouseId)=>{ @@ -1829,12 +1832,18 @@ function MembersPage() { if (spouse && !processedSpouses.has(spouseId)) { result.push(spouse); processedSpouses.add(spouseId); + familyUnitSize++; } }); - } else { - // 没有配偶,添加空白占位符 + } + // 计算需要添加的占位符数量,确保填满4的倍数 + // 例如:1个主成员 + 1个配偶 = 2人,需要添加2个占位符 + // 例如:1个主成员 + 3个配偶 = 4人,不需要占位符 + // 例如:1个主成员 + 0个配偶 = 1人,需要添加3个占位符 + const placeholdersNeeded = (4 - familyUnitSize % 4) % 4; + for(let i = 0; i < placeholdersNeeded; i++){ result.push({ - id: `placeholder-${member.id}`, + id: `placeholder-${member.id}-${i}`, isPlaceholder: true }); } @@ -1863,7 +1872,7 @@ function MembersPage() { children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$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: 209, + lineNumber: 219, 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", { @@ -1880,7 +1889,7 @@ function MembersPage() { children: "家族成员列表" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 213, + lineNumber: 223, 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", { @@ -1893,7 +1902,7 @@ function MembersPage() { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 216, + lineNumber: 226, 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"], { @@ -1904,13 +1913,13 @@ function MembersPage() { onChange: (e)=>setQuery(e.target.value) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 217, + lineNumber: 227, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 215, + lineNumber: 225, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$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"], { @@ -1923,20 +1932,20 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 231, + lineNumber: 241, 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: 233, + lineNumber: 243, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 225, + lineNumber: 235, 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"], { @@ -1948,31 +1957,31 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 238, + lineNumber: 248, columnNumber: 19 }, this), "新增成员" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 237, + lineNumber: 247, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 236, + lineNumber: 246, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 214, + lineNumber: 224, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 212, + lineNumber: 222, 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", { @@ -1986,7 +1995,7 @@ function MembersPage() { children: "高级筛选" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 249, + lineNumber: 259, 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"], { @@ -1999,20 +2008,20 @@ function MembersPage() { className: "mr-1 h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 251, + lineNumber: 261, columnNumber: 19 }, this), " 重置筛选" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 250, + lineNumber: 260, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 248, + lineNumber: 258, 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", { @@ -2026,7 +2035,7 @@ function MembersPage() { children: "姓氏 (Surname)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 256, + lineNumber: 266, 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"], { @@ -2038,12 +2047,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 259, + lineNumber: 269, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 258, + lineNumber: 268, 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"], { @@ -2053,7 +2062,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 262, + lineNumber: 272, 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"], { @@ -2061,25 +2070,25 @@ function MembersPage() { children: s }, s, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 264, + lineNumber: 274, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 261, + lineNumber: 271, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 257, + lineNumber: 267, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 255, + lineNumber: 265, 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", { @@ -2090,7 +2099,7 @@ function MembersPage() { children: "籍贯 (Ancestral Home)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 273, + lineNumber: 283, 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"], { @@ -2102,12 +2111,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 276, + lineNumber: 286, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 275, + lineNumber: 285, 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"], { @@ -2117,7 +2126,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 279, + lineNumber: 289, 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"], { @@ -2125,25 +2134,25 @@ function MembersPage() { children: h }, h, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 281, + lineNumber: 291, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 278, + lineNumber: 288, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 274, + lineNumber: 284, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 272, + lineNumber: 282, 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", { @@ -2154,7 +2163,7 @@ function MembersPage() { children: "状态 (Status)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 290, + lineNumber: 300, 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"], { @@ -2166,12 +2175,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 293, + lineNumber: 303, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 292, + lineNumber: 302, 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"], { @@ -2181,7 +2190,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 296, + lineNumber: 306, 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"], { @@ -2189,7 +2198,7 @@ function MembersPage() { children: "在世 (Living)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 297, + lineNumber: 307, 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"], { @@ -2197,25 +2206,25 @@ function MembersPage() { children: "已故 (Deceased)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 298, + lineNumber: 308, columnNumber: 23 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 295, + lineNumber: 305, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 291, + lineNumber: 301, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 289, + lineNumber: 299, 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", { @@ -2229,7 +2238,7 @@ function MembersPage() { children: "世系范围 (Generation)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 305, + lineNumber: 315, 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", { @@ -2242,13 +2251,13 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 306, + lineNumber: 316, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 304, + lineNumber: 314, 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"], { @@ -2264,31 +2273,31 @@ function MembersPage() { className: "py-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 310, + lineNumber: 320, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 303, + lineNumber: 313, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 254, + lineNumber: 264, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 247, + lineNumber: 257, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 211, + lineNumber: 221, 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", { @@ -2296,7 +2305,7 @@ function MembersPage() { children: "没有找到匹配的成员。" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 326, + lineNumber: 336, 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", @@ -2314,7 +2323,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 334, + lineNumber: 344, 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", { @@ -2326,20 +2335,20 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 335, + lineNumber: 345, 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: 336, + lineNumber: 346, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 333, + lineNumber: 343, 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", { @@ -2351,7 +2360,7 @@ function MembersPage() { className: "invisible" }, member.id, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 342, + lineNumber: 352, columnNumber: 30 }, this); } @@ -2385,7 +2394,7 @@ function MembersPage() { className: "h-20 w-20 border-2 border-border" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 368, + lineNumber: 378, 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", { @@ -2393,7 +2402,7 @@ function MembersPage() { title: "已故" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 377, + lineNumber: 387, 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", { @@ -2401,13 +2410,13 @@ function MembersPage() { title: "在世" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 380, + lineNumber: 390, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 367, + lineNumber: 377, 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", { @@ -2427,18 +2436,18 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 388, + lineNumber: 398, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 385, + lineNumber: 395, columnNumber: 31 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 384, + lineNumber: 394, 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", { @@ -2446,7 +2455,7 @@ function MembersPage() { children: "家族始祖" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 395, + lineNumber: 405, 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", @@ -2456,14 +2465,14 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 399, + lineNumber: 409, 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: 403, + lineNumber: 413, 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", { @@ -2474,7 +2483,7 @@ function MembersPage() { children: member.ancestralHome || "籍贯未知" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 410, + lineNumber: 420, 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", { @@ -2488,7 +2497,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 415, + lineNumber: 425, columnNumber: 35 }, this), (()=>{ @@ -2501,20 +2510,20 @@ function MembersPage() { children: member.deathDate ? `享年${age}岁` : `${age}岁` }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 426, + lineNumber: 436, columnNumber: 39 }, this); })() ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 414, + lineNumber: 424, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 409, + lineNumber: 419, 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", { @@ -2524,34 +2533,34 @@ function MembersPage() { children: tag }, tag, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 438, + lineNumber: 448, columnNumber: 35 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 436, + lineNumber: 446, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 383, + lineNumber: 393, columnNumber: 27 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 366, + lineNumber: 376, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 361, + lineNumber: 371, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 360, + lineNumber: 370, 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"], { @@ -2567,47 +2576,47 @@ function MembersPage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 461, + lineNumber: 471, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 451, + lineNumber: 461, columnNumber: 21 }, this) ] }, member.id, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 359, + lineNumber: 369, columnNumber: 21 }, this); }) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 338, + lineNumber: 348, columnNumber: 17 }, this) ] }, generation, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 332, + lineNumber: 342, columnNumber: 15 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 330, + lineNumber: 340, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 210, + lineNumber: 220, columnNumber: 7 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 208, + lineNumber: 218, columnNumber: 5 }, this); } diff --git a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js.map b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js.map index d6855935..66f2bb2a 100644 --- a/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js.map +++ b/.next/dev/server/chunks/ssr/Documents_go-new_chinese-family-tree_735c6a78._.js.map @@ -9,5 +9,5 @@ {"offset": {"line": 1254, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { db } from \"@/lib/db\"\nimport { CircleUser, CircleUserRound } from \"lucide-react\"\nimport type { Gender } from \"@/types/family\"\n\ninterface AvatarDisplayProps {\n imageId?: string\n fallbackUrl?: string\n fallbackText?: string\n gender?: Gender\n className?: string\n}\n\nexport function AvatarDisplay({ imageId, fallbackUrl, fallbackText, gender, className }: AvatarDisplayProps) {\n const [blobUrl, setBlobUrl] = useState(undefined)\n\n useEffect(() => {\n if (imageId) {\n db.images.get(imageId).then((image) => {\n if (image) {\n const url = URL.createObjectURL(image.blob)\n setBlobUrl(url)\n return () => URL.revokeObjectURL(url)\n }\n })\n } else {\n setBlobUrl(undefined)\n }\n }, [imageId])\n\n // 如果有头像,显示头像\n if (blobUrl) {\n return (\n \n \n {fallbackText}\n \n )\n }\n\n // 没有头像,显示性别图标\n return (\n \n \n {gender === 'FEMALE' ? (\n \n ) : (\n \n )}\n \n \n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AAAA;AALA;;;;;;AAgBO,SAAS,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAsB;IACzG,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,uYAAQ,EAAqB;IAE3D,IAAA,wYAAS,EAAC;QACR,IAAI,SAAS;YACX,sKAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC3B,IAAI,OAAO;oBACT,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;oBAC1C,WAAW;oBACX,OAAO,IAAM,IAAI,eAAe,CAAC;gBACnC;YACF;QACF,OAAO;YACL,WAAW;QACb;IACF,GAAG;QAAC;KAAQ;IAEZ,aAAa;IACb,IAAI,SAAS;QACX,qBACE,oaAAC,4LAAM;YAAC,WAAW;;8BACjB,oaAAC,iMAAW;oBAAC,KAAK;;;;;;8BAClB,oaAAC,oMAAc;oBAAC,WAAU;8BAA+B;;;;;;;;;;;;IAG/D;IAEA,cAAc;IACd,qBACE,oaAAC,4LAAM;QAAC,WAAW;kBACjB,cAAA,oaAAC,oMAAc;YAAC,WAAU;sBACvB,WAAW,yBACV,oaAAC,8XAAe;gBAAC,WAAU;;;;;qCAE3B,oaAAC,2WAAU;gBAAC,WAAU;;;;;;;;;;;;;;;;AAKhC"}}, {"offset": {"line": 1347, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,oaAAC,qbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,oaAAC,sbAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,oaAAC,wbAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,yKAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,oaAAC,qbAAoB;gBAAC,OAAO;0BAC3B,cAAA,oaAAC,sXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;AAEA,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,oaAAC,ubAAsB;kBACrB,cAAA,oaAAC,wbAAuB;YACtB,aAAU;YACV,WAAW,IAAA,yKAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,oaAAC;;;;;8BACD,oaAAC,ybAAwB;oBACvB,WAAW,IAAA,yKAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,oaAAC;;;;;;;;;;;;;;;;AAIT;AAEA,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,oaAAC,sbAAqB;QACpB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,oaAAC;gBAAK,WAAU;0BACd,cAAA,oaAAC,8bAA6B;8BAC5B,cAAA,oaAAC,gWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,oaAAC,ybAAwB;0BAAE;;;;;;;;;;;;AAGjC;AAEA,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,oaAAC,0bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,yKAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;AAEA,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,oaAAC,+bAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,gXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;AAEA,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,oaAAC,icAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,oaAAC,sXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC"}}, {"offset": {"line": 1580, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/slider.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '@/lib/utils'\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n )\n\n return (\n \n \n \n \n {Array.from({ length: _values.length }, (_, index) => (\n \n ))}\n \n )\n}\n\nexport { Slider }\n"],"names":[],"mappings":";;;;;AAEA;AACA;AAEA;AALA;;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,MAAM,CAAC,EACP,MAAM,GAAG,EACT,GAAG,OAC+C;IAClD,MAAM,UAAU,sYAAa,CAC3B,IACE,MAAM,OAAO,CAAC,SACV,QACA,MAAM,OAAO,CAAC,gBACZ,eACA;YAAC;YAAK;SAAI,EAClB;QAAC;QAAO;QAAc;QAAK;KAAI;IAGjC,qBACE,oaAAC,qbAAoB;QACnB,aAAU;QACV,cAAc;QACd,OAAO;QACP,KAAK;QACL,KAAK;QACL,WAAW,IAAA,yKAAE,EACX,uOACA;QAED,GAAG,KAAK;;0BAET,oaAAC,sbAAqB;gBACpB,aAAU;gBACV,WACE;0BAGF,cAAA,oaAAC,sbAAqB;oBACpB,aAAU;oBACV,WACE;;;;;;;;;;;YAIL,MAAM,IAAI,CAAC;gBAAE,QAAQ,QAAQ,MAAM;YAAC,GAAG,CAAC,GAAG,sBAC1C,oaAAC,sbAAqB;oBACpB,aAAU;oBAEV,WAAU;mBADL;;;;;;;;;;;AAMf"}}, - {"offset": {"line": 1650, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 区分家族成员和配偶\n const familyMembers = members.filter(m => {\n // 家族成员:有父母关系 或 明确标记为始祖\n const isFounder = m.tags?.includes('始祖')\n const hasFamilyParents = m.fatherId || m.motherId\n \n // 如果有父母关系,肯定是家族成员\n if (hasFamilyParents) return true\n \n // 如果明确标记为始祖,是家族成员\n if (isFounder) return true\n \n // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况)\n if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true\n \n // 其他情况(如第1世但有配偶且没有父母的)是配偶身份\n return false\n })\n \n // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低)\n const sortedFamilyMembers = [...familyMembers].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖')\n const bIsFounder = b.tags?.includes('始祖')\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序(早出生的在前 = 年龄大的在前)\n const aDate = a.birthDate || \"9999-12-31\"\n const bDate = b.birthDate || \"9999-12-31\"\n return aDate.localeCompare(bDate)\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedFamilyMembers.forEach(member => {\n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n } else {\n // 没有配偶,添加空白占位符\n result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any)\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

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

高级筛选

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

第 {generation} 世

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

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

\n
\n {isFounder ? (\n

\n 家族始祖\n

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

\n {spouseName}的配偶\n

\n ) : (\n

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

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

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

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

家族成员列表

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

高级筛选

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

第 {generation} 世

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

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

\n
\n {isFounder ? (\n

\n 家族始祖\n

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

\n {spouseName}的配偶\n

\n ) : (\n

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

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

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

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

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

\n

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

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

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

\n

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

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

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

\n

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

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

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

\n

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

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AAnBA;;;;;;;;;;;;;AA6BO,SAAS;IACd,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAA,iMAAS;IAClD,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,GAAG,IAAA,qaAAU;IAC5C,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAA,kNAAS;IACxD,MAAM,WAAW,IAAA,uUAAW;IAC5B,MAAM,eAAe,IAAA,2UAAe;IACpC,MAAM,CAAC,aAAa,eAAe,GAAG,IAAA,uYAAQ,EAAC;IAC/C,MAAM,CAAC,aAAa,eAAe,GAAG,IAAA,uYAAQ,EAAC;IAC/C,MAAM,CAAC,aAAa,eAAe,GAAG,IAAA,uYAAQ,EAAe,EAAE;IAC/D,MAAM,CAAC,aAAa,eAAe,GAAG,IAAA,uYAAQ,EAAoB;IAClE,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,IAAA,uYAAQ,EAAgB;IACpE,MAAM,YAAY,IAAA,qYAAM,EAAiB;IACzC,MAAM,SAAS,IAAA,qUAAS;IAExB,WAAW;IACX,MAAM,kBAAkB,aAAa,GAAG,CAAC,WAAW;IACpD,MAAM,aAAa,aAAa;IAEhC,oBAAoB;IACpB,MAAM,mBAAmB,CAAC;QACxB,IAAI,aAAa,IAAI;YACnB,OAAO,GAAG,KAAK,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C;QACA,OAAO;IACT;IAEA,SAAS;IACT,MAAM,uBAAuB,CAAC;QAC5B,MAAM,SAAS,IAAI,gBAAgB,aAAa,QAAQ;QACxD,OAAO,GAAG,CAAC,QAAQ;QACnB,IAAI,aAAa,IAAI;YACnB,OAAO,GAAG,CAAC,UAAU,YAAY,EAAE;QACrC;QACA,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,OAAO,QAAQ,IAAI;IAChD;IAEA,MAAM,eAAe,CAAC;QACpB,OAAQ;YACN,KAAK;gBACH,qBAAO,oaAAC;oBAAK,WAAU;8BAAgG;;;;;;YACzH,KAAK;gBACH,qBAAO,oaAAC;oBAAK,WAAU;8BAA0F;;;;;;YACnH,KAAK;gBACH,qBAAO,oaAAC;oBAAK,WAAU;8BAA0F;;;;;;YACnH;gBACE,OAAO;QACX;IACF;IAEA,MAAM,gBAAgB;QACpB,MAAM,IAAA,kaAAO,EAAC;YAAE,aAAa;QAAe;IAC9C;IAEA,eAAe;IACf,MAAM,iBAAiB;QACrB,IAAI,SAAS,MAAM,MAAM;YACvB,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW;QAChD;QACA,IAAI,SAAS,MAAM,OAAO;YACxB,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,WAAW;QACjD;QACA,OAAO;IACT;IAEA,QAAQ;IACR,MAAM,mBAAmB,OAAO,MAAkB;QAChD,EAAE,eAAe,IAAG,WAAW;QAE/B,OAAO;QACP,IAAI,KAAK,OAAO,KAAK,SAAS,MAAM,IAAI;YACtC,MAAM,UAAU,iBAAiB;YACjC;QACF;QAEA,MAAM,cAAc,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,qCAAqC,CAAC;QAChF,MAAM,YAAY,MAAM,YAAY,aAAa,SAAS;QAC1D,IAAI,CAAC,WAAW;YACd;QACF;QAEA,OAAO;QACP,MAAM,eAAe,MAAM,WACzB,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,EAC9B,IACA;QAEF,IAAI,iBAAiB,KAAK,IAAI,EAAE;YAC9B,MAAM,UAAU,eAAe;YAC/B;QACF;QAEA,kBAAkB,KAAK,EAAE;QACzB,IAAI;YACF,MAAM,WAAW,MAAM,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;gBACpD,QAAQ;YACV;YAEA,IAAI,CAAC,SAAS,EAAE,EAAE;gBAChB,MAAM,QAAQ,MAAM,SAAS,IAAI;gBACjC,MAAM,IAAI,MAAM,MAAM,KAAK,IAAI;YACjC;YAEA,UAAU;YACV,MAAM;YAEN,kBAAkB;YAClB,IAAI,aAAa,OAAO,KAAK,EAAE,EAAE;gBAC/B,OAAO,QAAQ,CAAC,IAAI,GAAG;YACzB;QACF,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,YAAY;YAC1B,MAAM,UAAU,UAAU,AAAC,MAAgB,OAAO,EAAE;QACtD,SAAU;YACR,kBAAkB;QACpB;IACF;IAEA,UAAU;IACV,MAAM,kBAAkB,IAAA,0YAAW,EAAC;QAClC,IAAI,CAAC,SAAS,MAAM,MAAM,WAAW,iBAAiB;QAEtD,MAAM,aAAa,IAAI;QAEvB,MAAM,cAAc;YAAE,QAAQ,WAAW,MAAM;QAAC,GAC7C,IAAI,CAAC,CAAA;YACJ,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,IAAI,MAAM,EAAE;YAChE,OAAO,IAAI,IAAI;QACjB,GACC,IAAI,CAAC,CAAA;YACJ,IAAI,KAAK,KAAK,EAAE;gBACd,eAAe,KAAK,KAAK;gBACzB,gCAAgC;gBAChC,MAAM,YAAY,IAAI,gBAAgB,OAAO,QAAQ,CAAC,MAAM;gBAC5D,MAAM,SAAS,UAAU,GAAG,CAAC;gBAC7B,IAAI,QAAQ;oBACV,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAkB,EAAE,EAAE,KAAK;oBACzD,IAAI,MAAM;wBACR,eAAe;oBACjB,OAAO,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,GAAG;wBAChC,eAAe,KAAK,KAAK,CAAC,EAAE;oBAC9B;gBACF,OAAO,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,GAAG;oBAChC,eAAe,KAAK,KAAK,CAAC,EAAE;gBAC9B;YACF;QACF,GACC,KAAK,CAAC,CAAA;YACL,oCAAoC;YACpC,IAAI,IAAI,IAAI,KAAK,gBAAgB,IAAI,OAAO,KAAK,mBAAmB;gBAClE,QAAQ,KAAK,CAAC,cAAc;YAC9B;QACF;QAEF,OAAO,IAAM,WAAW,KAAK;IAC/B,GAAG;QAAC,SAAS,MAAM;QAAI;KAAO;IAE9B,IAAA,wYAAS,EAAC;QACR;IACF,GAAG;QAAC;KAAgB;IAEpB,iBAAiB;IACjB,IAAA,wYAAS,EAAC;QACR,MAAM,oBAAoB;YACxB;QACF;QAEA,OAAO,gBAAgB,CAAC,SAAS;QACjC,OAAO,IAAM,OAAO,mBAAmB,CAAC,SAAS;IACnD,GAAG;QAAC;KAAgB;IAEpB,aAAa;IACb,IAAA,wYAAS,EAAC;QACR,SAAS,mBAAmB,KAAiB;YAC3C,IAAI,UAAU,OAAO,IAAI,CAAC,UAAU,OAAO,CAAC,QAAQ,CAAC,MAAM,MAAM,GAAW;gBAC1E,eAAe;YACjB;QACF;QACA,SAAS,gBAAgB,CAAC,aAAa;QACvC,OAAO,IAAM,SAAS,mBAAmB,CAAC,aAAa;IACzD,GAAG,EAAE;IAEL,MAAM,eAAe,CAAC;QACpB,eAAe;QACf,cAAc;QACd,eAAe,MAAM,MAAM,GAAG;IAChC;IAEA,MAAM,qBAAqB,CAAC;QAC1B,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU;QAClC,eAAe;QACf,eAAe;IACjB;IAEA,qBACE,oaAAC;QAAO,WAAU;kBAChB,cAAA,oaAAC;YAAI,WAAU;;8BACb,oaAAC;oBAAI,WAAU;;sCACb,oaAAC,6VAAI;4BAAC,MAAK;4BAAI,WAAU;;8CACvB,oaAAC;oCAAI,WAAU;8CACb,cAAA,oaAAC,qWAAQ;wCAAC,WAAU;;;;;;;;;;;8CAEtB,oaAAC;oCAAK,WAAU;8CAA8C;;;;;;;;;;;;wBAI/D,WAAW,YAAY,MAAM,GAAG,mBAC/B,oaAAC,4MAAY;;8CACX,oaAAC,mNAAmB;oCAAC,OAAO;8CAC1B,cAAA,oaAAC,4LAAM;wCAAC,SAAQ;wCAAU,WAAU;;0DAClC,oaAAC;gDAAK,WAAU;0DAA6B,aAAa,QAAQ;;;;;;0DAClE,oaAAC,8WAAW;gDAAC,WAAU;;;;;;;;;;;;;;;;;8CAG3B,oaAAC,mNAAmB;oCAAC,OAAM;oCAAQ,WAAU;;sDAC3C,oaAAC,iNAAiB;sDAAC;;;;;;sDACnB,oaAAC,qNAAqB;;;;;wCACrB,YAAY,GAAG,CAAC,CAAC,qBAChB,oaAAC,gNAAgB;gDAEf,SAAS;oDACP,eAAe;oDACf,uBAAuB;oDACvB,MAAM,cAAc,OAAO,QAAQ,CAAC,QAAQ;oDAC5C,OAAO,IAAI,CAAC,GAAG,YAAY,QAAQ,EAAE,KAAK,EAAE,EAAE;gDAChD;gDACA,WAAU;;kEAEV,oaAAC;wDAAI,WAAU;;0EACb,oaAAC;gEAAK,WAAU;0EAAY,KAAK,IAAI;;;;;;4DACpC,aAAa,KAAK,eAAe;;;;;;;kEAEpC,oaAAC;wDAAI,WAAU;;4DACZ,aAAa,OAAO,KAAK,EAAE,kBAC1B,oaAAC;gEAAK,WAAU;0EAAe;;;;;;4DAEhC,KAAK,OAAO,KAAK,SAAS,MAAM,oBAC/B,oaAAC,4LAAM;gEACL,SAAQ;gEACR,MAAK;gEACL,WAAU;gEACV,SAAS,CAAC,IAAM,iBAAiB,MAAM;gEACvC,UAAU,mBAAmB,KAAK,EAAE;0EAEpC,cAAA,oaAAC,+VAAM;oEAAC,WAAU;;;;;;;;;;;;;;;;;;+CAzBnB,KAAK,EAAE;;;;;sDA+BhB,oaAAC,qNAAqB;;;;;sDACtB,oaAAC,gNAAgB;4CACf,SAAS,IAAM,OAAO,IAAI,CAAC;4CAC3B,WAAU;;8DAEV,oaAAC,qVAAI;oDAAC,WAAU;;;;;;gDAAiB;;;;;;;;;;;;;;;;;;;;;;;;;8BAQ3C,oaAAC;oBAAI,WAAU;;sCACb,oaAAC,6VAAI;4BACH,MAAM,iBAAiB;4BACvB,WAAU;sCACX;;;;;;sCAGD,oaAAC,6VAAI;4BAAC,MAAM,iBAAiB;4BAAU,WAAU;sCAA0C;;;;;;sCAG3F,oaAAC,6VAAI;4BAAC,MAAM,iBAAiB;4BAAa,WAAU;sCAA0C;;;;;;sCAG9F,oaAAC,6VAAI;4BAAC,MAAM,iBAAiB;4BAAc,WAAU;sCAA0C;;;;;;;;;;;;8BAKjG,oaAAC;oBAAI,WAAU;;sCACb,oaAAC;4BAAI,WAAU;4BAA2B,KAAK;;8CAC7C,oaAAC,2VAAM;oCAAC,WAAU;;;;;;8CAClB,oaAAC,0LAAK;oCACJ,MAAK;oCACL,aAAY;oCACZ,OAAO;oCACP,UAAU,CAAC,IAAM,aAAa,EAAE,MAAM,CAAC,KAAK;oCAC5C,WAAU;;;;;;gCAIX,eAAe,cAAc,MAAM,GAAG,mBACrC,oaAAC;oCAAI,WAAU;8CACZ,cAAc,GAAG,CAAC,CAAC,uBAClB,oaAAC;4CAEC,SAAS,IAAM,mBAAmB,OAAO,EAAE;4CAC3C,WAAU;sDAEV,cAAA,oaAAC;gDAAI,WAAU;0DACb,cAAA,oaAAC;oDAAI,WAAU;;sEACb,oaAAC;4DAAI,WAAU;;8EACb,oaAAC;oEAAK,WAAU;8EAAe,OAAO,QAAQ;;;;;;8EAC9C,oaAAC;oEAAK,WAAW,CAAC,8BAA8B,EAAE,OAAO,MAAM,KAAK,SAAS,8BAA8B,6BAA6B;8EACrI,OAAO,MAAM,KAAK,SAAS,MAAM;;;;;;8EAEpC,oaAAC;oEAAK,WAAU;;wEAAgC;wEAAE,OAAO,UAAU;wEAAC;;;;;;;;;;;;;sEAEtE,oaAAC;4DAAE,WAAU;;gEACV,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,OAAO,SAAS,EAAE;gEAC5C,OAAO,UAAU,IAAI,CAAC,GAAG,EAAE,OAAO,UAAU,EAAE;;;;;;;;;;;;;;;;;;2CAfhD,OAAO,EAAE;;;;;;;;;;gCAyBrB,eAAe,eAAe,cAAc,MAAM,KAAK,mBACtD,oaAAC;oCAAI,WAAU;8CAA2I;;;;;;;;;;;;sCAM9J,oaAAC,4LAAM;4BAAC,SAAQ;4BAAQ,MAAK;4BAAO,WAAU;;8CAC5C,oaAAC,qVAAI;oCAAC,WAAU;;;;;;8CAChB,oaAAC;oCAAK,WAAU;8CAAU;;;;;;;;;;;;sCAG5B,oaAAC,6VAAI;4BAAC,MAAK;sCACT,cAAA,oaAAC,4LAAM;gCAAC,SAAQ;gCAAQ,MAAK;gCAAO,WAAU;;kDAC5C,oaAAC,uWAAU;wCAAC,WAAU;;;;;;kDACtB,oaAAC;wCAAK,WAAU;kDAAU;;;;;;;;;;;;;;;;;sCAI9B,oaAAC,6VAAI;4BAAC,MAAK;sCACT,cAAA,oaAAC,4LAAM;gCAAC,SAAQ;gCAAQ,MAAK;gCAAO,WAAU;;kDAC5C,oaAAC,iWAAQ;wCAAC,WAAU;;;;;;kDACpB,oaAAC;wCAAK,WAAU;kDAAU;;;;;;;;;;;;;;;;;wBAI7B,WAAW,0BACV,oaAAC,4LAAM;4BAAC,WAAU;sCAChB,cAAA,oaAAC,oMAAc;0CAAC;;;;;;;;;;mCAEhB,wBACF,oaAAC,4MAAY;;8CACX,oaAAC,mNAAmB;oCAAC,OAAO;8CAC1B,cAAA,oaAAC,4LAAM;wCAAC,SAAQ;wCAAQ,WAAU;kDAChC,cAAA,oaAAC,4LAAM;4CAAC,WAAU;;8DAChB,oaAAC,iMAAW;oDAAC,KAAK;oDAAW,KAAK,QAAQ,IAAI,EAAE,QAAQ;;;;;;8DACxD,oaAAC,oMAAc;8DAAE;;;;;;;;;;;;;;;;;;;;;;8CAIvB,oaAAC,mNAAmB;oCAAC,WAAU;oCAAO,OAAM;oCAAM,UAAU;;sDAC1D,oaAAC,iNAAiB;4CAAC,WAAU;sDAC3B,cAAA,oaAAC;gDAAI,WAAU;;kEACb,oaAAC;wDAAE,WAAU;kEAAoC,QAAQ,IAAI,EAAE,QAAQ;;;;;;kEACvE,oaAAC;wDAAE,WAAU;kEACV,QAAQ,IAAI,EAAE;;;;;;;;;;;;;;;;;sDAIrB,oaAAC,qNAAqB;;;;;sDACtB,oaAAC,gNAAgB;4CAAC,OAAO;sDACvB,cAAA,oaAAC,6VAAI;gDAAC,MAAK;gDAAY,WAAU;;kEAC/B,oaAAC,iWAAQ;wDAAC,WAAU;;;;;;kEACpB,oaAAC;kEAAK;;;;;;;;;;;;;;;;;sDAGV,oaAAC,qNAAqB;;;;;sDACtB,oaAAC,gNAAgB;4CAAC,SAAS;4CAAe,WAAU;;8DAClD,oaAAC,+VAAM;oDAAC,WAAU;;;;;;8DAClB,oaAAC;8DAAK;;;;;;;;;;;;;;;;;;;;;;;iDAKZ,oaAAC,6VAAI;4BAAC,MAAK;sCACT,cAAA,oaAAC,4LAAM;gCAAC,SAAQ;gCAAU,MAAK;0CAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASlD"}}, {"offset": {"line": 1221, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/textarea.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n \n )\n}\n\nexport { Textarea }\n"],"names":[],"mappings":";;;;;AAEA;;;AAEA,SAAS,SAAS,EAAE,SAAS,EAAE,GAAG,OAAyC;IACzE,qBACE,oaAAC;QACC,aAAU;QACV,WAAW,IAAA,yKAAE,EACX,ucACA;QAED,GAAG,KAAK;;;;;;AAGf"}}, {"offset": {"line": 1245, "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": 1478, "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"}}, diff --git a/.next/dev/server/next-font-manifest.js b/.next/dev/server/next-font-manifest.js index 081da19c..44d87c96 100644 --- a/.next/dev/server/next-font-manifest.js +++ b/.next/dev/server/next-font-manifest.js @@ -1 +1 @@ -self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/Documents/go-new/chinese-family-tree/app/members/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}" \ No newline at end of file +self.__NEXT_FONT_MANIFEST="{\n \"app\": {\n \"[project]/Documents/go-new/chinese-family-tree/app/members/[id]/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/members/new/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/members/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ],\n \"[project]/Documents/go-new/chinese-family-tree/app/tree/page\": [\n \"static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\n \"static/media/797e433ab948586e-s.p.dbea232f.woff2\"\n ]\n },\n \"appUsingSizeAdjust\": true,\n \"pages\": {},\n \"pagesUsingSizeAdjust\": false\n}" \ No newline at end of file diff --git a/.next/dev/server/next-font-manifest.json b/.next/dev/server/next-font-manifest.json index b2bc2f12..64ea3ed0 100644 --- a/.next/dev/server/next-font-manifest.json +++ b/.next/dev/server/next-font-manifest.json @@ -1,5 +1,13 @@ { "app": { + "[project]/Documents/go-new/chinese-family-tree/app/members/[id]/page": [ + "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", + "static/media/797e433ab948586e-s.p.dbea232f.woff2" + ], + "[project]/Documents/go-new/chinese-family-tree/app/members/new/page": [ + "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", + "static/media/797e433ab948586e-s.p.dbea232f.woff2" + ], "[project]/Documents/go-new/chinese-family-tree/app/members/page": [ "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", "static/media/797e433ab948586e-s.p.dbea232f.woff2" @@ -7,6 +15,10 @@ "[project]/Documents/go-new/chinese-family-tree/app/page": [ "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", "static/media/797e433ab948586e-s.p.dbea232f.woff2" + ], + "[project]/Documents/go-new/chinese-family-tree/app/tree/page": [ + "static/media/caa3a2e1cccd8315-s.p.853070df.woff2", + "static/media/797e433ab948586e-s.p.dbea232f.woff2" ] }, "appUsingSizeAdjust": true, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js index 6cd40c5f..40b4c875 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js @@ -658,7 +658,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js.map index 277efd4b..d163a88e 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_5461dd2a._.js.map @@ -4,7 +4,7 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;KAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,mXAAC,4bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS"}}, {"offset": {"line": 67, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

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

\n

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

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

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

\n

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

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1307, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/textarea.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n \n )\n}\n\nexport { Textarea }\n"],"names":[],"mappings":";;;;;AAEA;;;AAEA,SAAS,SAAS,EAAE,SAAS,EAAE,GAAG,OAAyC;IACzE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,ucACA;QAED,GAAG,KAAK;;;;;;AAGf;KAXS"}}, {"offset": {"line": 1337, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,4KAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,mXAAC,wbAAoB;gBAAC,OAAO;0BAC3B,cAAA,mXAAC,yXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;MAxBS;AA0BT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,mXAAC,0bAAsB;kBACrB,cAAA,mXAAC,2bAAuB;YACtB,aAAU;YACV,WAAW,IAAA,4KAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,mXAAC;;;;;8BACD,mXAAC,4bAAwB;oBACvB,WAAW,IAAA,4KAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,mXAAC;;;;;;;;;;;;;;;;AAIT;MAjCS;AAmCT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,mXAAC;gBAAK,WAAU;0BACd,cAAA,mXAAC,icAA6B;8BAC5B,cAAA,mXAAC,mWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,mXAAC,4bAAwB;0BAAE;;;;;;;;;;;;AAGjC;MAtBS;AAwBT,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,mXAAC,6bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,mXAAC,kcAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,mXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;MAhBS;AAkBT,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,mXAAC,ocAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,yXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC;MAhBS"}}, {"offset": {"line": 1594, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,cAAc,EACrB,GAAG,OACkD;IACrD,qBAAO,mXAAC,2bAAuB;QAAC,aAAU;QAAkB,GAAG,KAAK;;;;;;AACtE;MAJS;AAMT,SAAS,aAAa,EACpB,GAAG,OACiD;IACpD,qBAAO,mXAAC,0bAAsB;QAAC,aAAU;QAAiB,GAAG,KAAK;;;;;;AACpE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,GAAG,OACkD;IACrD,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0JACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS;AAgBT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,kBAAkB,IAAI,EACtB,GAAG,OAGJ;IACC,qBACE,mXAAC;QAAa,aAAU;;0BACtB,mXAAC;;;;;0BACD,mXAAC,2bAAuB;gBACtB,aAAU;gBACV,WAAW,IAAA,4KAAE,EACX,+WACA;gBAED,GAAG,KAAK;;oBAER;oBACA,iCACC,mXAAC,ybAAqB;wBACpB,aAAU;wBACV,WAAU;;0CAEV,mXAAC,uVAAK;;;;;0CACN,mXAAC;gCAAK,WAAU;0CAAU;;;;;;;;;;;;;;;;;;;;;;;;AAMtC;MAhCS;AAkCT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,gDAAgD;QAC7D,GAAG,KAAK;;;;;;AAGf;MARS;AAUT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0DACA;QAED,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,sCAAsC;QACnD,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,kBAAkB,EACzB,SAAS,EACT,GAAG,OACsD;IACzD,qBACE,mXAAC,+bAA2B;QAC1B,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iCAAiC;QAC9C,GAAG,KAAK;;;;;;AAGf;MAXS"}}, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js index 882b1d94..4e0f21bf 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js @@ -2000,6 +2000,9 @@ function MembersPage() { sortedFamilyMembers.forEach({ "MembersPage.useMemo[membersByGeneration]": (member)=>{ result.push(member); + // 计算该家庭单元的成员数(主成员 + 配偶) + let familyUnitSize = 1 // 主成员自己 + ; // 如果有配偶,将配偶紧跟在后面 if (member.spouseIds && member.spouseIds.length > 0) { member.spouseIds.forEach({ @@ -2010,13 +2013,19 @@ function MembersPage() { if (spouse && !processedSpouses.has(spouseId)) { result.push(spouse); processedSpouses.add(spouseId); + familyUnitSize++; } } }["MembersPage.useMemo[membersByGeneration]"]); - } else { - // 没有配偶,添加空白占位符 + } + // 计算需要添加的占位符数量,确保填满4的倍数 + // 例如:1个主成员 + 1个配偶 = 2人,需要添加2个占位符 + // 例如:1个主成员 + 3个配偶 = 4人,不需要占位符 + // 例如:1个主成员 + 0个配偶 = 1人,需要添加3个占位符 + const placeholdersNeeded = (4 - familyUnitSize % 4) % 4; + for(let i = 0; i < placeholdersNeeded; i++){ result.push({ - id: `placeholder-${member.id}`, + id: `placeholder-${member.id}-${i}`, isPlaceholder: true }); } @@ -2048,7 +2057,7 @@ function MembersPage() { children: [ /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$site$2d$header$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 209, + lineNumber: 219, columnNumber: 7 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("main", { @@ -2065,7 +2074,7 @@ function MembersPage() { children: "家族成员列表" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 213, + lineNumber: 223, columnNumber: 13 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2078,7 +2087,7 @@ function MembersPage() { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 216, + lineNumber: 226, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$input$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Input"], { @@ -2089,13 +2098,13 @@ function MembersPage() { onChange: (e)=>setQuery(e.target.value) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 217, + lineNumber: 227, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 215, + lineNumber: 225, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2108,20 +2117,20 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 231, + lineNumber: 241, columnNumber: 17 }, this), activeFilterCount > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "absolute -top-1 -right-1 h-3 w-3 rounded-full bg-primary border-2 border-background" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 233, + lineNumber: 243, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 225, + lineNumber: 235, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], { @@ -2133,31 +2142,31 @@ function MembersPage() { className: "h-4 w-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 238, + lineNumber: 248, columnNumber: 19 }, this), "新增成员" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 237, + lineNumber: 247, columnNumber: 17 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 236, + lineNumber: 246, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 214, + lineNumber: 224, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 212, + lineNumber: 222, columnNumber: 11 }, this), showFilters && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2171,7 +2180,7 @@ function MembersPage() { children: "高级筛选" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 249, + lineNumber: 259, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2184,20 +2193,20 @@ function MembersPage() { className: "mr-1 h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 251, + lineNumber: 261, columnNumber: 19 }, this), " 重置筛选" ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 250, + lineNumber: 260, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 248, + lineNumber: 258, columnNumber: 15 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2211,7 +2220,7 @@ function MembersPage() { children: "姓氏 (Surname)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 256, + lineNumber: 266, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2223,12 +2232,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 259, + lineNumber: 269, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 258, + lineNumber: 268, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2238,7 +2247,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 262, + lineNumber: 272, columnNumber: 23 }, this), uniqueSurnames.map((s)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2246,25 +2255,25 @@ function MembersPage() { children: s }, s, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 264, + lineNumber: 274, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 261, + lineNumber: 271, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 257, + lineNumber: 267, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 255, + lineNumber: 265, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2275,7 +2284,7 @@ function MembersPage() { children: "籍贯 (Ancestral Home)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 273, + lineNumber: 283, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2287,12 +2296,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 276, + lineNumber: 286, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 275, + lineNumber: 285, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2302,7 +2311,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 279, + lineNumber: 289, columnNumber: 23 }, this), uniqueHomes.map((h)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2310,25 +2319,25 @@ function MembersPage() { children: h }, h, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 281, + lineNumber: 291, columnNumber: 25 }, this)) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 278, + lineNumber: 288, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 274, + lineNumber: 284, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 272, + lineNumber: 282, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2339,7 +2348,7 @@ function MembersPage() { children: "状态 (Status)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 290, + lineNumber: 300, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Select"], { @@ -2351,12 +2360,12 @@ function MembersPage() { placeholder: "全部" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 293, + lineNumber: 303, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 292, + lineNumber: 302, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectContent"], { @@ -2366,7 +2375,7 @@ function MembersPage() { children: "全部 (All)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 296, + lineNumber: 306, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2374,7 +2383,7 @@ function MembersPage() { children: "在世 (Living)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 297, + lineNumber: 307, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$select$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["SelectItem"], { @@ -2382,25 +2391,25 @@ function MembersPage() { children: "已故 (Deceased)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 298, + lineNumber: 308, columnNumber: 23 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 295, + lineNumber: 305, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 291, + lineNumber: 301, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 289, + lineNumber: 299, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2414,7 +2423,7 @@ function MembersPage() { children: "世系范围 (Generation)" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 305, + lineNumber: 315, columnNumber: 21 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -2427,13 +2436,13 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 306, + lineNumber: 316, columnNumber: 21 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 304, + lineNumber: 314, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$slider$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Slider"], { @@ -2449,31 +2458,31 @@ function MembersPage() { className: "py-4" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 310, + lineNumber: 320, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 303, + lineNumber: 313, columnNumber: 17 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 254, + lineNumber: 264, columnNumber: 15 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 247, + lineNumber: 257, columnNumber: 13 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 211, + lineNumber: 221, columnNumber: 9 }, this), filteredMembers.length === 0 ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2481,7 +2490,7 @@ function MembersPage() { children: "没有找到匹配的成员。" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 326, + lineNumber: 336, columnNumber: 11 }, this) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "space-y-8", @@ -2499,7 +2508,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 334, + lineNumber: 344, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { @@ -2511,20 +2520,20 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 335, + lineNumber: 345, columnNumber: 19 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { className: "flex-1 h-px bg-border" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 336, + lineNumber: 346, columnNumber: 19 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 333, + lineNumber: 343, columnNumber: 17 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2536,7 +2545,7 @@ function MembersPage() { className: "invisible" }, member.id, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 342, + lineNumber: 352, columnNumber: 30 }, this); } @@ -2570,7 +2579,7 @@ function MembersPage() { className: "h-20 w-20 border-2 border-border" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 368, + lineNumber: 378, columnNumber: 29 }, this), member.deathDate && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2578,7 +2587,7 @@ function MembersPage() { title: "已故" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 377, + lineNumber: 387, columnNumber: 31 }, this), !member.deathDate && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2586,13 +2595,13 @@ function MembersPage() { title: "在世" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 380, + lineNumber: 390, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 367, + lineNumber: 377, columnNumber: 27 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2612,18 +2621,18 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 388, + lineNumber: 398, columnNumber: 35 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 385, + lineNumber: 395, columnNumber: 31 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 384, + lineNumber: 394, columnNumber: 29 }, this), isFounder ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { @@ -2631,7 +2640,7 @@ function MembersPage() { children: "家族始祖" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 395, + lineNumber: 405, columnNumber: 31 }, this) : isSpouse && spouseName ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { className: "text-[11px] text-purple-700 mt-0.5 truncate", @@ -2641,14 +2650,14 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 399, + lineNumber: 409, columnNumber: 31 }, this) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", { className: "text-[11px] text-muted-foreground mt-0.5 truncate", children: member.generationName ? `字辈: ${member.generationName}` : "未录入字辈" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 403, + lineNumber: 413, columnNumber: 31 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2659,7 +2668,7 @@ function MembersPage() { children: member.ancestralHome || "籍贯未知" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 410, + lineNumber: 420, columnNumber: 31 }, this), (member.birthDate || member.deathDate) && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2673,7 +2682,7 @@ function MembersPage() { ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 415, + lineNumber: 425, columnNumber: 35 }, this), (()=>{ @@ -2686,20 +2695,20 @@ function MembersPage() { children: member.deathDate ? `享年${age}岁` : `${age}岁` }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 426, + lineNumber: 436, columnNumber: 39 }, this); })() ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 414, + lineNumber: 424, columnNumber: 33 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 409, + lineNumber: 419, columnNumber: 29 }, this), member.tags && member.tags.length > 0 && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", { @@ -2709,34 +2718,34 @@ function MembersPage() { children: tag }, tag, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 438, + lineNumber: 448, columnNumber: 35 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 436, + lineNumber: 446, columnNumber: 31 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 383, + lineNumber: 393, columnNumber: 27 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 366, + lineNumber: 376, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 361, + lineNumber: 371, columnNumber: 25 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 360, + lineNumber: 370, columnNumber: 23 }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], { @@ -2752,47 +2761,47 @@ function MembersPage() { className: "h-3 w-3" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 461, + lineNumber: 471, columnNumber: 23 }, this) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 451, + lineNumber: 461, columnNumber: 21 }, this) ] }, member.id, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 359, + lineNumber: 369, columnNumber: 21 }, this); }) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 338, + lineNumber: 348, columnNumber: 17 }, this) ] }, generation, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 332, + lineNumber: 342, columnNumber: 15 }, this)) }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 330, + lineNumber: 340, columnNumber: 11 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 210, + lineNumber: 220, columnNumber: 7 }, this) ] }, void 0, true, { fileName: "[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx", - lineNumber: 208, + lineNumber: 218, columnNumber: 5 }, this); } diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map index 0df9a842..5e464339 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_c5040fe9._.js.map @@ -9,5 +9,5 @@ {"offset": {"line": 1343, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar-display.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { db } from \"@/lib/db\"\nimport { CircleUser, CircleUserRound } from \"lucide-react\"\nimport type { Gender } from \"@/types/family\"\n\ninterface AvatarDisplayProps {\n imageId?: string\n fallbackUrl?: string\n fallbackText?: string\n gender?: Gender\n className?: string\n}\n\nexport function AvatarDisplay({ imageId, fallbackUrl, fallbackText, gender, className }: AvatarDisplayProps) {\n const [blobUrl, setBlobUrl] = useState(undefined)\n\n useEffect(() => {\n if (imageId) {\n db.images.get(imageId).then((image) => {\n if (image) {\n const url = URL.createObjectURL(image.blob)\n setBlobUrl(url)\n return () => URL.revokeObjectURL(url)\n }\n })\n } else {\n setBlobUrl(undefined)\n }\n }, [imageId])\n\n // 如果有头像,显示头像\n if (blobUrl) {\n return (\n \n \n {fallbackText}\n \n )\n }\n\n // 没有头像,显示性别图标\n return (\n \n \n {gender === 'FEMALE' ? (\n \n ) : (\n \n )}\n \n \n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AAAA;;;AALA;;;;;AAgBO,SAAS,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAsB;;IACzG,MAAM,CAAC,SAAS,WAAW,GAAG,IAAA,+VAAQ,EAAqB;IAE3D,IAAA,gWAAS;mCAAC;YACR,IAAI,SAAS;gBACX,yKAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI;+CAAC,CAAC;wBAC3B,IAAI,OAAO;4BACT,MAAM,MAAM,IAAI,eAAe,CAAC,MAAM,IAAI;4BAC1C,WAAW;4BACX;2DAAO,IAAM,IAAI,eAAe,CAAC;;wBACnC;oBACF;;YACF,OAAO;gBACL,WAAW;YACb;QACF;kCAAG;QAAC;KAAQ;IAEZ,aAAa;IACb,IAAI,SAAS;QACX,qBACE,mXAAC,+LAAM;YAAC,WAAW;;8BACjB,mXAAC,oMAAW;oBAAC,KAAK;;;;;;8BAClB,mXAAC,uMAAc;oBAAC,WAAU;8BAA+B;;;;;;;;;;;;IAG/D;IAEA,cAAc;IACd,qBACE,mXAAC,+LAAM;QAAC,WAAW;kBACjB,cAAA,mXAAC,uMAAc;YAAC,WAAU;sBACvB,WAAW,yBACV,mXAAC,iYAAe;gBAAC,WAAU;;;;;qCAE3B,mXAAC,8WAAU;gBAAC,WAAU;;;;;;;;;;;;;;;;AAKhC;GAvCgB;KAAA"}}, {"offset": {"line": 1451, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,4KAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,mXAAC,wbAAoB;gBAAC,OAAO;0BAC3B,cAAA,mXAAC,yXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;MAxBS;AA0BT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,mXAAC,0bAAsB;kBACrB,cAAA,mXAAC,2bAAuB;YACtB,aAAU;YACV,WAAW,IAAA,4KAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,mXAAC;;;;;8BACD,mXAAC,4bAAwB;oBACvB,WAAW,IAAA,4KAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,mXAAC;;;;;;;;;;;;;;;;AAIT;MAjCS;AAmCT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,mXAAC;gBAAK,WAAU;0BACd,cAAA,mXAAC,icAA6B;8BAC5B,cAAA,mXAAC,mWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,mXAAC,4bAAwB;0BAAE;;;;;;;;;;;;AAGjC;MAtBS;AAwBT,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,mXAAC,6bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,mXAAC,kcAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,mXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;MAhBS;AAkBT,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,mXAAC,ocAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,yXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC;MAhBS"}}, {"offset": {"line": 1708, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/slider.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '@/lib/utils'\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n )\n\n return (\n \n \n \n \n {Array.from({ length: _values.length }, (_, index) => (\n \n ))}\n \n )\n}\n\nexport { Slider }\n"],"names":[],"mappings":";;;;;AAEA;AACA;AAEA;;;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,YAAY,EACZ,KAAK,EACL,MAAM,CAAC,EACP,MAAM,GAAG,EACT,GAAG,OAC+C;;IAClD,MAAM,UAAU,8VAAa;mCAC3B,IACE,MAAM,OAAO,CAAC,SACV,QACA,MAAM,OAAO,CAAC,gBACZ,eACA;gBAAC;gBAAK;aAAI;kCAClB;QAAC;QAAO;QAAc;QAAK;KAAI;IAGjC,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,cAAc;QACd,OAAO;QACP,KAAK;QACL,KAAK;QACL,WAAW,IAAA,4KAAE,EACX,uOACA;QAED,GAAG,KAAK;;0BAET,mXAAC,ybAAqB;gBACpB,aAAU;gBACV,WACE;0BAGF,cAAA,mXAAC,ybAAqB;oBACpB,aAAU;oBACV,WACE;;;;;;;;;;;YAIL,MAAM,IAAI,CAAC;gBAAE,QAAQ,QAAQ,MAAM;YAAC,GAAG,CAAC,GAAG,sBAC1C,mXAAC,ybAAqB;oBACpB,aAAU;oBAEV,WAAU;mBADL;;;;;;;;;;;AAMf;GArDS;KAAA"}}, - {"offset": {"line": 1789, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/app/members/page.tsx"],"sourcesContent":["\"use client\"\n\nimport { useState, useMemo, useEffect } from \"react\"\nimport { SiteHeader } from \"@/components/site-header\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useRouter } from \"next/navigation\"\nimport { Input } from \"@/components/ui/input\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Search, Plus, Filter, X } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { AvatarDisplay } from \"@/components/ui/avatar-display\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\"\nimport { Slider } from \"@/components/ui/slider\"\nimport { Label } from \"@/components/ui/label\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/ui/popover\"\n\nexport default function MembersPage() {\n const { treeData, searchMembers, setHighlightedMemberId } = useFamily()\n const router = useRouter()\n const [query, setQuery] = useState(\"\")\n const [showFilters, setShowFilters] = useState(false)\n \n // 从 URL 参数读取搜索关键词\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const searchParam = params.get('search')\n if (searchParam) {\n setQuery(searchParam)\n }\n }, [])\n\n // Filter States\n const [selectedSurname, setSelectedSurname] = useState(\"all\")\n const [selectedHome, setSelectedHome] = useState(\"all\")\n const [statusFilter, setStatusFilter] = useState(\"all\")\n const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])\n\n // Derived Data\n const allMembers = useMemo(() => Object.values(treeData.members), [treeData])\n\n const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {\n const surnames = new Set()\n const homes = new Set()\n let min = 1000\n let max = 0\n\n allMembers.forEach((m) => {\n if (m.surname) surnames.add(m.surname)\n if (m.ancestralHome) homes.add(m.ancestralHome)\n if (m.generation) {\n if (m.generation < min) min = m.generation\n if (m.generation > max) max = m.generation\n }\n })\n\n return {\n uniqueSurnames: Array.from(surnames).sort(),\n uniqueHomes: Array.from(homes).sort(),\n minGen: min === 1000 ? 1 : min,\n maxGen: max === 0 ? 100 : max,\n }\n }, [allMembers])\n\n // Initialize slider when data loads\n useMemo(() => {\n if (minGen !== 1000 && maxGen !== 0) {\n // Only update if range is default\n // This is a bit tricky, for now let's just rely on user adjustment or default wide range\n // Ideally we sync this once.\n }\n }, [minGen, maxGen])\n\n const filteredMembers = useMemo(() => {\n let result = allMembers\n\n // 1. Search Query\n if (query) {\n const lowerQuery = query.toLowerCase()\n result = result.filter(\n (m) =>\n m.fullName.toLowerCase().includes(lowerQuery) ||\n m.courtesyName?.toLowerCase().includes(lowerQuery) ||\n m.artName?.toLowerCase().includes(lowerQuery),\n )\n }\n\n // 2. Surname Filter\n if (selectedSurname !== \"all\") {\n result = result.filter((m) => m.surname === selectedSurname)\n }\n\n // 3. Home Filter\n if (selectedHome !== \"all\") {\n result = result.filter((m) => m.ancestralHome === selectedHome)\n }\n\n // 4. Status Filter\n if (statusFilter !== \"all\") {\n if (statusFilter === \"living\") {\n result = result.filter((m) => !m.deathDate)\n } else if (statusFilter === \"deceased\") {\n result = result.filter((m) => !!m.deathDate)\n }\n }\n\n // 5. Generation Filter\n result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])\n\n // Sort\n return result.sort((a, b) => a.generation - b.generation || (a.birthDate || \"\").localeCompare(b.birthDate || \"\"))\n }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])\n \n // 按世代分组并排序\n const membersByGeneration = useMemo(() => {\n const groups = new Map()\n \n filteredMembers.forEach(member => {\n const gen = member.generation\n if (!groups.has(gen)) {\n groups.set(gen, [])\n }\n groups.get(gen)!.push(member)\n })\n \n // 转换为数组并排序\n return Array.from(groups.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([generation, members]) => {\n // 区分家族成员和配偶\n const familyMembers = members.filter(m => {\n // 家族成员:有父母关系 或 明确标记为始祖\n const isFounder = m.tags?.includes('始祖')\n const hasFamilyParents = m.fatherId || m.motherId\n \n // 如果有父母关系,肯定是家族成员\n if (hasFamilyParents) return true\n \n // 如果明确标记为始祖,是家族成员\n if (isFounder) return true\n \n // 第1世且没有配偶的,可能是始祖(兼容没有标签的情况)\n if (generation === 1 && (!m.spouseIds || m.spouseIds.length === 0)) return true\n \n // 其他情况(如第1世但有配偶且没有父母的)是配偶身份\n return false\n })\n \n // 对家族成员按年龄排序(出生日期从早到晚 = 年龄从高到低)\n const sortedFamilyMembers = [...familyMembers].sort((a, b) => {\n // 1. 始祖永远排第一\n const aIsFounder = a.tags?.includes('始祖')\n const bIsFounder = b.tags?.includes('始祖')\n if (aIsFounder && !bIsFounder) return -1\n if (!aIsFounder && bIsFounder) return 1\n \n // 2. 按出生日期排序(早出生的在前 = 年龄大的在前)\n const aDate = a.birthDate || \"9999-12-31\"\n const bDate = b.birthDate || \"9999-12-31\"\n return aDate.localeCompare(bDate)\n })\n \n // 3. 将配偶插入到主成员后面\n const result: typeof members = []\n const processedSpouses = new Set()\n \n sortedFamilyMembers.forEach(member => {\n result.push(member)\n \n // 如果有配偶,将配偶紧跟在后面\n if (member.spouseIds && member.spouseIds.length > 0) {\n member.spouseIds.forEach(spouseId => {\n const spouse = members.find(m => m.id === spouseId)\n if (spouse && !processedSpouses.has(spouseId)) {\n result.push(spouse)\n processedSpouses.add(spouseId)\n }\n })\n } else {\n // 没有配偶,添加空白占位符\n result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any)\n }\n })\n \n return {\n generation,\n members: result\n }\n })\n }, [filteredMembers])\n\n const clearFilters = () => {\n setSelectedSurname(\"all\")\n setSelectedHome(\"all\")\n setStatusFilter(\"all\")\n setGenerationRange([1, 100]) // Reset to wide range\n setQuery(\"\")\n }\n\n const activeFilterCount =\n (selectedSurname !== \"all\" ? 1 : 0) +\n (selectedHome !== \"all\" ? 1 : 0) +\n (statusFilter !== \"all\" ? 1 : 0) +\n (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)\n\n return (\n
\n \n
\n
\n
\n

家族成员列表

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

高级筛选

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

第 {generation} 世

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

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

\n
\n {isFounder ? (\n

\n 家族始祖\n

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

\n {spouseName}的配偶\n

\n ) : (\n

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

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

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

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

家族成员列表

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

高级筛选

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

第 {generation} 世

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

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

\n
\n {isFounder ? (\n

\n 家族始祖\n

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

\n {spouseName}的配偶\n

\n ) : (\n

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

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

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

\n \n {/* 生卒年和年龄 */}\n {(member.birthDate || member.deathDate) && (\n
\n
\n {member.birthDate && new Date(member.birthDate).getFullYear()}\n {member.deathDate && ` - ${new Date(member.deathDate).getFullYear()}`}\n {!member.deathDate && member.birthDate && ' - '}\n
\n {(() => {\n if (!member.birthDate) return null\n const birthYear = new Date(member.birthDate).getFullYear()\n const deathYear = member.deathDate ? new Date(member.deathDate).getFullYear() : new Date().getFullYear()\n const age = deathYear - birthYear\n return (\n
\n {member.deathDate ? `享年${age}岁` : `${age}岁`}\n
\n )\n })()}\n
\n )}\n
\n \n {member.tags && member.tags.length > 0 && (\n
\n {member.tags.map((tag) => (\n \n {tag}\n \n ))}\n
\n )}\n
\n \n \n \n {\n setHighlightedMemberId(member.id)\n router.push('/tree')\n }}\n title=\"在族谱图中定位\"\n >\n \n \n
\n )\n })}\n
\n
\n ))}\n
\n )}\n
\n
\n )\n}\n"],"names":[],"mappings":";;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAdA;;;;;;;;;;;;;;AAkBe,SAAS;;IACtB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,GAAG,IAAA,oMAAS;IACrE,MAAM,SAAS,IAAA,wUAAS;IACxB,MAAM,CAAC,OAAO,SAAS,GAAG,IAAA,+VAAQ,EAAC;IACnC,MAAM,CAAC,aAAa,eAAe,GAAG,IAAA,+VAAQ,EAAC;IAE/C,kBAAkB;IAClB,IAAA,gWAAS;iCAAC;YACR,MAAM,SAAS,IAAI,gBAAgB,OAAO,QAAQ,CAAC,MAAM;YACzD,MAAM,cAAc,OAAO,GAAG,CAAC;YAC/B,IAAI,aAAa;gBACf,SAAS;YACX;QACF;gCAAG,EAAE;IAEL,gBAAgB;IAChB,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,IAAA,+VAAQ,EAAS;IAC/D,MAAM,CAAC,cAAc,gBAAgB,GAAG,IAAA,+VAAQ,EAAS;IACzD,MAAM,CAAC,cAAc,gBAAgB,GAAG,IAAA,+VAAQ,EAAS;IACzD,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,IAAA,+VAAQ,EAAmB;QAAC;QAAG;KAAI;IAEjF,eAAe;IACf,MAAM,aAAa,IAAA,8VAAO;2CAAC,IAAM,OAAO,MAAM,CAAC,SAAS,OAAO;0CAAG;QAAC;KAAS;IAE5E,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,8VAAO;+BAAC;YAC9D,MAAM,WAAW,IAAI;YACrB,MAAM,QAAQ,IAAI;YAClB,IAAI,MAAM;YACV,IAAI,MAAM;YAEV,WAAW,OAAO;uCAAC,CAAC;oBAClB,IAAI,EAAE,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,OAAO;oBACrC,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,aAAa;oBAC9C,IAAI,EAAE,UAAU,EAAE;wBAChB,IAAI,EAAE,UAAU,GAAG,KAAK,MAAM,EAAE,UAAU;wBAC1C,IAAI,EAAE,UAAU,GAAG,KAAK,MAAM,EAAE,UAAU;oBAC5C;gBACF;;YAEA,OAAO;gBACL,gBAAgB,MAAM,IAAI,CAAC,UAAU,IAAI;gBACzC,aAAa,MAAM,IAAI,CAAC,OAAO,IAAI;gBACnC,QAAQ,QAAQ,OAAO,IAAI;gBAC3B,QAAQ,QAAQ,IAAI,MAAM;YAC5B;QACF;8BAAG;QAAC;KAAW;IAEf,oCAAoC;IACpC,IAAA,8VAAO;+BAAC;YACN,IAAI,WAAW,QAAQ,WAAW,GAAG;YACnC,kCAAkC;YAClC,yFAAyF;YACzF,6BAA6B;YAC/B;QACF;8BAAG;QAAC;QAAQ;KAAO;IAEnB,MAAM,kBAAkB,IAAA,8VAAO;gDAAC;YAC9B,IAAI,SAAS;YAEb,kBAAkB;YAClB,IAAI,OAAO;gBACT,MAAM,aAAa,MAAM,WAAW;gBACpC,SAAS,OAAO,MAAM;4DACpB,CAAC,IACC,EAAE,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,eAClC,EAAE,YAAY,EAAE,cAAc,SAAS,eACvC,EAAE,OAAO,EAAE,cAAc,SAAS;;YAExC;YAEA,oBAAoB;YACpB,IAAI,oBAAoB,OAAO;gBAC7B,SAAS,OAAO,MAAM;4DAAC,CAAC,IAAM,EAAE,OAAO,KAAK;;YAC9C;YAEA,iBAAiB;YACjB,IAAI,iBAAiB,OAAO;gBAC1B,SAAS,OAAO,MAAM;4DAAC,CAAC,IAAM,EAAE,aAAa,KAAK;;YACpD;YAEA,mBAAmB;YACnB,IAAI,iBAAiB,OAAO;gBAC1B,IAAI,iBAAiB,UAAU;oBAC7B,SAAS,OAAO,MAAM;gEAAC,CAAC,IAAM,CAAC,EAAE,SAAS;;gBAC5C,OAAO,IAAI,iBAAiB,YAAY;oBACtC,SAAS,OAAO,MAAM;gEAAC,CAAC,IAAM,CAAC,CAAC,EAAE,SAAS;;gBAC7C;YACF;YAEA,uBAAuB;YACvB,SAAS,OAAO,MAAM;wDAAC,CAAC,IAAM,EAAE,UAAU,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,IAAI,eAAe,CAAC,EAAE;;YAEtG,OAAO;YACP,OAAO,OAAO,IAAI;wDAAC,CAAC,GAAG,IAAM,EAAE,UAAU,GAAG,EAAE,UAAU,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC,EAAE,SAAS,IAAI;;QAC/G;+CAAG;QAAC;QAAY;QAAO;QAAiB;QAAc;QAAc;KAAgB;IAEpF,WAAW;IACX,MAAM,sBAAsB,IAAA,8VAAO;oDAAC;YAClC,MAAM,SAAS,IAAI;YAEnB,gBAAgB,OAAO;4DAAC,CAAA;oBACtB,MAAM,MAAM,OAAO,UAAU;oBAC7B,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM;wBACpB,OAAO,GAAG,CAAC,KAAK,EAAE;oBACpB;oBACA,OAAO,GAAG,CAAC,KAAM,IAAI,CAAC;gBACxB;;YAEA,WAAW;YACX,OAAO,MAAM,IAAI,CAAC,OAAO,OAAO,IAC7B,IAAI;4DAAC,CAAC,GAAG,IAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;2DAC1B,GAAG;4DAAC,CAAC,CAAC,YAAY,QAAQ;oBACzB,YAAY;oBACZ,MAAM,gBAAgB,QAAQ,MAAM;kFAAC,CAAA;4BACnC,uBAAuB;4BACvB,MAAM,YAAY,EAAE,IAAI,EAAE,SAAS;4BACnC,MAAM,mBAAmB,EAAE,QAAQ,IAAI,EAAE,QAAQ;4BAEjD,kBAAkB;4BAClB,IAAI,kBAAkB,OAAO;4BAE7B,kBAAkB;4BAClB,IAAI,WAAW,OAAO;4BAEtB,6BAA6B;4BAC7B,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO;4BAE3E,4BAA4B;4BAC5B,OAAO;wBACT;;oBAEA,gCAAgC;oBAChC,MAAM,sBAAsB;2BAAI;qBAAc,CAAC,IAAI;wFAAC,CAAC,GAAG;4BACtD,aAAa;4BACb,MAAM,aAAa,EAAE,IAAI,EAAE,SAAS;4BACpC,MAAM,aAAa,EAAE,IAAI,EAAE,SAAS;4BACpC,IAAI,cAAc,CAAC,YAAY,OAAO,CAAC;4BACvC,IAAI,CAAC,cAAc,YAAY,OAAO;4BAEtC,8BAA8B;4BAC9B,MAAM,QAAQ,EAAE,SAAS,IAAI;4BAC7B,MAAM,QAAQ,EAAE,SAAS,IAAI;4BAC7B,OAAO,MAAM,aAAa,CAAC;wBAC7B;;oBAEA,iBAAiB;oBACjB,MAAM,SAAyB,EAAE;oBACjC,MAAM,mBAAmB,IAAI;oBAE7B,oBAAoB,OAAO;oEAAC,CAAA;4BAC1B,OAAO,IAAI,CAAC;4BAEZ,wBAAwB;4BACxB,IAAI,iBAAiB,EAAE,QAAQ;;4BAE/B,iBAAiB;4BACjB,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG;gCACnD,OAAO,SAAS,CAAC,OAAO;gFAAC,CAAA;wCACvB,MAAM,SAAS,QAAQ,IAAI;+FAAC,CAAA,IAAK,EAAE,EAAE,KAAK;;wCAC1C,IAAI,UAAU,CAAC,iBAAiB,GAAG,CAAC,WAAW;4CAC7C,OAAO,IAAI,CAAC;4CACZ,iBAAiB,GAAG,CAAC;4CACrB;wCACF;oCACF;;4BACF;4BAEA,wBAAwB;4BACxB,iCAAiC;4BACjC,8BAA8B;4BAC9B,iCAAiC;4BACjC,MAAM,qBAAqB,CAAC,IAAK,iBAAiB,CAAE,IAAI;4BACxD,IAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,IAAK;gCAC3C,OAAO,IAAI,CAAC;oCAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG;oCAAE,eAAe;gCAAK;4BACzE;wBACF;;oBAEA,OAAO;wBACL;wBACA,SAAS;oBACX;gBACF;;QACJ;mDAAG;QAAC;KAAgB;IAEpB,MAAM,eAAe;QACnB,mBAAmB;QACnB,gBAAgB;QAChB,gBAAgB;QAChB,mBAAmB;YAAC;YAAG;SAAI,GAAE,sBAAsB;QACnD,SAAS;IACX;IAEA,MAAM,oBACJ,CAAC,oBAAoB,QAAQ,IAAI,CAAC,IAClC,CAAC,iBAAiB,QAAQ,IAAI,CAAC,IAC/B,CAAC,iBAAiB,QAAQ,IAAI,CAAC,IAC/B,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,eAAe,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC;IAE7D,qBACE,mXAAC;QAAI,WAAU;;0BACb,mXAAC,qMAAU;;;;;0BACX,mXAAC;gBAAK,WAAU;;kCACd,mXAAC;wBAAI,WAAU;;0CACb,mXAAC;gCAAI,WAAU;;kDACb,mXAAC;wCAAG,WAAU;kDAAgC;;;;;;kDAC9C,mXAAC;wCAAI,WAAU;;0DACb,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,8VAAM;wDAAC,WAAU;;;;;;kEAClB,mXAAC,6LAAK;wDACJ,MAAK;wDACL,aAAY;wDACZ,WAAU;wDACV,OAAO;wDACP,UAAU,CAAC,IAAM,SAAS,EAAE,MAAM,CAAC,KAAK;;;;;;;;;;;;0DAG5C,mXAAC,+LAAM;gDACL,SAAS,eAAe,oBAAoB,IAAI,cAAc;gDAC9D,MAAK;gDACL,SAAS,IAAM,eAAe,CAAC;gDAC/B,WAAU;;kEAEV,mXAAC,8VAAM;wDAAC,WAAU;;;;;;oDACjB,oBAAoB,mBACnB,mXAAC;wDAAK,WAAU;;;;;;;;;;;;0DAGpB,mXAAC,gWAAI;gDAAC,MAAK;0DACT,cAAA,mXAAC,+LAAM;oDAAC,WAAU;;sEAChB,mXAAC,wVAAI;4DAAC,WAAU;;;;;;wDAAY;;;;;;;;;;;;;;;;;;;;;;;;4BAQnC,6BACC,mXAAC;gCAAI,WAAU;;kDACb,mXAAC;wCAAI,WAAU;;0DACb,mXAAC;gDAAG,WAAU;0DAA4C;;;;;;0DAC1D,mXAAC,+LAAM;gDAAC,SAAQ;gDAAQ,MAAK;gDAAK,SAAS;gDAAc,WAAU;;kEACjE,mXAAC,+UAAC;wDAAC,WAAU;;;;;;oDAAiB;;;;;;;;;;;;;kDAGlC,mXAAC;wCAAI,WAAU;;0DACb,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,WAAU;kEAAU;;;;;;kEAC3B,mXAAC,+LAAM;wDAAC,OAAO;wDAAiB,eAAe;;0EAC7C,mXAAC,sMAAa;0EACZ,cAAA,mXAAC,oMAAW;oEAAC,aAAY;;;;;;;;;;;0EAE3B,mXAAC,sMAAa;;kFACZ,mXAAC,mMAAU;wEAAC,OAAM;kFAAM;;;;;;oEACvB,eAAe,GAAG,CAAC,CAAC,kBACnB,mXAAC,mMAAU;4EAAS,OAAO;sFACxB;2EADc;;;;;;;;;;;;;;;;;;;;;;;0DAQzB,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,WAAU;kEAAU;;;;;;kEAC3B,mXAAC,+LAAM;wDAAC,OAAO;wDAAc,eAAe;;0EAC1C,mXAAC,sMAAa;0EACZ,cAAA,mXAAC,oMAAW;oEAAC,aAAY;;;;;;;;;;;0EAE3B,mXAAC,sMAAa;;kFACZ,mXAAC,mMAAU;wEAAC,OAAM;kFAAM;;;;;;oEACvB,YAAY,GAAG,CAAC,CAAC,kBAChB,mXAAC,mMAAU;4EAAS,OAAO;sFACxB;2EADc;;;;;;;;;;;;;;;;;;;;;;;0DAQzB,mXAAC;gDAAI,WAAU;;kEACb,mXAAC,6LAAK;wDAAC,WAAU;kEAAU;;;;;;kEAC3B,mXAAC,+LAAM;wDAAC,OAAO;wDAAc,eAAe;;0EAC1C,mXAAC,sMAAa;0EACZ,cAAA,mXAAC,oMAAW;oEAAC,aAAY;;;;;;;;;;;0EAE3B,mXAAC,sMAAa;;kFACZ,mXAAC,mMAAU;wEAAC,OAAM;kFAAM;;;;;;kFACxB,mXAAC,mMAAU;wEAAC,OAAM;kFAAS;;;;;;kFAC3B,mXAAC,mMAAU;wEAAC,OAAM;kFAAW;;;;;;;;;;;;;;;;;;;;;;;;0DAKnC,mXAAC;gDAAI,WAAU;;kEACb,mXAAC;wDAAI,WAAU;;0EACb,mXAAC,6LAAK;gEAAC,WAAU;0EAAU;;;;;;0EAC3B,mXAAC;gEAAK,WAAU;;oEACb,eAAe,CAAC,EAAE;oEAAC;oEAAI,eAAe,CAAC,EAAE;oEAAC;;;;;;;;;;;;;kEAG/C,mXAAC,+LAAM;wDACL,cAAc;4DAAC;4DAAG;yDAAI;wDACtB,OAAO;wDACP,KAAK;wDACL,KAAK;wDACL,MAAM;wDACN,eAAe,CAAC,MAAQ,mBAAmB;wDAC3C,WAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAQrB,gBAAgB,MAAM,KAAK,kBAC1B,mXAAC;wBAAI,WAAU;kCAA0C;;;;;6CAIzD,mXAAC;wBAAI,WAAU;kCACZ,oBAAoB,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,iBAC/C,mXAAC;;kDACC,mXAAC;wCAAI,WAAU;;0DACb,mXAAC;gDAAG,WAAU;;oDAA+C;oDAAG;oDAAW;;;;;;;0DAC3E,mXAAC;gDAAK,WAAU;;oDAAgC;oDAAG,QAAQ,MAAM;oDAAC;;;;;;;0DAClE,mXAAC;gDAAI,WAAU;;;;;;;;;;;;kDAEjB,mXAAC;wCAAI,WAAU;kDACZ,QAAQ,GAAG,CAAC,CAAC;4CACZ,WAAW;4CACX,IAAI,AAAC,OAAe,aAAa,EAAE;gDACjC,qBAAO,mXAAC;oDAAoB,WAAU;mDAArB,OAAO,EAAE;;;;;4CAC5B;4CAEA,WAAW;4CACX,YAAY;4CACZ,WAAW;4CACX,oBAAoB;4CACpB,MAAM,YAAY,OAAO,IAAI,EAAE,SAAS;4CACxC,MAAM,WAAW,CAAC,OAAO,QAAQ,IAAI,CAAC,OAAO,QAAQ,IACpC,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,GAAG,KAC9C,CAAC;4CAElB,SAAS;4CACT,MAAM,SAAS,YAAY,OAAO,SAAS,EAAE,CAAC,EAAE,GAAG,WAAW,IAAI,CAAC,CAAA,IAAK,EAAE,EAAE,KAAK,OAAO,SAAS,CAAC,EAAE,IAAI;4CACxG,MAAM,aAAa,SAAS,OAAO,QAAQ,GAAG;4CAE9C,qBACA,mXAAC;gDAAoB,WAAU;;kEAC7B,mXAAC,gWAAI;wDAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;kEACjC,cAAA,mXAAC,2LAAI;4DAAC,WAAW,CAAC,6DAA6D,EAC7E,WACI,iFACA,gFACJ;sEACF,cAAA,mXAAC,kMAAW;gEAAC,WAAU;;kFACrB,mXAAC;wEAAI,WAAU;;0FACb,mXAAC,iNAAa;gFACZ,SAAS,OAAO,aAAa;gFAC7B,aAAa,OAAO,SAAS;gFAC7B,cAAc,OAAO,OAAO;gFAC5B,QAAQ,OAAO,MAAM;gFACrB,WAAU;;;;;;4EAGX,OAAO,SAAS,kBACf,mXAAC;gFAAI,WAAU;gFAAqF,OAAM;;;;;;4EAE3G,CAAC,OAAO,SAAS,kBAChB,mXAAC;gFAAI,WAAU;gFAAsF,OAAM;;;;;;;;;;;;kFAG/G,mXAAC;wEAAI,WAAU;;0FACb,mXAAC;gFAAI,WAAU;0FACb,cAAA,mXAAC;oFAAG,WAAU;;wFACX,OAAO,QAAQ;wFACf,OAAO,YAAY,kBAClB,mXAAC;4FAAK,WAAU;;gGAAqD;gGAChE,OAAO,YAAY;;;;;;;;;;;;;;;;;;4EAK7B,0BACC,mXAAC;gFAAE,WAAU;0FAAyD;;;;;uFAGpE,YAAY,2BACd,mXAAC;gFAAE,WAAU;;oFACV;oFAAW;;;;;;qGAGd,mXAAC;gFAAE,WAAU;0FACV,OAAO,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,cAAc,EAAE,GAAG;;;;;;0FAK9D,mXAAC;gFAAI,WAAU;;kGACb,mXAAC;wFAAE,WAAU;kGAAqD,OAAO,aAAa,IAAI;;;;;;oFAGzF,CAAC,OAAO,SAAS,IAAI,OAAO,SAAS,mBACpC,mXAAC;wFAAI,WAAU;;0GACb,mXAAC;;oGACE,OAAO,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,EAAE,WAAW;oGAC1D,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,SAAS,EAAE,WAAW,IAAI;oGACpE,CAAC,OAAO,SAAS,IAAI,OAAO,SAAS,IAAI;;;;;;;4FAE3C,CAAC;gGACA,IAAI,CAAC,OAAO,SAAS,EAAE,OAAO;gGAC9B,MAAM,YAAY,IAAI,KAAK,OAAO,SAAS,EAAE,WAAW;gGACxD,MAAM,YAAY,OAAO,SAAS,GAAG,IAAI,KAAK,OAAO,SAAS,EAAE,WAAW,KAAK,IAAI,OAAO,WAAW;gGACtG,MAAM,MAAM,YAAY;gGACxB,qBACE,mXAAC;oGAAI,WAAU;8GACZ,OAAO,SAAS,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;;;;;;4FAGjD,CAAC;;;;;;;;;;;;;4EAKN,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,GAAG,mBACnC,mXAAC;gFAAI,WAAU;0FACZ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,oBAChB,mXAAC;wFAEC,WAAU;kGAET;uFAHI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEAYrB,mXAAC,+LAAM;wDACL,MAAK;wDACL,SAAQ;wDACR,WAAU;wDACV,SAAS;4DACP,uBAAuB,OAAO,EAAE;4DAChC,OAAO,IAAI,CAAC;wDACd;wDACA,OAAM;kEAEN,cAAA,mXAAC,8VAAM;4DAAC,WAAU;;;;;;;;;;;;+CAtGV,OAAO,EAAE;;;;;wCA0GrB;;;;;;;+BArIM;;;;;;;;;;;;;;;;;;;;;;AA8IxB;GAjdwB;;QACsC,oMAAS;QACtD,wUAAS;;;KAFF"}}] } \ No newline at end of file diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js index b839cd4d..45a4cde7 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js @@ -658,7 +658,7 @@ function SiteHeader() { }, this), /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", { className: "text-xl font-serif font-bold tracking-tight", - children: "华夏谱" + children: "华夏家谱" }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx", lineNumber: 231, diff --git a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js.map b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js.map index 4f14af52..dfc2c889 100644 --- a/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js.map +++ b/.next/dev/static/chunks/Documents_go-new_chinese-family-tree_fa7c1a71._.js.map @@ -4,7 +4,7 @@ "sections": [ {"offset": {"line": 4, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/avatar.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"],"names":[],"mappings":";;;;;;;;;AAGA;AAEA;AALA;;;;AAOA,SAAS,OAAO,EACd,SAAS,EACT,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,8DACA;QAED,GAAG,KAAK;;;;;;AAGf;KAdS;AAgBT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,2BAA2B;QACxC,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,eAAe,EACtB,SAAS,EACT,GAAG,OACmD;IACtD,qBACE,mXAAC,4bAAwB;QACvB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,oEACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS"}}, {"offset": {"line": 67, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dropdown-menu.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n \n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps & {\n inset?: boolean\n}) {\n return (\n \n {children}\n \n \n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"],"names":[],"mappings":"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"}}, - {"offset": {"line": 376, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/site-header.tsx"],"sourcesContent":["\"use client\"\n\nimport Link from \"next/link\"\nimport { BookOpen, Search, Bell, Settings, LogOut, User, ChevronDown, Plus, Trash2, Network, LayoutGrid, Calculator } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { useFamily } from \"@/context/family-context\"\nimport { useState, useRef, useEffect, useCallback } from \"react\"\nimport { useRouter, usePathname, useSearchParams } from \"next/navigation\"\nimport { useSession, signOut } from \"next-auth/react\"\nimport { useDialog } from \"@/components/ui/alert-dialog-custom\"\n\ninterface FamilyTree {\n id: string\n name: string\n description: string | null\n ownerId: string\n currentUserRole?: \"OWNER\" | \"EDITOR\" | \"VIEWER\"\n}\n\nexport function SiteHeader() {\n const { searchMembers, searchResults } = useFamily()\n const { data: session, status } = useSession()\n const { showAlert, showConfirm, showPrompt } = useDialog()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [showResults, setShowResults] = useState(false)\n const [familyTrees, setFamilyTrees] = useState([])\n const [currentTree, setCurrentTree] = useState(null)\n const [deletingTreeId, setDeletingTreeId] = useState(null)\n const searchRef = useRef(null)\n const router = useRouter()\n \n // 获取当前视图模式\n const currentViewMode = searchParams.get('view') || 'traditional'\n const isTreePage = pathname === '/tree'\n\n // 生成带有 treeId 的 URL\n const getUrlWithTreeId = (path: string) => {\n if (currentTree?.id) {\n return `${path}?treeId=${currentTree.id}`\n }\n return path\n }\n\n // 切换视图模式\n const handleViewModeChange = (mode: string) => {\n const params = new URLSearchParams(searchParams.toString())\n params.set('view', mode)\n if (currentTree?.id) {\n params.set('treeId', currentTree.id)\n }\n router.push(`${pathname}?${params.toString()}`)\n }\n\n const getRoleBadge = (role?: string) => {\n switch (role) {\n case \"OWNER\":\n return 所有者\n case \"EDITOR\":\n return 编辑\n case \"VIEWER\":\n return 查看\n default:\n return null\n }\n }\n\n const handleSignOut = async () => {\n await signOut({ callbackUrl: \"/auth/signin\" })\n }\n\n // 获取用户名首字母作为头像\n const getUserInitial = () => {\n if (session?.user?.name) {\n return session.user.name.charAt(0).toUpperCase()\n }\n if (session?.user?.email) {\n return session.user.email.charAt(0).toUpperCase()\n }\n return \"U\"\n }\n\n // 删除家族树\n const handleDeleteTree = async (tree: FamilyTree, e: React.MouseEvent) => {\n e.stopPropagation() // 阻止触发选择事件\n\n // 检查权限\n if (tree.ownerId !== session?.user?.id) {\n await showAlert('只有家族树的创建者才能删除', '权限不足')\n return\n }\n\n const confirmText = `确定要删除家族树\"${tree.name}\"吗?\\n\\n此操作将永久删除所有成员、活动日志和协作者数据,且不可撤销!`\n const confirmed = await showConfirm(confirmText, '删除家族树', 'destructive')\n if (!confirmed) {\n return\n }\n\n // 二次确认\n const finalConfirm = await showPrompt(\n `请输入家族树名称\"${tree.name}\"以确认删除:`,\n '',\n '确认删除'\n )\n if (finalConfirm !== tree.name) {\n await showAlert('名称不匹配,删除已取消', '操作已取消')\n return\n }\n\n setDeletingTreeId(tree.id)\n try {\n const response = await fetch(`/api/trees/${tree.id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.error || '删除失败')\n }\n\n // 刷新家族树列表\n await loadFamilyTrees()\n \n // 如果删除的是当前树,跳转到首页\n if (currentTree?.id === tree.id) {\n window.location.href = '/'\n }\n } catch (error) {\n console.error('删除家族树失败:', error)\n await showAlert('删除失败:' + (error as Error).message, '错误')\n } finally {\n setDeletingTreeId(null)\n }\n }\n\n // 获取家族树列表\n const loadFamilyTrees = useCallback(() => {\n if (!session?.user?.id || status !== 'authenticated') return\n\n const controller = new AbortController()\n \n fetch('/api/trees', { signal: controller.signal })\n .then(res => {\n if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`)\n return res.json()\n })\n .then(data => {\n if (data.trees) {\n setFamilyTrees(data.trees)\n // 如果 URL 中有 treeId,使用该树,否则使用第一个\n const urlParams = new URLSearchParams(window.location.search)\n const treeId = urlParams.get('treeId')\n if (treeId) {\n const tree = data.trees.find((t: FamilyTree) => t.id === treeId)\n if (tree) {\n setCurrentTree(tree)\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n } else if (data.trees.length > 0) {\n setCurrentTree(data.trees[0])\n }\n }\n })\n .catch(err => {\n // 忽略 abort 错误和 fetch 错误(可能是页面切换导致的)\n if (err.name !== 'AbortError' && err.message !== 'Failed to fetch') {\n console.error('获取家族树列表失败:', err)\n }\n })\n \n return () => controller.abort()\n }, [session?.user?.id, status])\n\n useEffect(() => {\n loadFamilyTrees()\n }, [loadFamilyTrees])\n\n // 监听路由变化,刷新家族树列表\n useEffect(() => {\n const handleRouteChange = () => {\n loadFamilyTrees()\n }\n \n window.addEventListener('focus', handleRouteChange)\n return () => window.removeEventListener('focus', handleRouteChange)\n }, [loadFamilyTrees])\n\n // 点击外部关闭搜索结果\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (searchRef.current && !searchRef.current.contains(event.target as Node)) {\n setShowResults(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [])\n\n const handleSearch = (query: string) => {\n setSearchQuery(query)\n searchMembers(query)\n setShowResults(query.length > 0)\n }\n\n const handleSelectMember = (memberId: string) => {\n router.push(`/members/${memberId}`)\n setSearchQuery(\"\")\n setShowResults(false)\n }\n\n return (\n
\n
\n
\n \n
\n \n
\n 华夏谱\n \n \n {/* 家族树选择器 */}\n {session && familyTrees.length > 0 && (\n \n \n \n \n \n 我的家族树\n \n {familyTrees.map((tree) => (\n {\n setCurrentTree(tree)\n // 保持当前路径,只更新 treeId 参数\n const currentPath = window.location.pathname\n router.push(`${currentPath}?treeId=${tree.id}`)\n }}\n className=\"cursor-pointer flex items-center justify-between group\"\n >\n
\n {tree.name}\n {getRoleBadge(tree.currentUserRole)}\n
\n
\n {currentTree?.id === tree.id && (\n \n )}\n {tree.ownerId === session?.user?.id && (\n handleDeleteTree(tree, e)}\n disabled={deletingTreeId === tree.id}\n >\n \n \n )}\n
\n \n ))}\n \n router.push('/trees/new')}\n className=\"cursor-pointer text-primary\"\n >\n \n 创建新家族树\n \n
\n
\n )}\n
\n\n \n\n
\n \n\n \n\n \n \n \n\n \n \n \n\n {status === \"loading\" ? (\n \n ...\n \n ) : session ? (\n \n \n \n \n \n \n
\n

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

\n

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

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

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

\n

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

\n
\n
\n \n \n \n \n 系统设置\n \n \n \n \n \n 退出登录\n \n
\n
\n ) : (\n \n \n \n )}\n
\n
\n
\n )\n}\n"],"names":[],"mappings":"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"}}, {"offset": {"line": 1307, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/textarea.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n \n )\n}\n\nexport { Textarea }\n"],"names":[],"mappings":";;;;;AAEA;;;AAEA,SAAS,SAAS,EAAE,SAAS,EAAE,GAAG,OAAyC;IACzE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,ucACA;QAED,GAAG,KAAK;;;;;;AAGf;KAXS"}}, {"offset": {"line": 1337, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/select.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Select({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps & {\n size?: 'sm' | 'default'\n}) {\n return (\n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n \n \n \n {children}\n \n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n \n \n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAAA;AAAA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,OAAO,SAAS,EAChB,QAAQ,EACR,GAAG,OAGJ;IACC,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,aAAW;QACX,WAAW,IAAA,4KAAE,EACX,gzBACA;QAED,GAAG,KAAK;;YAER;0BACD,mXAAC,wbAAoB;gBAAC,OAAO;0BAC3B,cAAA,mXAAC,yXAAe;oBAAC,WAAU;;;;;;;;;;;;;;;;;AAInC;MAxBS;AA0BT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,WAAW,QAAQ,EACnB,GAAG,OACkD;IACrD,qBACE,mXAAC,0bAAsB;kBACrB,cAAA,mXAAC,2bAAuB;YACtB,aAAU;YACV,WAAW,IAAA,4KAAE,EACX,ijBACA,aAAa,YACX,mIACF;YAEF,UAAU;YACT,GAAG,KAAK;;8BAET,mXAAC;;;;;8BACD,mXAAC,4bAAwB;oBACvB,WAAW,IAAA,4KAAE,EACX,OACA,aAAa,YACX;8BAGH;;;;;;8BAEH,mXAAC;;;;;;;;;;;;;;;;AAIT;MAjCS;AAmCT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,6CAA6C;QAC1D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,WAAW,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,OAC+C;IAClD,qBACE,mXAAC,wbAAoB;QACnB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,6aACA;QAED,GAAG,KAAK;;0BAET,mXAAC;gBAAK,WAAU;0BACd,cAAA,mXAAC,icAA6B;8BAC5B,cAAA,mXAAC,mWAAS;wBAAC,WAAU;;;;;;;;;;;;;;;;0BAGzB,mXAAC,4bAAwB;0BAAE;;;;;;;;;;;;AAGjC;MAtBS;AAwBT,SAAS,gBAAgB,EACvB,SAAS,EACT,GAAG,OACoD;IACvD,qBACE,mXAAC,6bAAyB;QACxB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iDAAiD;QAC9D,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,qBAAqB,EAC5B,SAAS,EACT,GAAG,OACyD;IAC5D,qBACE,mXAAC,kcAA8B;QAC7B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,mXAAa;YAAC,WAAU;;;;;;;;;;;AAG/B;MAhBS;AAkBT,SAAS,uBAAuB,EAC9B,SAAS,EACT,GAAG,OAC2D;IAC9D,qBACE,mXAAC,ocAAgC;QAC/B,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,wDACA;QAED,GAAG,KAAK;kBAET,cAAA,mXAAC,yXAAe;YAAC,WAAU;;;;;;;;;;;AAGjC;MAhBS"}}, {"offset": {"line": 1594, "column": 0}, "map": {"version":3,"sources":["file:///Users/freedak/Documents/go-new/chinese-family-tree/components/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps) {\n return \n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps & {\n showCloseButton?: boolean\n}) {\n return (\n \n \n \n {children}\n {showCloseButton && (\n \n \n Close\n \n )}\n \n \n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n \n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AAEA;AANA;;;;;AAQA,SAAS,OAAO,EACd,GAAG,OAC+C;IAClD,qBAAO,mXAAC,wbAAoB;QAAC,aAAU;QAAU,GAAG,KAAK;;;;;;AAC3D;KAJS;AAMT,SAAS,cAAc,EACrB,GAAG,OACkD;IACrD,qBAAO,mXAAC,2bAAuB;QAAC,aAAU;QAAkB,GAAG,KAAK;;;;;;AACtE;MAJS;AAMT,SAAS,aAAa,EACpB,GAAG,OACiD;IACpD,qBAAO,mXAAC,0bAAsB;QAAC,aAAU;QAAiB,GAAG,KAAK;;;;;;AACpE;MAJS;AAMT,SAAS,YAAY,EACnB,GAAG,OACgD;IACnD,qBAAO,mXAAC,ybAAqB;QAAC,aAAU;QAAgB,GAAG,KAAK;;;;;;AAClE;MAJS;AAMT,SAAS,cAAc,EACrB,SAAS,EACT,GAAG,OACkD;IACrD,qBACE,mXAAC,2bAAuB;QACtB,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0JACA;QAED,GAAG,KAAK;;;;;;AAGf;MAdS;AAgBT,SAAS,cAAc,EACrB,SAAS,EACT,QAAQ,EACR,kBAAkB,IAAI,EACtB,GAAG,OAGJ;IACC,qBACE,mXAAC;QAAa,aAAU;;0BACtB,mXAAC;;;;;0BACD,mXAAC,2bAAuB;gBACtB,aAAU;gBACV,WAAW,IAAA,4KAAE,EACX,+WACA;gBAED,GAAG,KAAK;;oBAER;oBACA,iCACC,mXAAC,ybAAqB;wBACpB,aAAU;wBACV,WAAU;;0CAEV,mXAAC,uVAAK;;;;;0CACN,mXAAC;gCAAK,WAAU;0CAAU;;;;;;;;;;;;;;;;;;;;;;;;AAMtC;MAhCS;AAkCT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,gDAAgD;QAC7D,GAAG,KAAK;;;;;;AAGf;MARS;AAUT,SAAS,aAAa,EAAE,SAAS,EAAE,GAAG,OAAoC;IACxE,qBACE,mXAAC;QACC,aAAU;QACV,WAAW,IAAA,4KAAE,EACX,0DACA;QAED,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,YAAY,EACnB,SAAS,EACT,GAAG,OACgD;IACnD,qBACE,mXAAC,ybAAqB;QACpB,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,sCAAsC;QACnD,GAAG,KAAK;;;;;;AAGf;MAXS;AAaT,SAAS,kBAAkB,EACzB,SAAS,EACT,GAAG,OACsD;IACzD,qBACE,mXAAC,+bAA2B;QAC1B,aAAU;QACV,WAAW,IAAA,4KAAE,EAAC,iCAAiC;QAC9C,GAAG,KAAK;;;;;;AAGf;MAXS"}}, diff --git a/.next/dev/trace b/.next/dev/trace index 46c1d782..3d000ebf 100644 --- a/.next/dev/trace +++ b/.next/dev/trace @@ -212,3 +212,6 @@ [{"name":"handle-request","duration":329813,"timestamp":117535368429,"id":20,"tags":{"url":"/api/trees"},"startTime":1763887114133,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117535698289,"id":29,"parentId":20,"tags":{"url":"/api/trees","memory.rss":"839806976","memory.heapUsed":"106743816","memory.heapTotal":"137342976"},"startTime":1763887114463,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":924768,"timestamp":117535373119,"id":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887114138,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":4,"timestamp":117536297926,"id":30,"parentId":27,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"840372224","memory.heapUsed":"107794752","memory.heapTotal":"137605120"},"startTime":1763887115063,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":196,"timestamp":117536300917,"id":31,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":187,"timestamp":117536301148,"id":32,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":153,"timestamp":117536301710,"id":33,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115066,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":129,"timestamp":117536301888,"id":34,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115067,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":182767,"timestamp":117536303519,"id":37,"tags":{"trigger":"/api/trees/[treeId]/members"},"startTime":1763887115068,"traceId":"e9a6c25356b91814"}] [{"name":"handle-request","duration":901500,"timestamp":117536302526,"id":35,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887115067,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117537204066,"id":38,"parentId":35,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"845115392","memory.heapUsed":"115135552","memory.heapTotal":"141295616"},"startTime":1763887115969,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":2695198,"timestamp":117565418714,"id":41,"tags":{"trigger":"/"},"startTime":1763887144182,"traceId":"e9a6c25356b91814"}] [{"name":"handle-request","duration":3076539,"timestamp":117565417150,"id":39,"tags":{"url":"/"},"startTime":1763887144181,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568493807,"id":42,"parentId":39,"tags":{"url":"/","memory.rss":"1342955520","memory.heapUsed":"148567208","memory.heapTotal":"175751168"},"startTime":1763887147257,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":372,"timestamp":117568785005,"id":43,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147549,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":538,"timestamp":117568785434,"id":44,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147549,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":236,"timestamp":117568787503,"id":45,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147551,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":150,"timestamp":117568787776,"id":46,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887147551,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1768,"timestamp":117568790055,"id":48,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763887147554,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":28132,"timestamp":117568789313,"id":47,"tags":{"url":"/api/auth/session"},"startTime":1763887147553,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568817547,"id":49,"parentId":47,"tags":{"url":"/api/auth/session","memory.rss":"1351725056","memory.heapUsed":"148598168","memory.heapTotal":"179888128"},"startTime":1763887147581,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1025,"timestamp":117568833085,"id":51,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147597,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":30179,"timestamp":117568831944,"id":50,"tags":{"url":"/api/trees"},"startTime":1763887147595,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568862189,"id":52,"parentId":50,"tags":{"url":"/api/trees","memory.rss":"1352810496","memory.heapUsed":"150081848","memory.heapTotal":"180383744"},"startTime":1763887147626,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1087,"timestamp":117568944764,"id":54,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147708,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":21502,"timestamp":117568943861,"id":53,"tags":{"url":"/api/trees"},"startTime":1763887147707,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117568965420,"id":55,"parentId":53,"tags":{"url":"/api/trees","memory.rss":"1353359360","memory.heapUsed":"151373688","memory.heapTotal":"180908032"},"startTime":1763887147729,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":673,"timestamp":117568966844,"id":57,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887147730,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":18198,"timestamp":117568966334,"id":56,"tags":{"url":"/api/trees"},"startTime":1763887147730,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117568984600,"id":58,"parentId":56,"tags":{"url":"/api/trees","memory.rss":"1353670656","memory.heapUsed":"152519648","memory.heapTotal":"181170176"},"startTime":1763887147748,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":274,"timestamp":117569000416,"id":59,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147764,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":348,"timestamp":117569000743,"id":60,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147764,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":529,"timestamp":117569003344,"id":61,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147767,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":398,"timestamp":117569003932,"id":62,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147767,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1082,"timestamp":117569006666,"id":64,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887147770,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":34424,"timestamp":117569005776,"id":63,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887147769,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":10,"timestamp":117569040273,"id":65,"parentId":63,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1356038144","memory.heapUsed":"155072968","memory.heapTotal":"182218752"},"startTime":1763887147804,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":231,"timestamp":117569042146,"id":66,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147806,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":213,"timestamp":117569042421,"id":67,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147806,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":370,"timestamp":117569043930,"id":68,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147807,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":258,"timestamp":117569044344,"id":69,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887147808,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":177486,"timestamp":117569046168,"id":72,"tags":{"trigger":"/api/trees/[treeId]/activity-logs"},"startTime":1763887147810,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":875393,"timestamp":117569045384,"id":70,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763887147809,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":4,"timestamp":117569920808,"id":73,"parentId":70,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"1363853312","memory.heapUsed":"151323600","memory.heapTotal":"183771136"},"startTime":1763887148684,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":2638,"timestamp":117589419612,"id":75,"parentId":3,"tags":{"inputPage":"/page"},"startTime":1763887168182,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":120937,"timestamp":117589417481,"id":74,"tags":{"url":"/"},"startTime":1763887168180,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117589538451,"id":76,"parentId":74,"tags":{"url":"/","memory.rss":"1338109952","memory.heapUsed":"142249536","memory.heapTotal":"146604032"},"startTime":1763887168301,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":286,"timestamp":117589883542,"id":77,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887168646,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":275,"timestamp":117589883885,"id":78,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887168647,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":208,"timestamp":117589884709,"id":79,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887168648,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":153,"timestamp":117589884957,"id":80,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887168648,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":646,"timestamp":117589886615,"id":82,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763887168649,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":20256,"timestamp":117589885742,"id":81,"tags":{"url":"/api/auth/session"},"startTime":1763887168649,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117589906037,"id":83,"parentId":81,"tags":{"url":"/api/auth/session","memory.rss":"1342664704","memory.heapUsed":"145229312","memory.heapTotal":"156012544"},"startTime":1763887168669,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1285,"timestamp":117590063955,"id":85,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887168827,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":18958,"timestamp":117590063408,"id":84,"tags":{"url":"/api/trees"},"startTime":1763887168826,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117590082407,"id":86,"parentId":84,"tags":{"url":"/api/trees","memory.rss":"1342930944","memory.heapUsed":"146335240","memory.heapTotal":"156012544"},"startTime":1763887168845,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":822,"timestamp":117590084185,"id":88,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887168847,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":25242,"timestamp":117590083796,"id":87,"tags":{"url":"/api/trees"},"startTime":1763887168847,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117590109089,"id":89,"parentId":87,"tags":{"url":"/api/trees","memory.rss":"1343918080","memory.heapUsed":"147845960","memory.heapTotal":"156475392"},"startTime":1763887168872,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":521,"timestamp":117590119790,"id":90,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887168883,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":469,"timestamp":117590120380,"id":91,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887168883,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":971,"timestamp":117590121707,"id":92,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887168885,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":644,"timestamp":117590122778,"id":93,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887168886,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1028,"timestamp":117590125385,"id":95,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887168888,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":35121,"timestamp":117590124493,"id":94,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887168887,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117590159660,"id":96,"parentId":94,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1345564672","memory.heapUsed":"147674560","memory.heapTotal":"156999680"},"startTime":1763887168922,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":412,"timestamp":117590163842,"id":97,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887168927,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":357,"timestamp":117590164297,"id":98,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887168927,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":686,"timestamp":117590166577,"id":99,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887168929,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":521,"timestamp":117590167331,"id":100,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs"},"startTime":1763887168930,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1028,"timestamp":117590169275,"id":102,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/activity-logs/route"},"startTime":1763887168932,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":25741,"timestamp":117590168667,"id":101,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10"},"startTime":1763887168931,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":14,"timestamp":117590194485,"id":103,"parentId":101,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/activity-logs?limit=10","memory.rss":"1346916352","memory.heapUsed":"149396448","memory.heapTotal":"156999680"},"startTime":1763887168957,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1009,"timestamp":117592621789,"id":105,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887171385,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":16984,"timestamp":117592620978,"id":104,"tags":{"url":"/api/trees"},"startTime":1763887171384,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117592638004,"id":106,"parentId":104,"tags":{"url":"/api/trees","memory.rss":"1348472832","memory.heapUsed":"149983232","memory.heapTotal":"158572544"},"startTime":1763887171401,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":839,"timestamp":117593511451,"id":108,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887172274,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":23600,"timestamp":117593510907,"id":107,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg"},"startTime":1763887172274,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117593534543,"id":109,"parentId":107,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh&_rsc=vusbg","memory.rss":"1350631424","memory.heapUsed":"150172408","memory.heapTotal":"159621120"},"startTime":1763887172297,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":547,"timestamp":117593852843,"id":111,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887172616,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":13714,"timestamp":117593852232,"id":110,"tags":{"url":"/api/trees"},"startTime":1763887172615,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117593865977,"id":112,"parentId":110,"tags":{"url":"/api/trees","memory.rss":"1350979584","memory.heapUsed":"146458168","memory.heapTotal":"167485440"},"startTime":1763887172629,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":420,"timestamp":117593867059,"id":114,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887172630,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":11483,"timestamp":117593866783,"id":113,"tags":{"url":"/api/trees"},"startTime":1763887172629,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117593878302,"id":115,"parentId":113,"tags":{"url":"/api/trees","memory.rss":"1350995968","memory.heapUsed":"147557784","memory.heapTotal":"167485440"},"startTime":1763887172641,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1807,"timestamp":117598492317,"id":117,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887177255,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":178,"timestamp":117598559948,"id":118,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887177322,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":112,"timestamp":117598560157,"id":119,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887177323,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":201,"timestamp":117598561162,"id":120,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887177324,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":140,"timestamp":117598561430,"id":121,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887177324,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":73790,"timestamp":117598491473,"id":116,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887177254,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117598565294,"id":122,"parentId":116,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"1354309632","memory.heapUsed":"149111192","memory.heapTotal":"168009728"},"startTime":1763887177328,"traceId":"e9a6c25356b91814"},{"name":"client-hmr-latency","duration":99000,"timestamp":117640356376,"id":123,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763887219515,"traceId":"e9a6c25356b91814"},{"name":"client-hmr-latency","duration":81000,"timestamp":117661171276,"id":124,"parentId":3,"tags":{"updatedModules":["[project]/Documents/go-new/chinese-family-tree/app/members/page.tsx [app-client]"],"page":"/members","isPageHidden":false},"startTime":1763887240231,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1381,"timestamp":117677310151,"id":126,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887256070,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":26237,"timestamp":117677308616,"id":125,"tags":{"url":"/api/trees"},"startTime":1763887256068,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":8,"timestamp":117677334902,"id":129,"parentId":125,"tags":{"url":"/api/trees","memory.rss":"1365647360","memory.heapUsed":"150953520","memory.heapTotal":"170483712"},"startTime":1763887256095,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":20235,"timestamp":117677331631,"id":128,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887256091,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":388955,"timestamp":117677330497,"id":127,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887256090,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117677719485,"id":130,"parentId":127,"tags":{"url":"/members?treeId=cmib8zhrq0003hhxlvnsi96nh","memory.rss":"1382420480","memory.heapUsed":"168670752","memory.heapTotal":"181972992"},"startTime":1763887256479,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":178,"timestamp":117677740008,"id":131,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887256500,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":123,"timestamp":117677740221,"id":132,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887256500,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":265,"timestamp":117677741044,"id":133,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887256501,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":269,"timestamp":117677741352,"id":134,"parentId":3,"tags":{"inputPage":"/.well-known/appspecific/com.chrome.devtools.json"},"startTime":1763887256501,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":496,"timestamp":117678220276,"id":135,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887256980,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":250,"timestamp":117678220838,"id":136,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887256981,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":224,"timestamp":117678222564,"id":137,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887256982,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":201,"timestamp":117678222864,"id":138,"parentId":3,"tags":{"inputPage":"/api/auth/session"},"startTime":1763887256983,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1943,"timestamp":117678232242,"id":140,"parentId":3,"tags":{"inputPage":"/api/auth/[...nextauth]/route"},"startTime":1763887256992,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":30625,"timestamp":117678230496,"id":139,"tags":{"url":"/api/auth/session"},"startTime":1763887256990,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":8,"timestamp":117678261189,"id":141,"parentId":139,"tags":{"url":"/api/auth/session","memory.rss":"1382694912","memory.heapUsed":"171154896","memory.heapTotal":"189022208"},"startTime":1763887257021,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1229,"timestamp":117678362012,"id":143,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887257122,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":255,"timestamp":117678370033,"id":144,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887257130,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":303,"timestamp":117678370352,"id":145,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887257130,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":793,"timestamp":117678373509,"id":146,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887257133,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":225,"timestamp":117678374351,"id":147,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887257134,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":775,"timestamp":117678377991,"id":149,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/route"},"startTime":1763887257138,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":30674,"timestamp":117678361443,"id":142,"tags":{"url":"/api/trees"},"startTime":1763887257121,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117678392165,"id":150,"parentId":142,"tags":{"url":"/api/trees","memory.rss":"1383526400","memory.heapUsed":"173718464","memory.heapTotal":"189779968"},"startTime":1763887257152,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":22262,"timestamp":117678377486,"id":148,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh"},"startTime":1763887257137,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117678399803,"id":151,"parentId":148,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh","memory.rss":"1383845888","memory.heapUsed":"174038504","memory.heapTotal":"189779968"},"startTime":1763887257160,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":205,"timestamp":117678431193,"id":152,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887257191,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":144,"timestamp":117678431434,"id":153,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887257191,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":170,"timestamp":117678432069,"id":154,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887257192,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":149,"timestamp":117678432269,"id":155,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887257192,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":620,"timestamp":117678433534,"id":157,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887257193,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":21026,"timestamp":117678433128,"id":156,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887257193,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117678454194,"id":158,"parentId":156,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1385832448","memory.heapUsed":"176090168","memory.heapTotal":"190042112"},"startTime":1763887257214,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":2134,"timestamp":117728074948,"id":160,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887306833,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":492,"timestamp":117728097049,"id":161,"parentId":3,"tags":{"inputPage":"/members/cmib8zhse000jhhxlt3ppgfn2"},"startTime":1763887306855,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":385,"timestamp":117728097615,"id":162,"parentId":3,"tags":{"inputPage":"/members/cmib8zhse000jhhxlt3ppgfn2"},"startTime":1763887306856,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":432,"timestamp":117728100124,"id":163,"parentId":3,"tags":{"inputPage":"/members/cmib8zhse000jhhxlt3ppgfn2"},"startTime":1763887306858,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":378,"timestamp":117728100631,"id":164,"parentId":3,"tags":{"inputPage":"/members/cmib8zhse000jhhxlt3ppgfn2"},"startTime":1763887306859,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":36131,"timestamp":117728072047,"id":159,"tags":{"url":"/api/trees"},"startTime":1763887306830,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":14,"timestamp":117728108280,"id":165,"parentId":159,"tags":{"url":"/api/trees","memory.rss":"1371947008","memory.heapUsed":"166698288","memory.heapTotal":"171487232"},"startTime":1763887306866,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":631024,"timestamp":117728111605,"id":168,"tags":{"trigger":"/members/[id]"},"startTime":1763887306870,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":1171456,"timestamp":117728109848,"id":166,"tags":{"url":"/members/cmib8zhse000jhhxlt3ppgfn2?_rsc=1vf4i"},"startTime":1763887306868,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117729281425,"id":169,"parentId":166,"tags":{"url":"/members/cmib8zhse000jhhxlt3ppgfn2?_rsc=1vf4i","memory.rss":"1402216448","memory.heapUsed":"173920064","memory.heapTotal":"178036736"},"startTime":1763887308039,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1691,"timestamp":117729352530,"id":171,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887308111,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":23191,"timestamp":117729351969,"id":170,"tags":{"url":"/api/trees"},"startTime":1763887308110,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":9,"timestamp":117729375290,"id":172,"parentId":170,"tags":{"url":"/api/trees","memory.rss":"1403174912","memory.heapUsed":"175078072","memory.heapTotal":"179085312"},"startTime":1763887308133,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":195,"timestamp":117729406144,"id":173,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887308164,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":143,"timestamp":117729406368,"id":174,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887308164,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":165,"timestamp":117729407286,"id":175,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887308165,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":139,"timestamp":117729407474,"id":176,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887308166,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":704,"timestamp":117729408558,"id":178,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887308167,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":28085,"timestamp":117729408084,"id":177,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887308166,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117729436271,"id":179,"parentId":177,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1404608512","memory.heapUsed":"176992840","memory.heapTotal":"181444608"},"startTime":1763887308194,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1144,"timestamp":117729643889,"id":181,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887308402,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":13659,"timestamp":117729643319,"id":180,"tags":{"url":"/api/trees"},"startTime":1763887308401,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117729657017,"id":182,"parentId":180,"tags":{"url":"/api/trees","memory.rss":"1406427136","memory.heapUsed":"176884880","memory.heapTotal":"182726656"},"startTime":1763887308415,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":452,"timestamp":117729658561,"id":184,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887308417,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":15420,"timestamp":117729658248,"id":183,"tags":{"url":"/api/trees"},"startTime":1763887308416,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":8,"timestamp":117729673726,"id":185,"parentId":183,"tags":{"url":"/api/trees","memory.rss":"1406681088","memory.heapUsed":"178178976","memory.heapTotal":"182726656"},"startTime":1763887308432,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":370797,"timestamp":117730950728,"id":188,"tags":{"trigger":"/members/new"},"startTime":1763887309709,"traceId":"e9a6c25356b91814"}] +[{"name":"handle-request","duration":444707,"timestamp":117730950233,"id":186,"tags":{"url":"/members/new?spouseId=cmib8zhse000jhhxlt3ppgfn2&generation=3&gender=FEMALE&_rsc=p1q4o"},"startTime":1763887309708,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117731394987,"id":189,"parentId":186,"tags":{"url":"/members/new?spouseId=cmib8zhse000jhhxlt3ppgfn2&generation=3&gender=FEMALE&_rsc=p1q4o","memory.rss":"1417105408","memory.heapUsed":"184541544","memory.heapTotal":"194256896"},"startTime":1763887310153,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":599,"timestamp":117731439387,"id":191,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887310197,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":20389,"timestamp":117731438830,"id":190,"tags":{"url":"/api/trees"},"startTime":1763887310197,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":8,"timestamp":117731459267,"id":192,"parentId":190,"tags":{"url":"/api/trees","memory.rss":"1417945088","memory.heapUsed":"182114280","memory.heapTotal":"194781184"},"startTime":1763887310217,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":328,"timestamp":117731463432,"id":193,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887310221,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":260,"timestamp":117731463807,"id":194,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887310222,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":585,"timestamp":117731466422,"id":195,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887310224,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":301,"timestamp":117731467058,"id":196,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887310225,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":1013,"timestamp":117731469455,"id":198,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887310227,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":25773,"timestamp":117731468590,"id":197,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887310227,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":25,"timestamp":117731494453,"id":199,"parentId":197,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1418072064","memory.heapUsed":"184539280","memory.heapTotal":"194781184"},"startTime":1763887310252,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":668,"timestamp":117731749269,"id":201,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887310507,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":12484,"timestamp":117731748603,"id":200,"tags":{"url":"/api/trees"},"startTime":1763887310507,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117731761155,"id":202,"parentId":200,"tags":{"url":"/api/trees","memory.rss":"1419780096","memory.heapUsed":"183996912","memory.heapTotal":"203169792"},"startTime":1763887310519,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":598,"timestamp":117731762678,"id":204,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887310521,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":11011,"timestamp":117731762356,"id":203,"tags":{"url":"/api/trees"},"startTime":1763887310520,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117731773413,"id":205,"parentId":203,"tags":{"url":"/api/trees","memory.rss":"1420603392","memory.heapUsed":"185081440","memory.heapTotal":"203169792"},"startTime":1763887310531,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":227,"timestamp":117753181299,"id":206,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887331939,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":157,"timestamp":117753181558,"id":207,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887331939,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":164,"timestamp":117753182100,"id":208,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887331939,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":146,"timestamp":117753182286,"id":209,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887331940,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":881,"timestamp":117753184176,"id":211,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887331941,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":32271,"timestamp":117753183180,"id":210,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887331940,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":4,"timestamp":117753215481,"id":212,"parentId":210,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1410322432","memory.heapUsed":"178634032","memory.heapTotal":"183275520"},"startTime":1763887331973,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":828,"timestamp":117753322479,"id":214,"parentId":3,"tags":{"inputPage":"/members/page"},"startTime":1763887332080,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":21992,"timestamp":117753322148,"id":213,"tags":{"url":"/members?_rsc=1f7vx"},"startTime":1763887332079,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117753344174,"id":215,"parentId":213,"tags":{"url":"/members?_rsc=1f7vx","memory.rss":"1411297280","memory.heapUsed":"179584600","memory.heapTotal":"184061952"},"startTime":1763887332101,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":471,"timestamp":117753750817,"id":217,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887332508,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":11774,"timestamp":117753750527,"id":216,"tags":{"url":"/api/trees"},"startTime":1763887332508,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117753762339,"id":218,"parentId":216,"tags":{"url":"/api/trees","memory.rss":"1411538944","memory.heapUsed":"180657120","memory.heapTotal":"184324096"},"startTime":1763887332520,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":441,"timestamp":117753764407,"id":220,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887332522,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":11938,"timestamp":117753764119,"id":219,"tags":{"url":"/api/trees"},"startTime":1763887332521,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":6,"timestamp":117753776092,"id":221,"parentId":219,"tags":{"url":"/api/trees","memory.rss":"1411694592","memory.heapUsed":"180664232","memory.heapTotal":"183537664"},"startTime":1763887332533,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":573,"timestamp":117753777359,"id":223,"parentId":3,"tags":{"inputPage":"/api/trees/route"},"startTime":1763887332535,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":10818,"timestamp":117753777019,"id":222,"tags":{"url":"/api/trees"},"startTime":1763887332534,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":5,"timestamp":117753787873,"id":224,"parentId":222,"tags":{"url":"/api/trees","memory.rss":"1411764224","memory.heapUsed":"181223408","memory.heapTotal":"183799808"},"startTime":1763887332545,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":190,"timestamp":117754023754,"id":225,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887332781,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":148,"timestamp":117754023972,"id":226,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887332781,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":413,"timestamp":117754025709,"id":227,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887332783,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":218,"timestamp":117754026210,"id":228,"parentId":3,"tags":{"inputPage":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887332783,"traceId":"e9a6c25356b91814"},{"name":"ensure-page","duration":654,"timestamp":117754028554,"id":230,"parentId":3,"tags":{"inputPage":"/api/trees/[treeId]/members/route"},"startTime":1763887332786,"traceId":"e9a6c25356b91814"},{"name":"handle-request","duration":19185,"timestamp":117754028135,"id":229,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members"},"startTime":1763887332785,"traceId":"e9a6c25356b91814"},{"name":"memory-usage","duration":7,"timestamp":117754047362,"id":231,"parentId":229,"tags":{"url":"/api/trees/cmib8zhrq0003hhxlvnsi96nh/members","memory.rss":"1412620288","memory.heapUsed":"182387480","memory.heapTotal":"184848384"},"startTime":1763887332805,"traceId":"e9a6c25356b91814"},{"name":"compile-path","duration":1590775,"timestamp":117774437592,"id":234,"tags":{"trigger":"/tree"},"startTime":1763887353194,"traceId":"e9a6c25356b91814"}] diff --git a/app/members/page.tsx b/app/members/page.tsx index 54760b75..35f3e739 100644 --- a/app/members/page.tsx +++ b/app/members/page.tsx @@ -168,6 +168,9 @@ export default function MembersPage() { sortedFamilyMembers.forEach(member => { result.push(member) + // 计算该家庭单元的成员数(主成员 + 配偶) + let familyUnitSize = 1 // 主成员自己 + // 如果有配偶,将配偶紧跟在后面 if (member.spouseIds && member.spouseIds.length > 0) { member.spouseIds.forEach(spouseId => { @@ -175,11 +178,18 @@ export default function MembersPage() { if (spouse && !processedSpouses.has(spouseId)) { result.push(spouse) processedSpouses.add(spouseId) + familyUnitSize++ } }) - } else { - // 没有配偶,添加空白占位符 - result.push({ id: `placeholder-${member.id}`, isPlaceholder: true } as any) + } + + // 计算需要添加的占位符数量,确保填满4的倍数 + // 例如:1个主成员 + 1个配偶 = 2人,需要添加2个占位符 + // 例如:1个主成员 + 3个配偶 = 4人,不需要占位符 + // 例如:1个主成员 + 0个配偶 = 1人,需要添加3个占位符 + const placeholdersNeeded = (4 - (familyUnitSize % 4)) % 4 + for (let i = 0; i < placeholdersNeeded; i++) { + result.push({ id: `placeholder-${member.id}-${i}`, isPlaceholder: true } as any) } })