This commit is contained in:
freedakgmail
2025-11-22 20:18:26 +08:00
parent 33cf0c50d1
commit b83382b604
34 changed files with 83039 additions and 213 deletions
+25
View File
@@ -83,3 +83,28 @@
[00:29:45.605] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/timeline","route":"/timeline"}
[00:29:45.605] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/timeline color: rgb(120, 120, 120) color: inherit {"dp":"/timeline","o":"http://localhost:3000/timeline","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813242531}
[00:30:04.863] Server LOG ✓ Compiled in 43ms
[00:31:05.485] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813322407}
[00:31:11.585] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813328512}
[00:31:17.499] 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":1763813334426}
[00:31:20.295] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/timeline color: rgb(120, 120, 120) color: inherit {"dp":"/timeline","o":"http://localhost:3000/timeline","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813337220}
[00:32:19.644] Server LOG ✓ Compiled in 137ms
[00:37:00.531] Server LOG ✓ Compiled in 134ms
[00:37:44.552] 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":1763813721464}
[00:38:03.588] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813740498}
[00:38:05.583] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813742472}
[00:39:22.100] Server ERROR ReferenceError: Link is not defined
[00:39:22.247] Browser ERROR uncaughtError: ReferenceError: Link is not defined
[00:39:37.192] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
[00:39:38.250] 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:39:38.250] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"}
[00:39:38.250] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813835102}
[00:39:48.012] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/tree color: rgb(120, 120, 120) color: inherit {"dp":"/tree","o":"http://localhost:3000/tree","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813844920}
[00:39:50.183] 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":1763813847092}
[00:39:52.481] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813849384}
[00:39:53.810] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/members/new color: rgb(120, 120, 120) color: inherit {"dp":"/members/new","o":"http://localhost:3000/members/new","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813850714}
[00:39:56.269] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813853174}
[00:39:58.337] Server LOG ✓ Compiled in 201ms
[00:39:58.769] Browser INFO %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold
[00:40:00.025] 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:40:00.025] Browser LOG %c[Vercel Web Analytics]%c Running queued event color: rgb(120, 120, 120) color: inherit pageview {"path":"/","route":"/"}
[00:40:00.025] Browser LOG %c[Vercel Web Analytics]%c [pageview] http://localhost:3000/ color: rgb(120, 120, 120) color: inherit {"dp":"/","o":"http://localhost:3000/","sdkn":"@vercel/analytics/next","sdkv":"1.5.0","sv":"0.1.3","ts":1763813856857}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,6 +1,6 @@
var R=require("../chunks/ssr/[turbopack]_runtime.js")("server/app/page.js")
R.c("server/chunks/ssr/[root-of-the-server]__65ca0f36._.js")
R.c("server/chunks/ssr/a0629__pnpm_90f20275._.js")
R.c("server/chunks/ssr/a0629__pnpm_6628f521._.js")
R.c("server/chunks/ssr/4e98a_next_dist_0643e073._.js")
R.c("server/chunks/ssr/[root-of-the-server]__7f148858._.js")
R.c("server/chunks/ssr/4e98a_next_dist_client_components_builtin_global-error_196f2367.js")
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -624,6 +624,7 @@ __turbopack_context__.s([
()=>DashboardPage
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.js [app-rsc] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$react$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/dist/client/app-dir/link.react-server.js [app-rsc] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/button.tsx [app-rsc] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/ui/card.tsx [app-rsc] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$site$2d$header$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/components/site-header.tsx [app-rsc] (ecmascript)");
@@ -645,13 +646,14 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$ch
;
;
;
;
function DashboardPage() {
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "flex min-h-screen flex-col bg-background font-sans",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$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$rsc$5d$__$28$ecmascript$29$__["SiteHeader"], {}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 12,
lineNumber: 13,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("main", {
@@ -667,7 +669,7 @@ function DashboardPage() {
children: "李氏家族族谱"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 17,
lineNumber: 18,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
@@ -675,63 +677,77 @@ function DashboardPage() {
children: "陇西堂 · 第 24 代传人"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 18,
lineNumber: 19,
columnNumber: 13
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 16,
lineNumber: 17,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "flex gap-2",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
variant: "outline",
className: "gap-2 bg-transparent",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$network$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$export__default__as__Network$3e$__["Network"], {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 22,
columnNumber: 15
}, this),
"查看世系图"
]
}, void 0, true, {
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$react$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"], {
href: "/tree",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
variant: "outline",
className: "gap-2 bg-transparent",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$network$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$export__default__as__Network$3e$__["Network"], {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 24,
columnNumber: 17
}, this),
"查看世系图"
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 23,
columnNumber: 15
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 21,
lineNumber: 22,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
className: "gap-2 bg-primary text-primary-foreground hover:bg-primary/90",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$user$2d$plus$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$export__default__as__UserPlus$3e$__["UserPlus"], {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 26,
columnNumber: 15
}, this),
"添加成员"
]
}, void 0, true, {
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$react$2d$server$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["default"], {
href: "/members/new",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
className: "gap-2 bg-primary text-primary-foreground hover:bg-primary/90",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$lucide$2d$react$40$0$2e$454$2e$0_react$40$19$2e$2$2e$0$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$user$2d$plus$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__$3c$export__default__as__UserPlus$3e$__["UserPlus"], {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 30,
columnNumber: 17
}, this),
"添加成员"
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 29,
columnNumber: 15
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 25,
lineNumber: 28,
columnNumber: 13
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 20,
lineNumber: 21,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 15,
lineNumber: 16,
columnNumber: 9
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -745,12 +761,12 @@ function DashboardPage() {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 33,
lineNumber: 38,
columnNumber: 76
}, void 0)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 33,
lineNumber: 38,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(StatCard, {
@@ -761,12 +777,12 @@ function DashboardPage() {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 34,
lineNumber: 39,
columnNumber: 75
}, void 0)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 34,
lineNumber: 39,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(StatCard, {
@@ -777,18 +793,18 @@ function DashboardPage() {
className: "h-4 w-4"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 35,
lineNumber: 40,
columnNumber: 76
}, void 0)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 35,
lineNumber: 40,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 32,
lineNumber: 37,
columnNumber: 9
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["Tabs"], {
@@ -806,7 +822,7 @@ function DashboardPage() {
children: "最近更新"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 41,
lineNumber: 46,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["TabsTrigger"], {
@@ -814,7 +830,7 @@ function DashboardPage() {
children: "近期纪念日"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 42,
lineNumber: 47,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["TabsTrigger"], {
@@ -822,13 +838,13 @@ function DashboardPage() {
children: "迁徙记录"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 43,
lineNumber: 48,
columnNumber: 15
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 40,
lineNumber: 45,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
@@ -841,19 +857,19 @@ function DashboardPage() {
className: "h-3 w-3"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 46,
lineNumber: 51,
columnNumber: 20
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 45,
lineNumber: 50,
columnNumber: 13
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 39,
lineNumber: 44,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$tabs$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["TabsContent"], {
@@ -872,20 +888,20 @@ function DashboardPage() {
children: "近期修谱动态"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 54,
lineNumber: 59,
columnNumber: 19
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CardDescription"], {
children: "记录家族成员的最新变动与修订"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 55,
lineNumber: 60,
columnNumber: 19
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 53,
lineNumber: 58,
columnNumber: 17
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CardContent"], {
@@ -909,20 +925,20 @@ function DashboardPage() {
className: "h-full w-px bg-border group-last:hidden"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 63,
lineNumber: 68,
columnNumber: 29
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "absolute top-2 h-2 w-2 rounded-full bg-primary ring-4 ring-background"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 64,
lineNumber: 69,
columnNumber: 29
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 62,
lineNumber: 67,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -936,7 +952,7 @@ function DashboardPage() {
children: "李明远"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 68,
lineNumber: 73,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -944,7 +960,7 @@ function DashboardPage() {
children: "第 22 世"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 69,
lineNumber: 74,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -952,13 +968,13 @@ function DashboardPage() {
children: "2小时前"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 72,
lineNumber: 77,
columnNumber: 31
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 67,
lineNumber: 72,
columnNumber: 29
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
@@ -970,7 +986,7 @@ function DashboardPage() {
children: "李子豪"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 75,
lineNumber: 80,
columnNumber: 38
}, this),
" ",
@@ -978,40 +994,40 @@ function DashboardPage() {
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 74,
lineNumber: 79,
columnNumber: 29
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 66,
lineNumber: 71,
columnNumber: 27
}, this)
]
}, i, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 61,
lineNumber: 66,
columnNumber: 25
}, this))
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 59,
lineNumber: 64,
columnNumber: 21
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 58,
lineNumber: 63,
columnNumber: 19
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 57,
lineNumber: 62,
columnNumber: 17
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 52,
lineNumber: 57,
columnNumber: 15
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1028,19 +1044,19 @@ function DashboardPage() {
className: "h-5 w-5"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 90,
lineNumber: 95,
columnNumber: 23
}, this),
"本月祭祖/纪念"
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 89,
lineNumber: 94,
columnNumber: 21
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 88,
lineNumber: 93,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CardContent"], {
@@ -1057,7 +1073,7 @@ function DashboardPage() {
children: "农历"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 97,
lineNumber: 102,
columnNumber: 25
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1065,13 +1081,13 @@ function DashboardPage() {
children: "十五"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 98,
lineNumber: 103,
columnNumber: 25
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 96,
lineNumber: 101,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1081,7 +1097,7 @@ function DashboardPage() {
children: "李公讳文德 诞辰"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 101,
lineNumber: 106,
columnNumber: 25
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
@@ -1089,19 +1105,19 @@ function DashboardPage() {
children: "第 18 世祖 · 距今 120 年"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 102,
lineNumber: 107,
columnNumber: 25
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 100,
lineNumber: 105,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 95,
lineNumber: 100,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1115,7 +1131,7 @@ function DashboardPage() {
children: "农历"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 107,
lineNumber: 112,
columnNumber: 25
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1123,13 +1139,13 @@ function DashboardPage() {
children: "廿二"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 108,
lineNumber: 113,
columnNumber: 25
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 106,
lineNumber: 111,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1139,7 +1155,7 @@ function DashboardPage() {
children: "冬至祭祖"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 111,
lineNumber: 116,
columnNumber: 25
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
@@ -1147,31 +1163,31 @@ function DashboardPage() {
children: "全族公祭 · 陇西堂旧址"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 112,
lineNumber: 117,
columnNumber: 25
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 110,
lineNumber: 115,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 105,
lineNumber: 110,
columnNumber: 21
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 94,
lineNumber: 99,
columnNumber: 19
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 87,
lineNumber: 92,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["Card"], {
@@ -1183,12 +1199,12 @@ function DashboardPage() {
children: "快捷入口"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 120,
lineNumber: 125,
columnNumber: 21
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 119,
lineNumber: 124,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$components$2f$ui$2f$card$2e$tsx__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["CardContent"], {
@@ -1202,7 +1218,7 @@ function DashboardPage() {
className: "h-5 w-5"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 127,
lineNumber: 132,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1210,13 +1226,13 @@ function DashboardPage() {
children: "迁徙地图"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 128,
lineNumber: 133,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 123,
lineNumber: 128,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
@@ -1227,7 +1243,7 @@ function DashboardPage() {
className: "h-5 w-5"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 134,
lineNumber: 139,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1235,13 +1251,13 @@ function DashboardPage() {
children: "家训家规"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 135,
lineNumber: 140,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 130,
lineNumber: 135,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
@@ -1252,7 +1268,7 @@ function DashboardPage() {
className: "h-5 w-5"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 141,
lineNumber: 146,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1260,13 +1276,13 @@ function DashboardPage() {
children: "字辈查询"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 142,
lineNumber: 147,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 137,
lineNumber: 142,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$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$rsc$5d$__$28$ecmascript$29$__["Button"], {
@@ -1277,7 +1293,7 @@ function DashboardPage() {
className: "h-5 w-5"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 148,
lineNumber: 153,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
@@ -1285,60 +1301,60 @@ function DashboardPage() {
children: "关系计算"
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 149,
lineNumber: 154,
columnNumber: 23
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 144,
lineNumber: 149,
columnNumber: 21
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 122,
lineNumber: 127,
columnNumber: 19
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 118,
lineNumber: 123,
columnNumber: 17
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 86,
lineNumber: 91,
columnNumber: 15
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 51,
lineNumber: 56,
columnNumber: 13
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 50,
lineNumber: 55,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 38,
lineNumber: 43,
columnNumber: 9
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 14,
lineNumber: 15,
columnNumber: 7
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 11,
lineNumber: 12,
columnNumber: 5
}, this);
}
@@ -1356,7 +1372,7 @@ function StatCard({ title, value, subtitle, icon }) {
children: title
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 172,
lineNumber: 177,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1364,13 +1380,13 @@ function StatCard({ title, value, subtitle, icon }) {
children: icon
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 173,
lineNumber: 178,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 171,
lineNumber: 176,
columnNumber: 9
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -1381,7 +1397,7 @@ function StatCard({ title, value, subtitle, icon }) {
children: value
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 176,
lineNumber: 181,
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$rsc$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$rsc$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
@@ -1389,24 +1405,24 @@ function StatCard({ title, value, subtitle, icon }) {
children: subtitle
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 177,
lineNumber: 182,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 175,
lineNumber: 180,
columnNumber: 9
}, this)
]
}, void 0, true, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 170,
lineNumber: 175,
columnNumber: 7
}, this)
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/app/page.tsx",
lineNumber: 169,
lineNumber: 174,
columnNumber: 5
}, this);
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -656,6 +656,10 @@
order: 9999;
}
.col-span-full {
grid-column: 1 / -1;
}
.col-start-2 {
grid-column-start: 2;
}
@@ -774,6 +778,10 @@
margin-top: auto;
}
.mr-1 {
margin-right: calc(var(--spacing) * 1);
}
.mr-2 {
margin-right: calc(var(--spacing) * 2);
}
@@ -1469,6 +1477,10 @@
scroll-padding-block: calc(var(--spacing) * 1);
}
.list-inside {
list-style-position: inside;
}
.list-disc {
list-style-type: disc;
}
@@ -1835,6 +1847,16 @@
border-color: var(--destructive);
}
.border-destructive\/20 {
border-color: var(--destructive);
}
@supports (color: color-mix(in lab, red, red)) {
.border-destructive\/20 {
border-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
.border-input {
border-color: var(--input);
}
@@ -1967,6 +1989,16 @@
background-color: var(--destructive);
}
.bg-destructive\/15 {
background-color: var(--destructive);
}
@supports (color: color-mix(in lab, red, red)) {
.bg-destructive\/15 {
background-color: color-mix(in oklab, var(--destructive) 15%, transparent);
}
}
.bg-foreground {
background-color: var(--foreground);
}
@@ -2207,6 +2239,10 @@
padding-block: calc(var(--spacing) * 10);
}
.py-12 {
padding-block: calc(var(--spacing) * 12);
}
.pt-0 {
padding-top: calc(var(--spacing) * 0);
}
@@ -2821,6 +2857,10 @@
--cell-size: calc(var(--spacing) * 8);
}
.slide-in-from-top-2 {
--tw-enter-translate-y: calc(2 * var(--spacing) * -1);
}
.group-last\:hidden:is(:where(.group):last-child *) {
display: none;
}
@@ -4904,6 +4944,12 @@
}
}
@media (min-width: 64rem) {
.lg\:grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
}
@container field-group (min-width: 28rem) {
.\@md\/field-group\:flex-row {
flex-direction: row;
File diff suppressed because one or more lines are too long
@@ -1,8 +1,8 @@
(globalThis.TURBOPACK_CHUNK_LISTS || (globalThis.TURBOPACK_CHUNK_LISTS = [])).push({
script: typeof document === "object" ? document.currentScript : undefined,
chunks: [
"static/chunks/Documents_go-new_chinese-family-tree_19025a8a._.js",
"static/chunks/a0629__pnpm_b8726cdb._.js"
"static/chunks/Documents_go-new_chinese-family-tree_c7dd766a._.js",
"static/chunks/a0629__pnpm_ba89b158._.js"
],
source: "dynamic"
});
@@ -1,8 +1,8 @@
(globalThis.TURBOPACK_CHUNK_LISTS || (globalThis.TURBOPACK_CHUNK_LISTS = [])).push({
script: typeof document === "object" ? document.currentScript : undefined,
chunks: [
"static/chunks/a0629__pnpm_196bb18e._.js",
"static/chunks/Documents_go-new_chinese-family-tree_72899ea7._.js"
"static/chunks/Documents_go-new_chinese-family-tree_905c8b60._.js",
"static/chunks/a0629__pnpm_359a17bb._.js"
],
source: "dynamic"
});
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -740,6 +740,10 @@
order: 9999;
}
.col-span-full {
grid-column: 1 / -1;
}
.col-start-2 {
grid-column-start: 2;
}
@@ -858,6 +862,10 @@
margin-top: auto;
}
.mr-1 {
margin-right: calc(var(--spacing) * 1);
}
.mr-2 {
margin-right: calc(var(--spacing) * 2);
}
@@ -1553,6 +1561,10 @@
scroll-padding-block: calc(var(--spacing) * 1);
}
.list-inside {
list-style-position: inside;
}
.list-disc {
list-style-type: disc;
}
@@ -1919,6 +1931,16 @@
border-color: var(--destructive);
}
.border-destructive\/20 {
border-color: var(--destructive);
}
@supports (color: color-mix(in lab, red, red)) {
.border-destructive\/20 {
border-color: color-mix(in oklab, var(--destructive) 20%, transparent);
}
}
.border-input {
border-color: var(--input);
}
@@ -2051,6 +2073,16 @@
background-color: var(--destructive);
}
.bg-destructive\/15 {
background-color: var(--destructive);
}
@supports (color: color-mix(in lab, red, red)) {
.bg-destructive\/15 {
background-color: color-mix(in oklab, var(--destructive) 15%, transparent);
}
}
.bg-foreground {
background-color: var(--foreground);
}
@@ -2291,6 +2323,10 @@
padding-block: calc(var(--spacing) * 10);
}
.py-12 {
padding-block: calc(var(--spacing) * 12);
}
.pt-0 {
padding-top: calc(var(--spacing) * 0);
}
@@ -2905,6 +2941,10 @@
--cell-size: calc(var(--spacing) * 8);
}
.slide-in-from-top-2 {
--tw-enter-translate-y: calc(2 * var(--spacing) * -1);
}
.group-last\:hidden:is(:where(.group):last-child *) {
display: none;
}
@@ -4988,6 +5028,12 @@
}
}
@media (min-width: 64rem) {
.lg\:grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
}
@container field-group (min-width: 28rem) {
.\@md\/field-group\:flex-row {
flex-direction: row;
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+2
View File
File diff suppressed because one or more lines are too long
+264 -78
View File
@@ -1,107 +1,293 @@
"use client"
import { useState } from "react"
import { useState, useMemo } from "react"
import { SiteHeader } from "@/components/site-header"
import { useFamily } from "@/context/family-context"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Search, Plus, Filter } from "lucide-react"
import { Search, Plus, Filter, X } from "lucide-react"
import Link from "next/link"
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
import { AvatarDisplay } from "@/components/ui/avatar-display"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Slider } from "@/components/ui/slider"
import { Label } from "@/components/ui/label"
import { Badge } from "@/components/ui/badge"
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
export default function MembersPage() {
const { treeData, searchResults, searchMembers } = useFamily()
const { treeData, searchMembers } = useFamily()
const [query, setQuery] = useState("")
const [showFilters, setShowFilters] = useState(false)
const displayMembers = query
? searchResults
: Object.values(treeData.members).sort(
(a, b) => a.generation - b.generation || (a.birthDate || "").localeCompare(b.birthDate || ""),
)
// Filter States
const [selectedSurname, setSelectedSurname] = useState<string>("all")
const [selectedHome, setSelectedHome] = useState<string>("all")
const [statusFilter, setStatusFilter] = useState<string>("all")
const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100])
// Derived Data
const allMembers = useMemo(() => Object.values(treeData.members), [treeData])
const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => {
const surnames = new Set<string>()
const homes = new Set<string>()
let min = 1000
let max = 0
allMembers.forEach((m) => {
if (m.surname) surnames.add(m.surname)
if (m.ancestralHome) homes.add(m.ancestralHome)
if (m.generation) {
if (m.generation < min) min = m.generation
if (m.generation > max) max = m.generation
}
})
return {
uniqueSurnames: Array.from(surnames).sort(),
uniqueHomes: Array.from(homes).sort(),
minGen: min === 1000 ? 1 : min,
maxGen: max === 0 ? 100 : max,
}
}, [allMembers])
// Initialize slider when data loads
useMemo(() => {
if (minGen !== 1000 && maxGen !== 0) {
// Only update if range is default
// This is a bit tricky, for now let's just rely on user adjustment or default wide range
// Ideally we sync this once.
}
}, [minGen, maxGen])
const filteredMembers = useMemo(() => {
let result = allMembers
// 1. Search Query
if (query) {
const lowerQuery = query.toLowerCase()
result = result.filter(
(m) =>
m.fullName.toLowerCase().includes(lowerQuery) ||
m.courtesyName?.toLowerCase().includes(lowerQuery) ||
m.artName?.toLowerCase().includes(lowerQuery),
)
}
// 2. Surname Filter
if (selectedSurname !== "all") {
result = result.filter((m) => m.surname === selectedSurname)
}
// 3. Home Filter
if (selectedHome !== "all") {
result = result.filter((m) => m.ancestralHome === selectedHome)
}
// 4. Status Filter
if (statusFilter !== "all") {
if (statusFilter === "living") {
result = result.filter((m) => !m.deathDate)
} else if (statusFilter === "deceased") {
result = result.filter((m) => !!m.deathDate)
}
}
// 5. Generation Filter
result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1])
// Sort
return result.sort((a, b) => a.generation - b.generation || (a.birthDate || "").localeCompare(b.birthDate || ""))
}, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange])
const clearFilters = () => {
setSelectedSurname("all")
setSelectedHome("all")
setStatusFilter("all")
setGenerationRange([1, 100]) // Reset to wide range
setQuery("")
}
const activeFilterCount =
(selectedSurname !== "all" ? 1 : 0) +
(selectedHome !== "all" ? 1 : 0) +
(statusFilter !== "all" ? 1 : 0) +
(generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0)
return (
<div className="min-h-screen bg-background flex flex-col font-sans">
<SiteHeader />
<main className="container mx-auto py-8 px-4 md:px-6 flex-1">
<div className="flex flex-col md:flex-row justify-between items-center mb-8 gap-4">
<h1 className="text-3xl font-serif font-bold"></h1>
<div className="flex items-center gap-2 w-full md:w-auto">
<div className="relative flex-1 md:w-80">
<Search className="absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
<Input
type="search"
placeholder="搜索姓名、字号..."
className="pl-9"
value={query}
onChange={(e) => {
setQuery(e.target.value)
searchMembers(e.target.value)
}}
/>
</div>
<Button variant="outline" size="icon">
<Filter className="h-4 w-4" />
</Button>
<Link href="/members/new">
<Button className="gap-2 bg-primary text-primary-foreground">
<Plus className="h-4 w-4" />
<div className="flex flex-col gap-6 mb-8">
<div className="flex flex-col md:flex-row justify-between items-center gap-4">
<h1 className="text-3xl font-serif font-bold"></h1>
<div className="flex items-center gap-2 w-full md:w-auto">
<div className="relative flex-1 md:w-80">
<Search className="absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
<Input
type="search"
placeholder="搜索姓名、字号..."
className="pl-9"
value={query}
onChange={(e) => setQuery(e.target.value)}
/>
</div>
<Button
variant={showFilters || activeFilterCount > 0 ? "secondary" : "outline"}
size="icon"
onClick={() => setShowFilters(!showFilters)}
className="relative"
>
<Filter className="h-4 w-4" />
{activeFilterCount > 0 && (
<span className="absolute -top-1 -right-1 h-3 w-3 rounded-full bg-primary border-2 border-background" />
)}
</Button>
</Link>
<Link href="/members/new">
<Button className="gap-2 bg-primary text-primary-foreground">
<Plus className="h-4 w-4" />
</Button>
</Link>
</div>
</div>
{/* Filter Bar */}
{showFilters && (
<div className="bg-muted/30 p-4 rounded-lg border border-border space-y-4 animate-in slide-in-from-top-2">
<div className="flex items-center justify-between">
<h3 className="font-medium text-sm text-muted-foreground"></h3>
<Button variant="ghost" size="sm" onClick={clearFilters} className="h-8 text-xs">
<X className="mr-1 h-3 w-3" />
</Button>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<div className="space-y-2">
<Label className="text-xs"> (Surname)</Label>
<Select value={selectedSurname} onValueChange={setSelectedSurname}>
<SelectTrigger>
<SelectValue placeholder="全部" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all"> (All)</SelectItem>
{uniqueSurnames.map((s) => (
<SelectItem key={s} value={s}>
{s}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label className="text-xs"> (Ancestral Home)</Label>
<Select value={selectedHome} onValueChange={setSelectedHome}>
<SelectTrigger>
<SelectValue placeholder="全部" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all"> (All)</SelectItem>
{uniqueHomes.map((h) => (
<SelectItem key={h} value={h}>
{h}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label className="text-xs"> (Status)</Label>
<Select value={statusFilter} onValueChange={setStatusFilter}>
<SelectTrigger>
<SelectValue placeholder="全部" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all"> (All)</SelectItem>
<SelectItem value="living"> (Living)</SelectItem>
<SelectItem value="deceased"> (Deceased)</SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<div className="flex justify-between">
<Label className="text-xs"> (Generation)</Label>
<span className="text-xs text-muted-foreground">
{generationRange[0]} - {generationRange[1]}
</span>
</div>
<Slider
defaultValue={[1, 100]}
value={generationRange}
min={1}
max={100} // Can be dynamic based on maxGen
step={1}
onValueChange={(val) => setGenerationRange(val as [number, number])}
className="py-4"
/>
</div>
</div>
</div>
)}
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{displayMembers.map((member) => (
<Link href={`/members/${member.id}`} key={member.id}>
<Card className="hover:border-primary transition-colors cursor-pointer h-full">
<CardContent className="p-6 flex items-start gap-4">
<AvatarDisplay
imageId={member.avatarImageId}
fallbackUrl={member.avatarUrl}
fallbackText={member.surname}
className="h-16 w-16 border-2 border-border"
/>
<div className="flex-1 min-w-0">
<div className="flex items-baseline justify-between">
<h3 className="text-xl font-bold font-serif truncate">
{member.fullName}
{member.courtesyName && (
<span className="text-sm font-normal text-muted-foreground ml-2">
{member.courtesyName}
{filteredMembers.length === 0 ? (
<div className="col-span-full text-center py-12 text-muted-foreground">
</div>
) : (
filteredMembers.map((member) => (
<Link href={`/members/${member.id}`} key={member.id}>
<Card className="hover:border-primary transition-colors cursor-pointer h-full">
<CardContent className="p-6 flex items-start gap-4">
<AvatarDisplay
imageId={member.avatarImageId}
fallbackUrl={member.avatarUrl}
fallbackText={member.surname}
className="h-16 w-16 border-2 border-border"
/>
<div className="flex-1 min-w-0">
<div className="flex items-baseline justify-between">
<h3 className="text-xl font-bold font-serif truncate">
{member.fullName}
{member.courtesyName && (
<span className="text-sm font-normal text-muted-foreground ml-2">
{member.courtesyName}
</span>
)}
</h3>
<span className="text-xs font-mono bg-muted px-1.5 py-0.5 rounded text-muted-foreground whitespace-nowrap">
{member.generation}
</span>
</div>
<p className="text-sm text-muted-foreground mt-1 truncate">
{member.generationName ? `字辈: ${member.generationName}` : "未录入字辈"}
</p>
<p className="text-sm text-muted-foreground truncate">{member.ancestralHome || "籍贯未知"}</p>
<div className="mt-3 flex flex-wrap gap-1">
{member.deathDate && (
<span className="text-[10px] bg-neutral-100 text-neutral-600 px-1.5 py-0.5 rounded border border-neutral-200">
</span>
)}
</h3>
<span className="text-xs font-mono bg-muted px-1.5 py-0.5 rounded text-muted-foreground whitespace-nowrap">
{member.generation}
</span>
{member.tags?.map((tag) => (
<span
key={tag}
className="text-[10px] bg-primary/10 text-primary px-1.5 py-0.5 rounded border border-primary/20"
>
{tag}
</span>
))}
</div>
</div>
<p className="text-sm text-muted-foreground mt-1 truncate">
{member.generationName ? `字辈: ${member.generationName}` : "未录入字辈"}
</p>
<p className="text-sm text-muted-foreground truncate">{member.ancestralHome || "籍贯未知"}</p>
<div className="mt-3 flex flex-wrap gap-1">
{member.deathDate && (
<span className="text-[10px] bg-neutral-100 text-neutral-600 px-1.5 py-0.5 rounded border border-neutral-200">
</span>
)}
{member.tags?.map((tag) => (
<span
key={tag}
className="text-[10px] bg-primary/10 text-primary px-1.5 py-0.5 rounded border border-primary/20"
>
{tag}
</span>
))}
</div>
</div>
</CardContent>
</Card>
</Link>
))}
</CardContent>
</Card>
</Link>
))
)}
</div>
</main>
</div>
+13 -8
View File
@@ -1,4 +1,5 @@
import type React from "react"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { SiteHeader } from "@/components/site-header"
@@ -18,14 +19,18 @@ export default function DashboardPage() {
<p className="text-muted-foreground mt-1">西 · 24 </p>
</div>
<div className="flex gap-2">
<Button variant="outline" className="gap-2 bg-transparent">
<Network className="h-4 w-4" />
</Button>
<Button className="gap-2 bg-primary text-primary-foreground hover:bg-primary/90">
<UserPlus className="h-4 w-4" />
</Button>
<Link href="/tree">
<Button variant="outline" className="gap-2 bg-transparent">
<Network className="h-4 w-4" />
</Button>
</Link>
<Link href="/members/new">
<Button className="gap-2 bg-primary text-primary-foreground hover:bg-primary/90">
<UserPlus className="h-4 w-4" />
</Button>
</Link>
</div>
</div>
+71 -1
View File
@@ -36,6 +36,8 @@ export function MemberForm({ initialData, existingMembers = [], onSubmit, onCanc
...initialData,
})
const [errors, setErrors] = useState<string[]>([])
const handleChange = (field: keyof FamilyMember, value: any) => {
setFormData((prev) => {
const newData = { ...prev, [field]: value }
@@ -45,6 +47,8 @@ export function MemberForm({ initialData, existingMembers = [], onSubmit, onCanc
}
return newData
})
// Clear errors when user makes changes
if (errors.length > 0) setErrors([])
}
const handleSpouseChange = (spouseId: string) => {
@@ -57,15 +61,81 @@ export function MemberForm({ initialData, existingMembers = [], onSubmit, onCanc
setFormData((prev) => ({ ...prev, spouseIds: [spouseId] }))
}
const validate = (): boolean => {
const newErrors: string[] = []
// 1. Date Validation
if (formData.birthDate && formData.deathDate) {
if (new Date(formData.birthDate) > new Date(formData.deathDate)) {
newErrors.push("出生日期不能晚于逝世日期")
}
}
// 2. Parent Age Validation
const birthYear = formData.birthDate ? new Date(formData.birthDate).getFullYear() : null
if (birthYear) {
if (formData.fatherId) {
const father = existingMembers.find((m) => m.id === formData.fatherId)
if (father?.birthDate) {
const fatherBirthYear = new Date(father.birthDate).getFullYear()
if (birthYear - fatherBirthYear < 15) {
newErrors.push(`与父亲的年龄差过小 (${birthYear - fatherBirthYear}岁),请确认`)
}
if (birthYear < fatherBirthYear) {
newErrors.push("出生日期不能早于父亲")
}
}
}
if (formData.motherId) {
const mother = existingMembers.find((m) => m.id === formData.motherId)
if (mother?.birthDate) {
const motherBirthYear = new Date(mother.birthDate).getFullYear()
if (birthYear - motherBirthYear < 15) {
newErrors.push(`与母亲的年龄差过小 (${birthYear - motherBirthYear}岁),请确认`)
}
if (birthYear < motherBirthYear) {
newErrors.push("出生日期不能早于母亲")
}
}
}
}
// 3. Generation Validation
if (formData.fatherId) {
const father = existingMembers.find((m) => m.id === formData.fatherId)
if (father && formData.generation !== father.generation + 1) {
newErrors.push(`世系错误:父亲是第 ${father.generation} 世,子女应为第 ${father.generation + 1}`)
}
}
setErrors(newErrors)
return newErrors.length === 0
}
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault()
onSubmit(formData as FamilyMember)
if (validate()) {
onSubmit(formData as FamilyMember)
}
}
const potentialRelatives = existingMembers.filter((m) => m.id !== formData.id)
return (
<form onSubmit={handleSubmit} className="space-y-8 max-w-4xl mx-auto p-6">
{errors.length > 0 && (
<div className="bg-destructive/15 text-destructive px-4 py-3 rounded-md border border-destructive/20">
<p className="font-bold mb-1"></p>
<ul className="list-disc list-inside text-sm">
{errors.map((err, index) => (
<li key={index}>{err}</li>
))}
</ul>
</div>
)}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{/* Basic Identity */}
<Card>