diff --git a/app/(admin)/(question-management)/database/[id]/_components/description-card.tsx b/app/(admin)/(question-management)/database/[id]/_components/description-card.tsx new file mode 100644 index 0000000..31aff38 --- /dev/null +++ b/app/(admin)/(question-management)/database/[id]/_components/description-card.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { CardLayout } from "@/components/card-layout"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { Remark } from "react-remark"; +import { DATABASE_DETAIL_QUERY } from "./query"; + +export function DescriptionCard({ id }: { id: string }) { + return ( + +
+ +
+
+ ); +} + +function Description({ id }: { id: string }) { + const { data } = useSuspenseQuery(DATABASE_DETAIL_QUERY, { + variables: { id }, + }); + + const database = data.database; + + if (!database.description) { + return

無描述

; + } + + return {database.description ?? ""}; +} diff --git a/app/(admin)/(question-management)/database/[id]/_components/header.tsx b/app/(admin)/(question-management)/database/[id]/_components/header.tsx index fd20a59..868c5a5 100644 --- a/app/(admin)/(question-management)/database/[id]/_components/header.tsx +++ b/app/(admin)/(question-management)/database/[id]/_components/header.tsx @@ -20,11 +20,14 @@ function HeaderMain({ id }: { id: string }) { const database = data.database; + // 只擷取第一段 description + const description = database.description?.split("\n")[0] || "此資料庫沒有描述"; + return (
); diff --git a/app/(admin)/(question-management)/database/[id]/_components/relation-card.tsx b/app/(admin)/(question-management)/database/[id]/_components/relation-card.tsx index c2b43cd..85e6bb2 100644 --- a/app/(admin)/(question-management)/database/[id]/_components/relation-card.tsx +++ b/app/(admin)/(question-management)/database/[id]/_components/relation-card.tsx @@ -5,6 +5,14 @@ import { useSuspenseQuery } from "@apollo/client/react"; import { DATABASE_DETAIL_QUERY } from "./query"; export function RelationCard({ id }: { id: string }) { + return ( + + + + ); +} + +function RelationFigure({ id }: { id: string }) { const { data } = useSuspenseQuery(DATABASE_DETAIL_QUERY, { variables: { id }, }); @@ -12,48 +20,33 @@ export function RelationCard({ id }: { id: string }) { const database = data.database; // Check if the relation figure looks like a URL (basic check) - const isUrl = database.relationFigure.startsWith("http://") || database.relationFigure.startsWith("https://"); + const isUrl = database.relationFigure.startsWith("http://") + || database.relationFigure.startsWith("https://"); - return ( - -
- {isUrl - ? ( -
-
- - 資料庫關係圖 { - e.currentTarget.style.display = "none"; - e.currentTarget.nextElementSibling?.classList.remove("hidden"); - }} - /> - -
-
- ) - : ( -
-
-              {database.relationFigure}
-              
-
- )} + if (isUrl) { + return ( + + + 資料庫關係圖 + + + ); + } -
-

- 關係圖顯示了資料庫中各表格之間的關聯性和主外鍵約束。 -

-
-
-
+ return ( +
+
+        {database.relationFigure}
+      
+
); } diff --git a/app/(admin)/(question-management)/database/[id]/_components/schema-card.tsx b/app/(admin)/(question-management)/database/[id]/_components/schema-card.tsx index c307c80..0289766 100644 --- a/app/(admin)/(question-management)/database/[id]/_components/schema-card.tsx +++ b/app/(admin)/(question-management)/database/[id]/_components/schema-card.tsx @@ -5,24 +5,11 @@ import { useSuspenseQuery } from "@apollo/client/react"; import { DATABASE_DETAIL_QUERY } from "./query"; export function SchemaCard({ id }: { id: string }) { - const { data } = useSuspenseQuery(DATABASE_DETAIL_QUERY, { - variables: { id }, - }); - - const database = data.database; - return (
-
-            {database.schema}
-          
+
@@ -34,3 +21,22 @@ export function SchemaCard({ id }: { id: string }) { ); } + +function Schema({ id }: { id: string }) { + const { data } = useSuspenseQuery(DATABASE_DETAIL_QUERY, { + variables: { id }, + }); + + const database = data.database; + + return ( +
+      {database.schema}
+    
+ ); +} diff --git a/app/(admin)/(question-management)/database/[id]/page.tsx b/app/(admin)/(question-management)/database/[id]/page.tsx index 99286c4..5621971 100644 --- a/app/(admin)/(question-management)/database/[id]/page.tsx +++ b/app/(admin)/(question-management)/database/[id]/page.tsx @@ -1,6 +1,8 @@ import { SiteHeader } from "@/components/site-header"; +import { Suspense } from "react"; import { DeleteDatabaseButtonTrigger } from "../_components/delete"; import { UpdateDatabaseButtonTrigger } from "../_components/update"; +import { DescriptionCard } from "./_components/description-card"; import { Header } from "./_components/header"; import { RelationCard } from "./_components/relation-card"; import { SchemaCard } from "./_components/schema-card"; @@ -35,8 +37,11 @@ export default async function DatabasePage({ lg:grid-cols-2 `} > - - + + + + +
diff --git a/app/(admin)/(question-management)/database/page.tsx b/app/(admin)/(question-management)/database/page.tsx index 7b8bc9d..c93c0b7 100644 --- a/app/(admin)/(question-management)/database/page.tsx +++ b/app/(admin)/(question-management)/database/page.tsx @@ -1,6 +1,4 @@ -import { DataTableSkeleton } from "@/components/data-table/skeleton"; import { SiteHeader } from "@/components/site-header"; -import { Suspense } from "react"; import { CreateDatabaseTrigger } from "./_components/create"; import { DatabaseDataTable } from "./_components/data-table"; @@ -22,9 +20,7 @@ export default function Page() {
- }> - - +
diff --git a/app/(admin)/(question-management)/questions/[id]/_components/database-card.tsx b/app/(admin)/(question-management)/questions/[id]/_components/database-card.tsx index cd5034d..680791a 100644 --- a/app/(admin)/(question-management)/questions/[id]/_components/database-card.tsx +++ b/app/(admin)/(question-management)/questions/[id]/_components/database-card.tsx @@ -14,13 +14,15 @@ export function DatabaseCard({ id }: { id: string }) { return ( -

{database.slug}

-

- {database.description}{" "} - - schema 等資訊 → - -

+
+

{database.slug}

+

+ {database.description}{" "} + + schema 等資訊 → + +

+
); } diff --git a/app/(admin)/(question-management)/questions/[id]/_components/description-card.tsx b/app/(admin)/(question-management)/questions/[id]/_components/description-card.tsx new file mode 100644 index 0000000..360a367 --- /dev/null +++ b/app/(admin)/(question-management)/questions/[id]/_components/description-card.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { CardLayout } from "@/components/card-layout"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { Remark } from "react-remark"; +import { QUESTION_DETAIL_QUERY } from "./query"; + +export function DescriptionCard({ id }: { id: string }) { + const { data } = useSuspenseQuery(QUESTION_DETAIL_QUERY, { + variables: { id }, + }); + + const question = data.question; + + return ( + +
+ {!question.description + ?

無描述

+ : {question.description}} +
+
+ ); +} diff --git a/app/(admin)/(question-management)/questions/[id]/_components/header.tsx b/app/(admin)/(question-management)/questions/[id]/_components/header.tsx index 545b42b..68f5703 100644 --- a/app/(admin)/(question-management)/questions/[id]/_components/header.tsx +++ b/app/(admin)/(question-management)/questions/[id]/_components/header.tsx @@ -28,6 +28,8 @@ function HeaderMain({ id }: { id: string }) { const question = data.question; const difficultyInfo = difficultyMap[question.difficulty as keyof typeof difficultyMap]; + const description = question.description?.split("\n")[0] || "此題目沒有描述"; + return (
@@ -35,7 +37,7 @@ function HeaderMain({ id }: { id: string }) { {question.category} {difficultyInfo.label}
-

{question.description}

+

{description}

); } diff --git a/app/(admin)/(question-management)/questions/[id]/_components/result.tsx b/app/(admin)/(question-management)/questions/[id]/_components/result.tsx index 6a5b5ee..9e18c22 100644 --- a/app/(admin)/(question-management)/questions/[id]/_components/result.tsx +++ b/app/(admin)/(question-management)/questions/[id]/_components/result.tsx @@ -4,22 +4,20 @@ import { Alert, AlertDescription } from "@/components/ui/alert"; import { Badge } from "@/components/ui/badge"; import { useQuery } from "@apollo/client/react"; import { AlertTriangle, ChevronDown, Database, Table } from "lucide-react"; -import React from "react"; import { useState } from "react"; import { QUESTION_REFERENCE_ANSWER_RESULT_QUERY } from "./query"; export function ReferenceAnswerResult({ id }: { id: string }) { const [isOpen, setIsOpen] = useState(false); - const handleToggle = () => { - if (!isOpen) { - setIsOpen(true); - } - }; - return (
-
+
{ + setIsOpen(e.currentTarget.open); + }} + > @@ -37,33 +34,21 @@ export function ReferenceAnswerResult({ id }: { id: string }) {
- +
); } -function ReferenceAnswerResultContent({ id }: { id: string }) { +function ReferenceAnswerResultContent({ id, open }: { id: string; open: boolean }) { const { data, loading, error } = useQuery(QUESTION_REFERENCE_ANSWER_RESULT_QUERY, { variables: { id }, + skip: !open, }); if (loading) { - return ( -
-
-
-
- 載入執行結果中... -
-
- ); + return null; } if (error) { diff --git a/app/(admin)/(question-management)/questions/[id]/page.tsx b/app/(admin)/(question-management)/questions/[id]/page.tsx index b6e8bf9..6bfec7f 100644 --- a/app/(admin)/(question-management)/questions/[id]/page.tsx +++ b/app/(admin)/(question-management)/questions/[id]/page.tsx @@ -1,8 +1,10 @@ import { SiteHeader } from "@/components/site-header"; +import { Suspense } from "react"; import { DeleteQuestionButtonTrigger } from "../_components/delete"; import { UpdateQuestionButtonTrigger } from "../_components/update"; import { AnswerCard } from "./_components/answer-card"; import { DatabaseCard } from "./_components/database-card"; +import { DescriptionCard } from "./_components/description-card"; import { Header } from "./_components/header"; export default async function QuestionPage({ @@ -35,8 +37,11 @@ export default async function QuestionPage({ lg:grid-cols-2 `} > - - + + + + + diff --git a/app/(admin)/(question-management)/questions/page.tsx b/app/(admin)/(question-management)/questions/page.tsx index 692fee7..a4ce027 100644 --- a/app/(admin)/(question-management)/questions/page.tsx +++ b/app/(admin)/(question-management)/questions/page.tsx @@ -1,6 +1,4 @@ -import { DataTableSkeleton } from "@/components/data-table/skeleton"; import { SiteHeader } from "@/components/site-header"; -import { Suspense } from "react"; import { CreateQuestionTrigger } from "./_components/create"; import { QuestionsDataTable } from "./_components/data-table"; @@ -22,9 +20,7 @@ export default function Page() {
- }> - - +
diff --git a/app/(admin)/(user-management)/groups/[id]/_components/audit-info-card.tsx b/app/(admin)/(user-management)/groups/[id]/_components/audit-info-card.tsx index bd38411..53957b9 100644 --- a/app/(admin)/(user-management)/groups/[id]/_components/audit-info-card.tsx +++ b/app/(admin)/(user-management)/groups/[id]/_components/audit-info-card.tsx @@ -1,21 +1,11 @@ "use client"; import { CardLayout } from "@/components/card-layout"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; import { Clock } from "lucide-react"; -import { Suspense } from "react"; import { GROUP_AUDIT_INFO_QUERY } from "./query"; export function AuditInfoCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(GROUP_AUDIT_INFO_QUERY, { variables: { id }, }); @@ -39,11 +29,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - - - - ); -} diff --git a/app/(admin)/(user-management)/groups/[id]/_components/members-card.tsx b/app/(admin)/(user-management)/groups/[id]/_components/members-card.tsx index 7ba3aea..14019c4 100644 --- a/app/(admin)/(user-management)/groups/[id]/_components/members-card.tsx +++ b/app/(admin)/(user-management)/groups/[id]/_components/members-card.tsx @@ -1,20 +1,10 @@ "use client"; import { CardLayout } from "@/components/card-layout"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; -import { Suspense } from "react"; import { GROUP_MEMBERS_QUERY } from "./query"; export function MembersCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(GROUP_MEMBERS_QUERY, { variables: { id }, }); @@ -25,11 +15,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - - - - ); -} diff --git a/app/(admin)/(user-management)/groups/[id]/_components/scope-card.tsx b/app/(admin)/(user-management)/groups/[id]/_components/scope-card.tsx index 3a81e05..e183db9 100644 --- a/app/(admin)/(user-management)/groups/[id]/_components/scope-card.tsx +++ b/app/(admin)/(user-management)/groups/[id]/_components/scope-card.tsx @@ -2,21 +2,11 @@ import { CardLayout } from "@/components/card-layout"; import { Badge } from "@/components/ui/badge"; -import { Skeleton } from "@/components/ui/skeleton"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useSuspenseQuery } from "@apollo/client/react"; -import { Suspense } from "react"; import { GROUP_SCOPES_QUERY } from "./query"; export function ScopeCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(GROUP_SCOPES_QUERY, { variables: { id }, }); @@ -54,11 +44,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - - - - ); -} diff --git a/app/(admin)/(user-management)/groups/[id]/page.tsx b/app/(admin)/(user-management)/groups/[id]/page.tsx index 2e13e36..649b5b8 100644 --- a/app/(admin)/(user-management)/groups/[id]/page.tsx +++ b/app/(admin)/(user-management)/groups/[id]/page.tsx @@ -1,4 +1,5 @@ import { SiteHeader } from "@/components/site-header"; +import { Suspense } from "react"; import { DeleteGroupButtonTrigger } from "../_components/delete"; import { UpdateGroupButtonTrigger } from "../_components/update"; import { AuditInfoCard } from "./_components/audit-info-card"; @@ -36,9 +37,11 @@ export default async function GroupPage({ lg:grid-cols-2 `} > - - - + + + + + diff --git a/app/(admin)/(user-management)/groups/page.tsx b/app/(admin)/(user-management)/groups/page.tsx index 7ad0ef2..57a491b 100644 --- a/app/(admin)/(user-management)/groups/page.tsx +++ b/app/(admin)/(user-management)/groups/page.tsx @@ -1,6 +1,4 @@ -import { DataTableSkeleton } from "@/components/data-table/skeleton"; import { SiteHeader } from "@/components/site-header"; -import { Suspense } from "react"; import { CreateGroupTrigger } from "./_components/create"; import { GroupDataTable } from "./_components/data-table"; @@ -22,9 +20,7 @@ export default function GroupsPage() {
- }> - - +
diff --git a/app/(admin)/(user-management)/scopesets/[id]/_components/groups.tsx b/app/(admin)/(user-management)/scopesets/[id]/_components/groups.tsx index 6998b47..c578e74 100644 --- a/app/(admin)/(user-management)/scopesets/[id]/_components/groups.tsx +++ b/app/(admin)/(user-management)/scopesets/[id]/_components/groups.tsx @@ -2,21 +2,11 @@ import { CardLayout } from "@/components/card-layout"; import { Badge } from "@/components/ui/badge"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; import Link from "next/link"; -import { Suspense } from "react"; import { GROUPS_WITH_SCOPE_SET_QUERY } from "./query"; export function GroupsCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(GROUPS_WITH_SCOPE_SET_QUERY); const groupWithThisScopeSet = data.groups.filter((group) => group.scopeSets?.some((scopeSet) => scopeSet.id === id)); @@ -34,13 +24,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - -
- -
-
- ); -} diff --git a/app/(admin)/(user-management)/scopesets/[id]/_components/scopes.tsx b/app/(admin)/(user-management)/scopesets/[id]/_components/scopes.tsx index 07940c0..004eb6d 100644 --- a/app/(admin)/(user-management)/scopesets/[id]/_components/scopes.tsx +++ b/app/(admin)/(user-management)/scopesets/[id]/_components/scopes.tsx @@ -2,20 +2,10 @@ import { CardLayout } from "@/components/card-layout"; import { Badge } from "@/components/ui/badge"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; -import { Suspense } from "react"; import { SCOPE_SET_SCOPES_QUERY } from "./query"; export function ScopesCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(SCOPE_SET_SCOPES_QUERY, { variables: { id }, }); @@ -32,13 +22,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - -
- -
-
- ); -} diff --git a/app/(admin)/(user-management)/scopesets/[id]/page.tsx b/app/(admin)/(user-management)/scopesets/[id]/page.tsx index 1be6504..e1255bc 100644 --- a/app/(admin)/(user-management)/scopesets/[id]/page.tsx +++ b/app/(admin)/(user-management)/scopesets/[id]/page.tsx @@ -1,4 +1,5 @@ import { SiteHeader } from "@/components/site-header"; +import { Suspense } from "react"; import { DeleteScopeSetButtonTrigger } from "../_components/delete"; import { UpdateScopeSetButtonTrigger } from "../_components/update"; import { GroupsCard } from "./_components/groups"; @@ -35,8 +36,10 @@ export default async function ScopeSetPage({ lg:grid-cols-2 `} > - - + + + + diff --git a/app/(admin)/(user-management)/scopesets/page.tsx b/app/(admin)/(user-management)/scopesets/page.tsx index efa60b4..19e0946 100644 --- a/app/(admin)/(user-management)/scopesets/page.tsx +++ b/app/(admin)/(user-management)/scopesets/page.tsx @@ -1,6 +1,4 @@ -import { DataTableSkeleton } from "@/components/data-table/skeleton"; import { SiteHeader } from "@/components/site-header"; -import { Suspense } from "react"; import { CreateScopeSetTrigger } from "./_components/create"; import { ScopeSetDataTable } from "./_components/data-table"; @@ -22,9 +20,7 @@ export default function ScopesetPage() {
- }> - - +
diff --git a/app/(admin)/(user-management)/users/[id]/_components/audit-info.tsx b/app/(admin)/(user-management)/users/[id]/_components/audit-info.tsx index 3599a92..e3c901c 100644 --- a/app/(admin)/(user-management)/users/[id]/_components/audit-info.tsx +++ b/app/(admin)/(user-management)/users/[id]/_components/audit-info.tsx @@ -1,21 +1,11 @@ "use client"; import { CardLayout } from "@/components/card-layout"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; import { Clock } from "lucide-react"; -import { Suspense } from "react"; import { USER_AUDIT_INFO_QUERY } from "./query"; export function AuditInfoCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(USER_AUDIT_INFO_QUERY, { variables: { id }, }); @@ -39,11 +29,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - - - - ); -} diff --git a/app/(admin)/(user-management)/users/[id]/_components/groups.tsx b/app/(admin)/(user-management)/users/[id]/_components/groups.tsx index 4eee8da..837f4bd 100644 --- a/app/(admin)/(user-management)/users/[id]/_components/groups.tsx +++ b/app/(admin)/(user-management)/users/[id]/_components/groups.tsx @@ -2,20 +2,10 @@ import { CardLayout } from "@/components/card-layout"; import { StyledLink } from "@/components/ui/link"; -import { Skeleton } from "@/components/ui/skeleton"; import { useSuspenseQuery } from "@apollo/client/react"; -import { Suspense } from "react"; import { USER_GROUP_QUERY } from "./query"; export function GroupsCard({ id }: { id: string }) { - return ( - }> - - - ); -} - -function CardMain({ id }: { id: string }) { const { data } = useSuspenseQuery(USER_GROUP_QUERY, { variables: { id }, }); @@ -31,11 +21,3 @@ function CardMain({ id }: { id: string }) { ); } - -function CardSkeleton() { - return ( - - - - ); -} diff --git a/app/(admin)/(user-management)/users/[id]/page.tsx b/app/(admin)/(user-management)/users/[id]/page.tsx index 14bc26f..3b2a0ca 100644 --- a/app/(admin)/(user-management)/users/[id]/page.tsx +++ b/app/(admin)/(user-management)/users/[id]/page.tsx @@ -1,4 +1,5 @@ import { SiteHeader } from "@/components/site-header"; +import { Suspense } from "react"; import { DeleteUserButtonTrigger } from "../_components/delete"; import { ImpersonateUserButtonTrigger } from "../_components/impersonate"; import { LogoutUserDevicesButtonTrigger } from "../_components/logout-devices"; @@ -44,8 +45,10 @@ export default async function UserPage({ lg:grid-cols-2 `} > - - + + + + diff --git a/app/(admin)/(user-management)/users/page.tsx b/app/(admin)/(user-management)/users/page.tsx index cb04869..cd5e14f 100644 --- a/app/(admin)/(user-management)/users/page.tsx +++ b/app/(admin)/(user-management)/users/page.tsx @@ -1,6 +1,4 @@ -import { DataTableSkeleton } from "@/components/data-table/skeleton"; import { SiteHeader } from "@/components/site-header"; -import { Suspense } from "react"; import { UsersDataTable } from "./_components/data-table"; export default function Page() { @@ -20,9 +18,7 @@ export default function Page() {
- }> - - +
diff --git a/app/globals.css b/app/globals.css index e66f2c1..f5fa11a 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,5 +1,6 @@ @import "tailwindcss"; @import "tw-animate-css"; +@plugin "@tailwindcss/typography"; @custom-variant dark (&:is(.dark *)); diff --git a/components/page-header.tsx b/components/page-header.tsx index b06ebf8..5821069 100644 --- a/components/page-header.tsx +++ b/components/page-header.tsx @@ -14,7 +14,7 @@ export function PageHeaderSkeleton({ title, description }: { title?: string; des
{title ?

{title}

: ( )} {description ?

{description}

: ( diff --git a/package.json b/package.json index 403562c..116ea2e 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", "@swc-contrib/plugin-graphql-codegen-client-preset": "^0.6.0", + "@tailwindcss/typography": "^0.5.16", "@tanstack/react-table": "^8.21.3", "babel-plugin-react-compiler": "19.1.0-rc.3", "class-variance-authority": "^0.7.1", @@ -41,6 +42,7 @@ "react": "19.2.0-canary-8a8e9a7e-20250912", "react-dom": "19.2.0-canary-8a8e9a7e-20250912", "react-hook-form": "^7.62.0", + "react-remark": "^2.1.0", "remark": "^15.0.1", "remark-html": "^16.0.1", "sonner": "^2.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2590fff..39216ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: '@swc-contrib/plugin-graphql-codegen-client-preset': specifier: ^0.6.0 version: 0.6.0 + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@4.1.13) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.2.0-canary-8a8e9a7e-20250912(react@19.2.0-canary-8a8e9a7e-20250912))(react@19.2.0-canary-8a8e9a7e-20250912) @@ -89,6 +92,9 @@ importers: react-hook-form: specifier: ^7.62.0 version: 7.62.0(react@19.2.0-canary-8a8e9a7e-20250912) + react-remark: + specifier: ^2.1.0 + version: 2.1.0(react@19.2.0-canary-8a8e9a7e-20250912) remark: specifier: ^15.0.1 version: 15.0.1 @@ -979,6 +985,10 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@mapbox/hast-util-table-cell-style@0.2.1': + resolution: {integrity: sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==} + engines: {node: '>=12'} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1662,6 +1672,11 @@ packages: '@tailwindcss/postcss@4.1.13': resolution: {integrity: sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==} + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tanstack/react-table@8.21.3': resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} engines: {node: '>=12'} @@ -1697,6 +1712,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1714,6 +1732,9 @@ packages: '@types/react@19.1.13': resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -2022,6 +2043,9 @@ packages: babel-plugin-react-compiler@19.1.0-rc.3: resolution: {integrity: sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA==} + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2087,12 +2111,21 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} @@ -2143,6 +2176,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2188,6 +2224,11 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2700,6 +2741,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-to-hyperscript@9.0.1: + resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + hast-util-sanitize@5.0.2: resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} @@ -2743,6 +2787,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -2754,6 +2801,12 @@ packages: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2776,6 +2829,10 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + is-bun-module@2.0.0: resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} @@ -2795,6 +2852,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2823,6 +2883,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} @@ -2842,6 +2905,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -3050,6 +3117,12 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3099,24 +3172,39 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@10.2.0: + resolution: {integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==} + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdn-data@2.23.0: resolution: {integrity: sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3190,6 +3278,9 @@ packages: micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} @@ -3370,6 +3461,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -3432,6 +3526,10 @@ packages: peerDependencies: postcss: ^8.0.0 + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -3453,6 +3551,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -3477,6 +3578,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-remark@2.1.0: + resolution: {integrity: sha512-7dEPxRGQ23sOdvteuRGaQAs9cEOH/BOeCN4CqsJdk3laUDIDYRCWnM6a3z92PzXHUuxIRLXQNZx7SiO0ijUcbw==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.8' + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -3522,6 +3629,9 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + rehype-react@6.2.1: + resolution: {integrity: sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==} + relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} @@ -3531,6 +3641,12 @@ packages: remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + + remark-rehype@8.1.0: + resolution: {integrity: sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -3699,6 +3815,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -3765,6 +3884,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3840,6 +3962,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -3919,18 +4044,51 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unist-builder@2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + + unist-util-generated@1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + + unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-position@3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -3984,12 +4142,24 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + web-namespaces@1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -4053,6 +4223,10 @@ packages: utf-8-validate: optional: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5086,6 +5260,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mapbox/hast-util-table-cell-style@0.2.1': + dependencies: + unist-util-visit: 1.4.1 + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 @@ -5697,6 +5875,14 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.13 + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.13)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.13 + '@tanstack/react-table@8.21.3(react-dom@19.2.0-canary-8a8e9a7e-20250912(react@19.2.0-canary-8a8e9a7e-20250912))(react@19.2.0-canary-8a8e9a7e-20250912)': dependencies: '@tanstack/table-core': 8.21.3 @@ -5734,6 +5920,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5752,6 +5942,8 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/unist@2.0.11': {} + '@types/unist@3.0.3': {} '@types/ws@8.18.1': @@ -6077,6 +6269,8 @@ snapshots: dependencies: '@babel/types': 7.28.2 + bail@1.0.5: {} + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -6174,10 +6368,16 @@ snapshots: character-entities-html4@2.1.0: {} + character-entities-legacy@1.1.4: {} + character-entities-legacy@3.0.0: {} + character-entities@1.2.4: {} + character-entities@2.0.2: {} + character-reference-invalid@1.1.4: {} + chardet@2.1.0: {} chownr@3.0.0: {} @@ -6227,6 +6427,8 @@ snapshots: colorette@2.0.20: {} + comma-separated-tokens@1.0.8: {} + comma-separated-tokens@2.0.3: {} common-tags@1.8.2: {} @@ -6275,6 +6477,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cssesc@3.0.0: {} + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -6937,6 +7141,16 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-to-hyperscript@9.0.1: + dependencies: + '@types/unist': 2.0.11 + comma-separated-tokens: 1.0.8 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + style-to-object: 0.3.0 + unist-util-is: 4.1.0 + web-namespaces: 1.1.4 + hast-util-sanitize@5.0.2: dependencies: '@types/hast': 3.0.4 @@ -6987,6 +7201,8 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.1.1: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -7002,6 +7218,13 @@ snapshots: is-relative: 1.0.0 is-windows: 1.0.2 + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -7030,6 +7253,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-buffer@2.0.5: {} + is-bun-module@2.0.0: dependencies: semver: 7.7.2 @@ -7051,6 +7276,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@1.0.4: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -7076,6 +7303,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@1.0.4: {} + is-lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -7091,6 +7320,8 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} is-regex@1.2.1: @@ -7276,6 +7507,10 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} @@ -7325,6 +7560,20 @@ snapshots: math-intrinsics@1.1.0: {} + mdast-util-definitions@4.0.0: + dependencies: + unist-util-visit: 2.0.3 + + mdast-util-from-markdown@0.8.5: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -7347,6 +7596,17 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 + mdast-util-to-hast@10.2.0: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + mdast-util-definitions: 4.0.0 + mdurl: 1.0.1 + unist-builder: 2.0.3 + unist-util-generated: 1.1.6 + unist-util-position: 3.1.0 + unist-util-visit: 2.0.3 + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -7371,12 +7631,16 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@2.0.0: {} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 mdn-data@2.23.0: {} + mdurl@1.0.1: {} + merge2@1.4.1: {} meros@1.3.1(@types/node@24.4.0): @@ -7494,6 +7758,13 @@ snapshots: micromark-util-types@2.0.2: {} + micromark@2.11.4: + dependencies: + debug: 4.4.1 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 @@ -7694,6 +7965,15 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + parse-filepath@1.0.2: dependencies: is-absolute: 1.0.0 @@ -7748,6 +8028,11 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.10 + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -7774,6 +8059,10 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + property-information@7.1.0: {} punycode@2.3.1: {} @@ -7791,6 +8080,16 @@ snapshots: react-is@16.13.1: {} + react-remark@2.1.0(react@19.2.0-canary-8a8e9a7e-20250912): + dependencies: + react: 19.2.0-canary-8a8e9a7e-20250912 + rehype-react: 6.2.1 + remark-parse: 9.0.0 + remark-rehype: 8.1.0 + unified: 9.2.2 + transitivePeerDependencies: + - supports-color + react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.2.0-canary-8a8e9a7e-20250912): dependencies: react: 19.2.0-canary-8a8e9a7e-20250912 @@ -7844,6 +8143,11 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + rehype-react@6.2.1: + dependencies: + '@mapbox/hast-util-table-cell-style': 0.2.1 + hast-to-hyperscript: 9.0.1 + relay-runtime@12.0.0: dependencies: '@babel/runtime': 7.28.4 @@ -7869,6 +8173,16 @@ snapshots: transitivePeerDependencies: - supports-color + remark-parse@9.0.0: + dependencies: + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@8.1.0: + dependencies: + mdast-util-to-hast: 10.2.0 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -8083,6 +8397,8 @@ snapshots: source-map-js@1.2.1: {} + space-separated-tokens@1.1.5: {} + space-separated-tokens@2.0.2: {} sponge-case@1.0.1: @@ -8177,6 +8493,10 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-object@0.3.0: + dependencies: + inline-style-parser: 0.1.1 + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.2.0-canary-8a8e9a7e-20250912): dependencies: client-only: 0.0.1 @@ -8242,6 +8562,8 @@ snapshots: trim-lines@3.0.1: {} + trough@1.0.5: {} + trough@2.2.0: {} ts-api-utils@2.1.0(typescript@5.9.2): @@ -8340,23 +8662,66 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unified@9.2.2: + dependencies: + '@types/unist': 2.0.11 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + + unist-builder@2.0.3: {} + + unist-util-generated@1.1.6: {} + + unist-util-is@3.0.0: {} + + unist-util-is@4.1.0: {} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-position@3.1.0: {} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-visit-parents@2.1.2: + dependencies: + unist-util-is: 3.0.0 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit@1.4.1: + dependencies: + unist-util-visit-parents: 2.1.2 + + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -8430,16 +8795,32 @@ snapshots: dependencies: react: 19.2.0-canary-8a8e9a7e-20250912 + util-deprecate@1.0.2: {} + + vfile-message@2.0.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position: 2.0.3 + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 + vfile@4.2.1: + dependencies: + '@types/unist': 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + vfile@6.0.3: dependencies: '@types/unist': 3.0.3 vfile-message: 4.0.3 + web-namespaces@1.1.4: {} + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -8518,6 +8899,8 @@ snapshots: ws@8.18.3: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {}