diff --git a/app/(app)/challenges/[id]/_components/header/index.tsx b/app/(app)/challenges/[id]/_components/header/index.tsx new file mode 100644 index 0000000..2835939 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/header/index.tsx @@ -0,0 +1,43 @@ +"use client"; + +import DifficultyBadge from "@/components/question/difficulty-badge"; +import SolvedStatusBadge from "@/components/question/solved-status-badge"; +import { Badge } from "@/components/ui/badge"; +import { graphql } from "@/gql"; +import { getQuestionSolvedStatus } from "@/lib/solved-status"; +import { useSuspenseQuery } from "@apollo/client/react"; + +export const QUESTION_HEADER = graphql(` + query QuestionHeader($id: ID!) { + question(id: $id) { + id + title + difficulty + category + + ...QuestionSolvedStatus + } + } +`); + +export default function Header({ id }: { id: string }) { + const { data } = useSuspenseQuery(QUESTION_HEADER, { variables: { id } }); + const { title, difficulty, category } = data.question; + + const solvedStatus = getQuestionSolvedStatus(data.question); + + return ( +
+ {/* Header */} +
+
{title}
+
+
+ {category} + + +
+
+
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/header/skeleton.tsx b/app/(app)/challenges/[id]/_components/header/skeleton.tsx new file mode 100644 index 0000000..4c7be98 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/header/skeleton.tsx @@ -0,0 +1,11 @@ +import { Skeleton } from "@/components/ui/skeleton"; + +export default function HeaderSkeleton() { + return ( +
+ +
+ +
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/ide/compare-answer.tsx b/app/(app)/challenges/[id]/_components/ide/compare-answer.tsx new file mode 100644 index 0000000..0bb2c63 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/compare-answer.tsx @@ -0,0 +1,150 @@ +"use client"; + +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { graphql } from "@/gql"; +import { SubmissionStatus } from "@/gql/graphql"; +import { compareCSV, tableToCSV } from "@/lib/csv-utils"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { EditorState, EditorView } from "@uiw/react-codemirror"; +import { AlertCircle, CheckCircle, Pencil, XCircle } from "lucide-react"; +import CodeMirrorMerge from "react-codemirror-merge"; + +export interface CompareAnswerProps { + id: string; +} + +export const COMPARE_ANSWER_QUERY = graphql(` + query CompareAnswer($id: ID!) { + question(id: $id) { + id + referenceAnswerResult { + columns + rows + } + lastSubmission { + id + status + queryResult { + columns + rows + } + error + } + } + } +`); + +const Original = CodeMirrorMerge.Original; +const Modified = CodeMirrorMerge.Modified; + +export default function CompareAnswer({ id }: CompareAnswerProps) { + const { data } = useSuspenseQuery(COMPARE_ANSWER_QUERY, { + variables: { id }, + fetchPolicy: "cache-and-network", + }); + + const { referenceAnswerResult, lastSubmission } = data.question; + + // 如果沒有提交答案 + if (!lastSubmission) { + return ( + + + 您尚未提交答案 + + 在左邊的 SQL 編輯器送出你的答案後,你就能在這邊看到與正確答案的比較。 + + + ); + } + + // 如果有語法錯誤 + if (lastSubmission.error) { + return ( + + + 無法比較答案 + + 您的 SQL 查詢有語法錯誤,請先修正錯誤後再進行比較。 + + + ); + } + + // 如果沒有查詢結果 + if (!lastSubmission.queryResult) { + return ( + + + 無法比較答案 + + 您的查詢沒有回傳結果,無法進行比較。 + + + ); + } + + // 轉換為 CSV 格式 + const correctAnswerCSV = tableToCSV( + referenceAnswerResult.columns, + referenceAnswerResult.rows, + ); + + const myAnswerCSV = tableToCSV( + lastSubmission.queryResult.columns, + lastSubmission.queryResult.rows, + ); + + // 如果答案正確,顯示成功訊息 + if ( + lastSubmission.status === SubmissionStatus.Success + || compareCSV(correctAnswerCSV, myAnswerCSV) + ) { + return ( + + + 答案正確 + + 恭喜!您的查詢結果與正確答案完全一致。 + + + ); + } + + // 顯示比較界面 + return ( +
+ + + 答案不正確 + + 您的查詢結果與正確答案不符,請查看下方的比較結果。 + + + +
+

+ 答案比較 (左側:正確答案,右側:您的答案) +

+
+ + + + +
+
+
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/ide/correct-answer.tsx b/app/(app)/challenges/[id]/_components/ide/correct-answer.tsx new file mode 100644 index 0000000..aee1752 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/correct-answer.tsx @@ -0,0 +1,28 @@ +import AnswerTable from "@/components/answer/table"; +import { graphql } from "@/gql"; +import { useSuspenseQuery } from "@apollo/client/react"; + +export interface CorrectAnswerProps { + id: string; +} + +const CORRECT_ANSWER_QUERY = graphql(` + query CorrectAnswer($id: ID!) { + question(id: $id) { + id + referenceAnswerResult { + columns + rows + } + } + } +`); + +export default function CorrectAnswer({ id }: CorrectAnswerProps) { + const { data } = useSuspenseQuery(CORRECT_ANSWER_QUERY, { + variables: { id }, + }); + const { columns, rows } = data.question.referenceAnswerResult; + + return ; +} diff --git a/app/(app)/challenges/[id]/_components/ide/description.tsx b/app/(app)/challenges/[id]/_components/ide/description.tsx new file mode 100644 index 0000000..5bc2098 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/description.tsx @@ -0,0 +1,25 @@ +import { graphql } from "@/gql"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { Remark } from "react-remark"; + +const QUESTION_DESCRIPTION = graphql(` + query QuestionDescription($id: ID!) { + question(id: $id) { + id + description + } + } +`); + +export default function QuestionDescription({ id }: { id: string }) { + const { data } = useSuspenseQuery(QUESTION_DESCRIPTION, { + variables: { id }, + }); + const { description } = data.question; + + return ( +
+ {description} +
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/ide/index.tsx b/app/(app)/challenges/[id]/_components/ide/index.tsx new file mode 100644 index 0000000..cab0c55 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/index.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { Skeleton } from "@/components/ui/skeleton"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { graphql } from "@/gql"; +import { useMutation } from "@apollo/client/react"; +import { Suspense, useState } from "react"; +import { toast } from "sonner"; +import { QUESTION_HEADER } from "../header"; +import CompareAnswer, { COMPARE_ANSWER_QUERY } from "./compare-answer"; +import CorrectAnswer from "./correct-answer"; +import QuestionDescription from "./description"; +import MyAnswer, { MY_ANSWER } from "./my-answer"; +import { SQLEditor } from "./sql-editor"; +import SubmissionHistory, { SUBMISSION_HISTORY } from "./submission-history"; + +export interface PracticeIDEProps { + id: string; +} + +const SUBMIT_ANSWER = graphql(` + mutation SubmitAnswer($id: ID!, $answer: String!) { + submitAnswer(id: $id, answer: $answer) { + error + } + } +`); + +export default function PracticeIDE({ id }: PracticeIDEProps) { + const [activeTab, setActiveTab] = useState("my-answer"); + const [disabled, setDisabled] = useState(false); + const [submitAnswer] = useMutation(SUBMIT_ANSWER, { + refetchQueries: getRefetchQueries(activeTab), + onCompleted(data) { + toast.success("答案送出成功", { + description: data.submitAnswer.error ? "不過答案可能有語法錯誤,請到「我的答案」查看。" : undefined, + }); + }, + onError(error) { + toast.error("無法送出答案", { + description: error.message, + }); + }, + }); + + const handleSubmit = async (answer: string) => { + const loading = toast.loading("正在送出答案"); + await submitAnswer({ + variables: { + id, + answer, + }, + }); + toast.dismiss(loading); + }; + + return ( +
+ {/* Left */} +
+ }> + {/* Description */} + + + {/* SQL Editor */} + { + toast.info("hint", { + description: hint, + }); + + setDisabled(true); + setTimeout(() => { + setDisabled(false); + }, 1000); + }} + /> + +
+ + {/* Answer Tabs */} + { + setActiveTab(value); + }} + > + + 我的答案 + 正確答案 + 比較答案 + 提交記錄 + + + }> + + + + + }> + + + + + }> + + + + + }> + + + + +
+ ); +} + +function getRefetchQueries(activeTab: string) { + const baseQueries = [QUESTION_HEADER]; + + switch (activeTab) { + case "my-answer": + return [MY_ANSWER, ...baseQueries]; + case "correct-answer": + return baseQueries; + case "compare-answer": + return [COMPARE_ANSWER_QUERY, ...baseQueries]; + case "submission-history": + return [SUBMISSION_HISTORY, ...baseQueries]; + default: + return baseQueries; + } +} diff --git a/app/(app)/challenges/[id]/_components/ide/my-answer.tsx b/app/(app)/challenges/[id]/_components/ide/my-answer.tsx new file mode 100644 index 0000000..34bb161 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/my-answer.tsx @@ -0,0 +1,90 @@ +import AnswerTable from "@/components/answer/table"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { graphql } from "@/gql"; +import { SubmissionStatus } from "@/gql/graphql"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { AlertCircle, CheckCircle, Pencil, XCircle } from "lucide-react"; + +export interface MyAnswerProps { + id: string; +} + +export const MY_ANSWER = graphql(` + query MyAnswer($id: ID!) { + question(id: $id) { + id + lastSubmission { + id + status + queryResult { + columns + rows + } + error + } + } + } +`); + +export default function MyAnswer({ id }: MyAnswerProps) { + const { data } = useSuspenseQuery(MY_ANSWER, { + variables: { id }, + fetchPolicy: "cache-and-network", + }); + + if (!data.question.lastSubmission) { + return ( + + + 您尚未提交答案 + + 在左邊的 SQL 編輯器送出你的答案後,你就能在這邊看到查詢結果。 + + + ); + } + + if (data.question.lastSubmission.error) { + const { error } = data.question.lastSubmission; + return ( + + + 您的答案有語法錯誤 + {error} + + ); + } + + return ( +
+ {data.question.lastSubmission.status === SubmissionStatus.Success + ? ( + + + 答案正確 + + 恭喜!您的 SQL 查詢已成功執行並返回正確結果。 + + + ) + : ( + + + 答案錯誤 + + 您的查詢結果與預期答案不符,請檢查您的 SQL 語句。 + + + )} + + {data.question.lastSubmission.queryResult + ? ( + + ) + :

無查詢結果

} +
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/ide/sql-editor.tsx b/app/(app)/challenges/[id]/_components/ide/sql-editor.tsx new file mode 100644 index 0000000..83d01ea --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/sql-editor.tsx @@ -0,0 +1,48 @@ +import { graphql } from "@/gql"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { AutocompletedSQLEditor } from "../sql-editor"; + +const SQL_EDITOR_CONTEXT = graphql(` + query SqlEditorContext($id: ID!) { + question(id: $id) { + id + database { + id + ...DatabaseStructure + } + lastSubmission { + id + submittedCode + } + } + } +`); + +interface SQLEditorProps { + id: string; + disabled: boolean; + onSubmit: (value: string) => void; + onHint: (value: string) => void; +} + +export function SQLEditor({ + id, + disabled, + onSubmit, + onHint, +}: SQLEditorProps) { + const { data } = useSuspenseQuery(SQL_EDITOR_CONTEXT, { + variables: { id }, + }); + const { database, lastSubmission } = data.question; + + return ( + + ); +} diff --git a/app/(app)/challenges/[id]/_components/ide/submission-history.tsx b/app/(app)/challenges/[id]/_components/ide/submission-history.tsx new file mode 100644 index 0000000..2deb474 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/ide/submission-history.tsx @@ -0,0 +1,158 @@ +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { graphql } from "@/gql"; +import { SubmissionStatus } from "@/gql/graphql"; +import { useSuspenseQuery } from "@apollo/client/react"; +import { ChevronDown, ChevronRight, Pencil } from "lucide-react"; +import { useState } from "react"; + +export const SUBMISSION_HISTORY = graphql(` + query SubmissionHistory($id: ID!) { + question(id: $id) { + id + userSubmissions { + id + status + submittedCode + submittedAt + } + } + } +`); + +interface SubmissionHistoryProps { + id: string; +} + +function formatDate(dateString: string) { + const date = new Date(dateString); + return date.toLocaleString("zh-TW", { + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }); +} + +function CodePreview({ + code, + maxLength = 100, +}: { + code: string; + maxLength?: number; +}) { + const [expanded, setExpanded] = useState(false); + const shouldTruncate = code.length > maxLength; + const displayCode = expanded || !shouldTruncate ? code : code.slice(0, maxLength) + "..."; + + return ( +
+
+        {displayCode}
+      
+ {shouldTruncate && ( + + )} +
+ ); +} + +export default function SubmissionHistory({ id }: SubmissionHistoryProps) { + const { data } = useSuspenseQuery(SUBMISSION_HISTORY, { + variables: { id }, + fetchPolicy: "cache-and-network", + }); + + const submissions = data?.question?.userSubmissions || []; + + if (submissions.length === 0) { + return ( + + + 尚無提交記錄 + + 完成第一次提交後,您的記錄將會顯示在這裡 + + + ); + } + + return ( +
+ + + + 狀態 + 提交時間 + 程式碼 + + + + {submissions.map((submission) => ( + + + + + + {formatDate(submission.submittedAt)} + + + + + + ))} + +
+
+ ); +} + +function StatusBadge({ status }: { status: SubmissionStatus }) { + switch (status) { + case SubmissionStatus.Success: + return ( + + 通過 + + ); + case SubmissionStatus.Failed: + return 錯誤; + case SubmissionStatus.Pending: + return 執行中; + default: + return {status}; + } +} diff --git a/app/(app)/challenges/[id]/_components/sql-editor/editor.tsx b/app/(app)/challenges/[id]/_components/sql-editor/editor.tsx new file mode 100644 index 0000000..4c70d09 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/sql-editor/editor.tsx @@ -0,0 +1,95 @@ +import { Button } from "@/components/ui/button"; +import { sql, SQLite } from "@codemirror/lang-sql"; +import CodeMirror, { type ReactCodeMirrorRef } from "@uiw/react-codemirror"; +import { Code, Lightbulb, Play } from "lucide-react"; +import { useRef } from "react"; +import { toast } from "sonner"; + +export interface SQLEditorProps { + disabled?: boolean; + onSubmit?: (value: string) => void; + onHint?: (value: string) => void; + schema?: Record; + defaultValue?: string; +} + +export default function SQLEditor({ + onSubmit, + onHint, + schema, + disabled, + defaultValue, +}: SQLEditorProps) { + const codeMirrorRef = useRef(null); + + const handleSubmit = () => { + onSubmit?.(codeMirrorRef.current?.view?.state?.doc.toString() ?? ""); + }; + + const handleHint = () => { + onHint?.(codeMirrorRef.current?.view?.state?.doc.toString() ?? ""); + }; + + const handleFormat = async () => { + const { formatDialect, sqlite: formatterSqlite } = await import( + "sql-formatter" + ); + + const currentCode = codeMirrorRef.current?.view?.state.doc.toString() ?? ""; + const formattedCode = formatDialect(currentCode, { + dialect: formatterSqlite, + }); + + codeMirrorRef.current?.view?.dispatch({ + changes: { from: 0, to: currentCode.length, insert: formattedCode }, + }); + + toast.success("成功格式化 SQL 程式碼"); + }; + + return ( +
+ + +
+
+ + + +
+ + +
+
+ ); +} diff --git a/app/(app)/challenges/[id]/_components/sql-editor/index.tsx b/app/(app)/challenges/[id]/_components/sql-editor/index.tsx new file mode 100644 index 0000000..bdeb1b4 --- /dev/null +++ b/app/(app)/challenges/[id]/_components/sql-editor/index.tsx @@ -0,0 +1,31 @@ +import { type FragmentType, graphql, readFragment } from "@/gql"; +import SQLEditor, { type SQLEditorProps } from "./editor"; + +export interface AutocompletedSQLEditorProps extends Omit { + structureFragment: FragmentType; +} + +const DATABASE_STRUCTURE = graphql(` + fragment DatabaseStructure on Database { + id + structure { + tables { + columns + name + } + } + } +`); + +export function AutocompletedSQLEditor({ + structureFragment, + ...sqlEditorProps +}: AutocompletedSQLEditorProps) { + const structure = readFragment(DATABASE_STRUCTURE, structureFragment); + const schema = structure.structure.tables.reduce((acc, table) => { + acc[table.name] = table.columns; + return acc; + }, {} as Record); + + return ; +} diff --git a/app/(app)/challenges/[id]/page.tsx b/app/(app)/challenges/[id]/page.tsx index b2a9141..3b31b31 100644 --- a/app/(app)/challenges/[id]/page.tsx +++ b/app/(app)/challenges/[id]/page.tsx @@ -1,9 +1,29 @@ import type { Metadata } from "next"; +import { Suspense } from "react"; +import Header from "./_components/header"; +import HeaderSkeleton from "./_components/header/skeleton"; +import PracticeIDE from "./_components/ide"; export const metadata: Metadata = { title: "挑戰題目", }; -export default function ChallengePage(/* _props: { params: Promise<{ id: string }> } */) { - return
ChallengePage
; +export default async function ChallengePage({ + params, +}: { + params: Promise<{ id: string }>; +}) { + const { id } = await params; + + return ( +
+ }> +
+ + + + + +
+ ); } diff --git a/app/(app)/challenges/_filter/index.tsx b/app/(app)/challenges/_components/filter/index.tsx similarity index 100% rename from app/(app)/challenges/_filter/index.tsx rename to app/(app)/challenges/_components/filter/index.tsx diff --git a/app/(app)/challenges/_filter/search.tsx b/app/(app)/challenges/_components/filter/search.tsx similarity index 100% rename from app/(app)/challenges/_filter/search.tsx rename to app/(app)/challenges/_components/filter/search.tsx diff --git a/app/(app)/challenges/_filter/tag.tsx b/app/(app)/challenges/_components/filter/tag.tsx similarity index 90% rename from app/(app)/challenges/_filter/tag.tsx rename to app/(app)/challenges/_components/filter/tag.tsx index 96cf81e..da64387 100644 --- a/app/(app)/challenges/_filter/tag.tsx +++ b/app/(app)/challenges/_components/filter/tag.tsx @@ -1,12 +1,14 @@ +import { difficultyTranslation } from "@/components/question/difficulty-badge"; +import { solvedStatusTranslation } from "@/components/question/solved-status-badge"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { QuestionDifficulty } from "@/gql/graphql"; +import type { SolvedStatus } from "@/lib/solved-status"; import { FilterIcon } from "lucide-react"; -import { type Difficulty, difficultyTranslation, type SolvedStatus, solvedStatusTranslation } from "../model"; export interface TagState { solvedStatus: SolvedStatus[]; - difficulty: Difficulty[]; + difficulty: QuestionDifficulty[]; } export interface TagFilterSectionProps { @@ -22,11 +24,11 @@ export default function TagFilterSection({ return value.solvedStatus.includes(solvedStatus); }; - const getDifficulty = (difficulty: Difficulty) => { + const getDifficulty = (difficulty: QuestionDifficulty) => { return value.difficulty.includes(difficulty); }; - const handleDifficultyChange = (difficulty: Difficulty) => { + const handleDifficultyChange = (difficulty: QuestionDifficulty) => { return (checked: boolean) => { onChange({ ...value, diff --git a/app/(app)/challenges/_header/index.tsx b/app/(app)/challenges/_components/header/index.tsx similarity index 100% rename from app/(app)/challenges/_header/index.tsx rename to app/(app)/challenges/_components/header/index.tsx diff --git a/app/(app)/challenges/_header/skeleton.tsx b/app/(app)/challenges/_components/header/skeleton.tsx similarity index 100% rename from app/(app)/challenges/_header/skeleton.tsx rename to app/(app)/challenges/_components/header/skeleton.tsx diff --git a/app/(app)/challenges/content.tsx b/app/(app)/challenges/_components/questions-list.tsx similarity index 83% rename from app/(app)/challenges/content.tsx rename to app/(app)/challenges/_components/questions-list.tsx index 8947079..fc8c024 100644 --- a/app/(app)/challenges/content.tsx +++ b/app/(app)/challenges/_components/questions-list.tsx @@ -2,17 +2,16 @@ import { useDebouncedValue } from "foxact/use-debounced-value"; import { Suspense, useState } from "react"; -import type { TagState } from "./_filter/tag"; +import type { TagState } from "./filter/tag"; +import QuestionCard from "@/components/question/question-card"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { graphql } from "@/gql"; import { QuestionDifficulty, type QuestionWhereInput } from "@/gql/graphql"; +import { getQuestionSolvedStatus, type SolvedStatus } from "@/lib/solved-status"; import { useSuspenseQuery } from "@apollo/client/react"; -import FilterSection from "./_filter"; -import QuestionCard from "./_question"; -import { getQuestionSolvedStatus } from "./_question/solved-status"; -import type { SolvedStatus } from "./model"; +import FilterSection from "./filter"; export const LIST_QUESTIONS = graphql(` query ListQuestions($where: QuestionWhereInput, $after: Cursor) { @@ -32,7 +31,7 @@ export const LIST_QUESTIONS = graphql(` } `); -export default function ChallengePageContent() { +export default function QuestionsList() { const [search, setSearch] = useState(""); const [tags, setTags] = useState({ solvedStatus: ["solved", "unsolved", "not-tried"], @@ -47,18 +46,20 @@ export default function ChallengePageContent() { const deferredSearch = useDebouncedValue(search, 200); const where: QuestionWhereInput = { - or: [ - { - titleContainsFold: deferredSearch, - }, - { - descriptionContainsFold: deferredSearch, - }, - { - categoryContainsFold: deferredSearch, - }, - ], - difficultyIn: tags.difficulty, + or: deferredSearch + ? [ + { + titleContainsFold: deferredSearch, + }, + { + descriptionContainsFold: deferredSearch, + }, + { + categoryContainsFold: deferredSearch, + }, + ] + : undefined, + difficultyIn: tags.difficulty.length > 0 ? tags.difficulty : undefined, }; return ( diff --git a/app/(app)/challenges/model.ts b/app/(app)/challenges/model.ts deleted file mode 100644 index 925e14e..0000000 --- a/app/(app)/challenges/model.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { QuestionDifficulty } from "@/gql/graphql"; - -/** - * 解題狀態 - */ -export type SolvedStatus = "solved" | "unsolved" | "not-tried"; - -/** - * 難度 - */ -export type Difficulty = QuestionDifficulty; - -export const solvedStatusTranslation: Record = { - solved: "✅ 已經解決", - unsolved: "尚未解決", - "not-tried": "還沒嘗試", -}; - -export const difficultyTranslation: Record = { - [QuestionDifficulty.Easy]: "簡單", - [QuestionDifficulty.Medium]: "中等", - [QuestionDifficulty.Hard]: "困難", - [QuestionDifficulty.Unspecified]: "未指定", -}; diff --git a/app/(app)/challenges/page.tsx b/app/(app)/challenges/page.tsx index c416b3f..ad1b3b6 100644 --- a/app/(app)/challenges/page.tsx +++ b/app/(app)/challenges/page.tsx @@ -1,8 +1,8 @@ import type { Metadata } from "next"; import { Suspense } from "react"; -import Header from "./_header"; -import HeaderSkeleton from "./_header/skeleton"; -import ChallengePageContent from "./content"; +import Header from "./_components/header"; +import HeaderSkeleton from "./_components/header/skeleton"; +import QuestionsList from "./_components/questions-list"; export const metadata: Metadata = { title: "挑戰題目", @@ -15,7 +15,7 @@ export default function ChallengesPage() {
- + ); } diff --git a/app/(app)/statistics/board/completed-questions.tsx b/app/(app)/statistics/_components/board/completed-questions.tsx similarity index 100% rename from app/(app)/statistics/board/completed-questions.tsx rename to app/(app)/statistics/_components/board/completed-questions.tsx diff --git a/app/(app)/statistics/board/index.tsx b/app/(app)/statistics/_components/board/index.tsx similarity index 100% rename from app/(app)/statistics/board/index.tsx rename to app/(app)/statistics/_components/board/index.tsx diff --git a/app/(app)/statistics/statistics/points.tsx b/app/(app)/statistics/_components/statistics/points.tsx similarity index 100% rename from app/(app)/statistics/statistics/points.tsx rename to app/(app)/statistics/_components/statistics/points.tsx diff --git a/app/(app)/statistics/statistics/resolved-questions.tsx b/app/(app)/statistics/_components/statistics/resolved-questions.tsx similarity index 100% rename from app/(app)/statistics/statistics/resolved-questions.tsx rename to app/(app)/statistics/_components/statistics/resolved-questions.tsx diff --git a/app/(app)/statistics/page.tsx b/app/(app)/statistics/page.tsx index 91c238a..3b99410 100644 --- a/app/(app)/statistics/page.tsx +++ b/app/(app)/statistics/page.tsx @@ -2,9 +2,9 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Pickaxe } from "lucide-react"; import type { Metadata } from "next"; import { Suspense } from "react"; -import Board from "./board"; -import Points from "./statistics/points"; -import ResolvedQuestions from "./statistics/resolved-questions"; +import Board from "./_components/board"; +import Points from "./_components/statistics/points"; +import ResolvedQuestions from "./_components/statistics/resolved-questions"; export const metadata: Metadata = { title: "統計資料", @@ -33,7 +33,14 @@ export default function StatisticsPage() {
-

攻克歷史

+

點數

+ + + +
+ +
+

排行榜

@@ -43,13 +50,6 @@ export default function StatisticsPage() {
- -
-

點數

- - - -
); diff --git a/components/answer/table.tsx b/components/answer/table.tsx new file mode 100644 index 0000000..3ead464 --- /dev/null +++ b/components/answer/table.tsx @@ -0,0 +1,38 @@ +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../ui/table"; + +export interface AnswerTableProps { + columns: string[]; + rows: string[][]; +} + +export default function AnswerTable({ columns, rows }: AnswerTableProps) { + return ( + + + + {columns.map((column) => {column})} + + + + + {rows.length > 0 + ? rows.map((row, rowIndex) => ( + + {row.map((cell, cellIndex) => ( + + {cell} + + ))} + + )) + : ( + + +

查詢沒有回傳任何資料列

+
+
+ )} +
+
+ ); +} diff --git a/components/app-navbar.tsx b/components/app-navbar.tsx index 7ae54cd..4409f36 100644 --- a/components/app-navbar.tsx +++ b/components/app-navbar.tsx @@ -22,7 +22,6 @@ function NavItem({ icon, label, active = false }: NavItemProps) { className={cn( ` flex h-auto w-full items-center justify-start gap-3 rounded px-3 py-2 - text-sm md:w-auto md:justify-center `, active && "bg-primary text-primary-foreground", diff --git a/components/question/difficulty-badge.tsx b/components/question/difficulty-badge.tsx new file mode 100644 index 0000000..d729e77 --- /dev/null +++ b/components/question/difficulty-badge.tsx @@ -0,0 +1,28 @@ +import { QuestionDifficulty } from "@/gql/graphql"; +import { Badge } from "../ui/badge"; + +const badgeColor: Record = { + [QuestionDifficulty.Easy]: "bg-green-800", + [QuestionDifficulty.Medium]: "bg-yellow-800", + [QuestionDifficulty.Hard]: "bg-red-800", + [QuestionDifficulty.Unspecified]: "bg-gray-800", +}; + +export const difficultyTranslation: Record = { + [QuestionDifficulty.Easy]: "簡單", + [QuestionDifficulty.Medium]: "中等", + [QuestionDifficulty.Hard]: "困難", + [QuestionDifficulty.Unspecified]: "未指定", +}; + +export default function DifficultyBadge({ + difficulty, +}: { + difficulty: QuestionDifficulty; +}) { + return ( + + {difficultyTranslation[difficulty]} + + ); +} diff --git a/app/(app)/challenges/_question/index.tsx b/components/question/question-card.tsx similarity index 64% rename from app/(app)/challenges/_question/index.tsx rename to components/question/question-card.tsx index 322dbe7..d49fa9f 100644 --- a/app/(app)/challenges/_question/index.tsx +++ b/components/question/question-card.tsx @@ -1,10 +1,10 @@ import { Badge } from "@/components/ui/badge"; import { type FragmentType, graphql, readFragment } from "@/gql"; -import { QuestionDifficulty } from "@/gql/graphql"; +import { getQuestionSolvedStatus } from "@/lib/solved-status"; import { SwordIcon } from "lucide-react"; import Link from "next/link"; -import { difficultyTranslation, type SolvedStatus, solvedStatusTranslation } from "../model"; -import { getQuestionSolvedStatus } from "./solved-status"; +import DifficultyBadge from "./difficulty-badge"; +import SolvedStatusBadge from "./solved-status-badge"; const QUESTION_CARD_FRAGMENT = graphql(` fragment QuestionCard on Question { @@ -18,19 +18,6 @@ const QUESTION_CARD_FRAGMENT = graphql(` } `); -const solvedStatusColor: Record = { - solved: "bg-green-800", - unsolved: "bg-yellow-800", - "not-tried": "bg-gray-800", -}; - -const badgeColor: Record = { - [QuestionDifficulty.Easy]: "bg-green-800", - [QuestionDifficulty.Medium]: "bg-yellow-800", - [QuestionDifficulty.Hard]: "bg-red-800", - [QuestionDifficulty.Unspecified]: "bg-gray-800", -}; - export default function QuestionCard({ fragment, }: { @@ -49,12 +36,8 @@ export default function QuestionCard({

{descriptionFirstLine}

- - {solvedStatusTranslation[solvedStatus]} - - - {difficultyTranslation[question.difficulty]} - + + {question.category}
diff --git a/components/question/solved-status-badge.tsx b/components/question/solved-status-badge.tsx new file mode 100644 index 0000000..b2bc1dd --- /dev/null +++ b/components/question/solved-status-badge.tsx @@ -0,0 +1,26 @@ +import type { SolvedStatus } from "@/lib/solved-status"; +import { Badge } from "../ui/badge"; + +const solvedStatusColor: Record = { + solved: "bg-green-800", + unsolved: "bg-yellow-800", + "not-tried": "bg-gray-800", +}; + +export const solvedStatusTranslation: Record = { + solved: "✅ 已經解決", + unsolved: "尚未解決", + "not-tried": "還沒嘗試", +}; + +export default function SolvedStatusBadge({ + solvedStatus, +}: { + solvedStatus: SolvedStatus; +}) { + return ( + + {solvedStatusTranslation[solvedStatus]} + + ); +} diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..02a9354 --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,84 @@ +"use client"; + +import * as TabsPrimitive from "@radix-ui/react-tabs"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +function Tabs({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function TabsList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function TabsTrigger({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function TabsContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Tabs, TabsContent, TabsList, TabsTrigger }; diff --git a/gql/gql.ts b/gql/gql.ts index d66b51d..d533d4d 100644 --- a/gql/gql.ts +++ b/gql/gql.ts @@ -14,25 +14,43 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document- * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size */ type Documents = { + "\n query QuestionHeader($id: ID!) {\n question(id: $id) {\n id\n title\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n }\n": typeof types.QuestionHeaderDocument, + "\n query CompareAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n": typeof types.CompareAnswerDocument, + "\n query CorrectAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n }\n }\n": typeof types.CorrectAnswerDocument, + "\n query QuestionDescription($id: ID!) {\n question(id: $id) {\n id\n description\n }\n }\n": typeof types.QuestionDescriptionDocument, + "\n mutation SubmitAnswer($id: ID!, $answer: String!) {\n submitAnswer(id: $id, answer: $answer) {\n error\n }\n }\n": typeof types.SubmitAnswerDocument, + "\n query MyAnswer($id: ID!) {\n question(id: $id) {\n id\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n": typeof types.MyAnswerDocument, + "\n query SqlEditorContext($id: ID!) {\n question(id: $id) {\n id\n database {\n id\n ...DatabaseStructure\n }\n lastSubmission {\n id\n submittedCode\n }\n }\n }\n": typeof types.SqlEditorContextDocument, + "\n query SubmissionHistory($id: ID!) {\n question(id: $id) {\n id\n userSubmissions {\n id\n status\n submittedCode\n submittedAt\n }\n }\n }\n": typeof types.SubmissionHistoryDocument, + "\n fragment DatabaseStructure on Database {\n id\n structure {\n tables {\n columns\n name\n }\n }\n }\n": typeof types.DatabaseStructureFragmentDoc, "\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n": typeof types.ChallengeStatisticsDocument, - "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n": typeof types.QuestionCardFragmentDoc, - "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n": typeof types.QuestionSolvedStatusFragmentDoc, "\n query ListQuestions($where: QuestionWhereInput, $after: Cursor) {\n questions(where: $where, first: 10, after: $after) {\n edges {\n node {\n id\n ...QuestionCard\n ...QuestionSolvedStatus\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": typeof types.ListQuestionsDocument, "\n query CompletedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n": typeof types.CompletedQuestionsDocument, "\n query Points {\n me {\n id\n totalPoints\n\n points(first: 5) {\n edges {\n node {\n id\n ...PointFragment\n }\n }\n }\n }\n }\n": typeof types.PointsDocument, "\n fragment PointFragment on Point {\n description\n points\n }\n": typeof types.PointFragmentFragmentDoc, "\n query ResolvedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n": typeof types.ResolvedQuestionsDocument, + "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n": typeof types.QuestionCardFragmentDoc, + "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n": typeof types.QuestionSolvedStatusFragmentDoc, "\n query BasicUserInfo {\n me {\n id\n name\n email\n avatar\n\n group {\n name\n }\n }\n }\n": typeof types.BasicUserInfoDocument, }; const documents: Documents = { + "\n query QuestionHeader($id: ID!) {\n question(id: $id) {\n id\n title\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n }\n": types.QuestionHeaderDocument, + "\n query CompareAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n": types.CompareAnswerDocument, + "\n query CorrectAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n }\n }\n": types.CorrectAnswerDocument, + "\n query QuestionDescription($id: ID!) {\n question(id: $id) {\n id\n description\n }\n }\n": types.QuestionDescriptionDocument, + "\n mutation SubmitAnswer($id: ID!, $answer: String!) {\n submitAnswer(id: $id, answer: $answer) {\n error\n }\n }\n": types.SubmitAnswerDocument, + "\n query MyAnswer($id: ID!) {\n question(id: $id) {\n id\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n": types.MyAnswerDocument, + "\n query SqlEditorContext($id: ID!) {\n question(id: $id) {\n id\n database {\n id\n ...DatabaseStructure\n }\n lastSubmission {\n id\n submittedCode\n }\n }\n }\n": types.SqlEditorContextDocument, + "\n query SubmissionHistory($id: ID!) {\n question(id: $id) {\n id\n userSubmissions {\n id\n status\n submittedCode\n submittedAt\n }\n }\n }\n": types.SubmissionHistoryDocument, + "\n fragment DatabaseStructure on Database {\n id\n structure {\n tables {\n columns\n name\n }\n }\n }\n": types.DatabaseStructureFragmentDoc, "\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n": types.ChallengeStatisticsDocument, - "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n": types.QuestionCardFragmentDoc, - "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n": types.QuestionSolvedStatusFragmentDoc, "\n query ListQuestions($where: QuestionWhereInput, $after: Cursor) {\n questions(where: $where, first: 10, after: $after) {\n edges {\n node {\n id\n ...QuestionCard\n ...QuestionSolvedStatus\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": types.ListQuestionsDocument, "\n query CompletedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n": types.CompletedQuestionsDocument, "\n query Points {\n me {\n id\n totalPoints\n\n points(first: 5) {\n edges {\n node {\n id\n ...PointFragment\n }\n }\n }\n }\n }\n": types.PointsDocument, "\n fragment PointFragment on Point {\n description\n points\n }\n": types.PointFragmentFragmentDoc, "\n query ResolvedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n": types.ResolvedQuestionsDocument, + "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n": types.QuestionCardFragmentDoc, + "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n": types.QuestionSolvedStatusFragmentDoc, "\n query BasicUserInfo {\n me {\n id\n name\n email\n avatar\n\n group {\n name\n }\n }\n }\n": types.BasicUserInfoDocument, }; @@ -53,15 +71,43 @@ export function graphql(source: string): unknown; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n"): (typeof documents)["\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n"]; +export function graphql(source: "\n query QuestionHeader($id: ID!) {\n question(id: $id) {\n id\n title\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n }\n"): (typeof documents)["\n query QuestionHeader($id: ID!) {\n question(id: $id) {\n id\n title\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n"): (typeof documents)["\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n"]; +export function graphql(source: "\n query CompareAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n"): (typeof documents)["\n query CompareAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n"): (typeof documents)["\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n"]; +export function graphql(source: "\n query CorrectAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n }\n }\n"): (typeof documents)["\n query CorrectAnswer($id: ID!) {\n question(id: $id) {\n id\n referenceAnswerResult {\n columns\n rows\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query QuestionDescription($id: ID!) {\n question(id: $id) {\n id\n description\n }\n }\n"): (typeof documents)["\n query QuestionDescription($id: ID!) {\n question(id: $id) {\n id\n description\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n mutation SubmitAnswer($id: ID!, $answer: String!) {\n submitAnswer(id: $id, answer: $answer) {\n error\n }\n }\n"): (typeof documents)["\n mutation SubmitAnswer($id: ID!, $answer: String!) {\n submitAnswer(id: $id, answer: $answer) {\n error\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query MyAnswer($id: ID!) {\n question(id: $id) {\n id\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n"): (typeof documents)["\n query MyAnswer($id: ID!) {\n question(id: $id) {\n id\n lastSubmission {\n id\n status\n queryResult {\n columns\n rows\n }\n error\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query SqlEditorContext($id: ID!) {\n question(id: $id) {\n id\n database {\n id\n ...DatabaseStructure\n }\n lastSubmission {\n id\n submittedCode\n }\n }\n }\n"): (typeof documents)["\n query SqlEditorContext($id: ID!) {\n question(id: $id) {\n id\n database {\n id\n ...DatabaseStructure\n }\n lastSubmission {\n id\n submittedCode\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query SubmissionHistory($id: ID!) {\n question(id: $id) {\n id\n userSubmissions {\n id\n status\n submittedCode\n submittedAt\n }\n }\n }\n"): (typeof documents)["\n query SubmissionHistory($id: ID!) {\n question(id: $id) {\n id\n userSubmissions {\n id\n status\n submittedCode\n submittedAt\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment DatabaseStructure on Database {\n id\n structure {\n tables {\n columns\n name\n }\n }\n }\n"): (typeof documents)["\n fragment DatabaseStructure on Database {\n id\n structure {\n tables {\n columns\n name\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n"): (typeof documents)["\n query ChallengeStatistics {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n attemptedQuestions\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ @@ -82,6 +128,14 @@ export function graphql(source: "\n fragment PointFragment on Point {\n desc * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql(source: "\n query ResolvedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n"): (typeof documents)["\n query ResolvedQuestions {\n me {\n id\n submissionStatistics {\n totalQuestions\n solvedQuestions\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n"): (typeof documents)["\n fragment QuestionCard on Question {\n id\n title\n description\n difficulty\n category\n\n ...QuestionSolvedStatus\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n"): (typeof documents)["\n fragment QuestionSolvedStatus on Question {\n solved\n attempted\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/gql/graphql.ts b/gql/graphql.ts index e0c5da2..661276f 100644 --- a/gql/graphql.ts +++ b/gql/graphql.ts @@ -103,6 +103,18 @@ export type Database = Node & { /** SQL schema */ schema: Scalars['String']['output']; slug: Scalars['String']['output']; + structure: DatabaseStructure; +}; + +export type DatabaseStructure = { + __typename?: 'DatabaseStructure'; + tables: Array; +}; + +export type DatabaseTable = { + __typename?: 'DatabaseTable'; + columns: Array; + name: Scalars['String']['output']; }; /** @@ -806,6 +818,8 @@ export type Question = Node & { /** Question difficulty, e.g. 'easy' */ difficulty: QuestionDifficulty; id: Scalars['ID']['output']; + /** Get the last submission for this question. */ + lastSubmission?: Maybe; /** Reference answer */ referenceAnswer: Scalars['String']['output']; referenceAnswerResult: SqlExecutionResult; @@ -814,7 +828,7 @@ export type Question = Node & { submissions: SubmissionConnection; /** Question title */ title: Scalars['String']['output']; - /** List of your submissions for this question. */ + /** List of your submissions for this question, ordered by submitted at descending. */ userSubmissions: Array; }; @@ -1452,17 +1466,75 @@ export type UserWhereInput = { updatedAtNotIn?: InputMaybe>; }; -export type ChallengeStatisticsQueryVariables = Exact<{ [key: string]: never; }>; +export type QuestionHeaderQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; -export type ChallengeStatisticsQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, submissionStatistics: { __typename?: 'SubmissionStatistics', totalQuestions: number, solvedQuestions: number, attemptedQuestions: number } } }; +export type QuestionHeaderQuery = { __typename?: 'Query', question: ( + { __typename?: 'Question', id: string, title: string, difficulty: QuestionDifficulty, category: string } + & { ' $fragmentRefs'?: { 'QuestionSolvedStatusFragment': QuestionSolvedStatusFragment } } + ) }; -export type QuestionCardFragment = ( - { __typename?: 'Question', id: string, title: string, description: string, difficulty: QuestionDifficulty, category: string } - & { ' $fragmentRefs'?: { 'QuestionSolvedStatusFragment': QuestionSolvedStatusFragment } } -) & { ' $fragmentName'?: 'QuestionCardFragment' }; +export type CompareAnswerQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; -export type QuestionSolvedStatusFragment = { __typename?: 'Question', solved: boolean, attempted: boolean } & { ' $fragmentName'?: 'QuestionSolvedStatusFragment' }; + +export type CompareAnswerQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, referenceAnswerResult: { __typename?: 'SQLExecutionResult', columns: Array, rows: Array> }, lastSubmission?: { __typename?: 'Submission', id: string, status: SubmissionStatus, error?: string | null, queryResult?: { __typename?: 'UserSQLExecutionResult', columns: Array, rows: Array> } | null } | null } }; + +export type CorrectAnswerQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type CorrectAnswerQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, referenceAnswerResult: { __typename?: 'SQLExecutionResult', columns: Array, rows: Array> } } }; + +export type QuestionDescriptionQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type QuestionDescriptionQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, description: string } }; + +export type SubmitAnswerMutationVariables = Exact<{ + id: Scalars['ID']['input']; + answer: Scalars['String']['input']; +}>; + + +export type SubmitAnswerMutation = { __typename?: 'Mutation', submitAnswer: { __typename?: 'SubmissionResult', error?: string | null } }; + +export type MyAnswerQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type MyAnswerQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, lastSubmission?: { __typename?: 'Submission', id: string, status: SubmissionStatus, error?: string | null, queryResult?: { __typename?: 'UserSQLExecutionResult', columns: Array, rows: Array> } | null } | null } }; + +export type SqlEditorContextQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type SqlEditorContextQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, database: ( + { __typename?: 'Database', id: string } + & { ' $fragmentRefs'?: { 'DatabaseStructureFragment': DatabaseStructureFragment } } + ), lastSubmission?: { __typename?: 'Submission', id: string, submittedCode: string } | null } }; + +export type SubmissionHistoryQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type SubmissionHistoryQuery = { __typename?: 'Query', question: { __typename?: 'Question', id: string, userSubmissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, submittedCode: string, submittedAt: string }> } }; + +export type DatabaseStructureFragment = { __typename?: 'Database', id: string, structure: { __typename?: 'DatabaseStructure', tables: Array<{ __typename?: 'DatabaseTable', columns: Array, name: string }> } } & { ' $fragmentName'?: 'DatabaseStructureFragment' }; + +export type ChallengeStatisticsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type ChallengeStatisticsQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, submissionStatistics: { __typename?: 'SubmissionStatistics', totalQuestions: number, solvedQuestions: number, attemptedQuestions: number } } }; export type ListQuestionsQueryVariables = Exact<{ where?: InputMaybe; @@ -1495,14 +1567,30 @@ export type ResolvedQuestionsQueryVariables = Exact<{ [key: string]: never; }>; export type ResolvedQuestionsQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, submissionStatistics: { __typename?: 'SubmissionStatistics', totalQuestions: number, solvedQuestions: number } } }; +export type QuestionCardFragment = ( + { __typename?: 'Question', id: string, title: string, description: string, difficulty: QuestionDifficulty, category: string } + & { ' $fragmentRefs'?: { 'QuestionSolvedStatusFragment': QuestionSolvedStatusFragment } } +) & { ' $fragmentName'?: 'QuestionCardFragment' }; + +export type QuestionSolvedStatusFragment = { __typename?: 'Question', solved: boolean, attempted: boolean } & { ' $fragmentName'?: 'QuestionSolvedStatusFragment' }; + export type BasicUserInfoQueryVariables = Exact<{ [key: string]: never; }>; export type BasicUserInfoQuery = { __typename?: 'Query', me: { __typename?: 'User', id: string, name: string, email: string, avatar?: string | null, group: { __typename?: 'Group', name: string } } }; +export const DatabaseStructureFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DatabaseStructure"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Database"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"structure"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"tables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]} as unknown as DocumentNode; +export const PointFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PointFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Point"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"points"}}]}}]} as unknown as DocumentNode; export const QuestionSolvedStatusFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionSolvedStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"solved"}},{"kind":"Field","name":{"kind":"Name","value":"attempted"}}]}}]} as unknown as DocumentNode; export const QuestionCardFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionCard"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"difficulty"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuestionSolvedStatus"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionSolvedStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"solved"}},{"kind":"Field","name":{"kind":"Name","value":"attempted"}}]}}]} as unknown as DocumentNode; -export const PointFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PointFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Point"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"points"}}]}}]} as unknown as DocumentNode; +export const QuestionHeaderDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"QuestionHeader"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"difficulty"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuestionSolvedStatus"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionSolvedStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"solved"}},{"kind":"Field","name":{"kind":"Name","value":"attempted"}}]}}]} as unknown as DocumentNode; +export const CompareAnswerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CompareAnswer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"referenceAnswerResult"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"rows"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lastSubmission"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"queryResult"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"rows"}}]}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]}}]} as unknown as DocumentNode; +export const CorrectAnswerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CorrectAnswer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"referenceAnswerResult"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"rows"}}]}}]}}]}}]} as unknown as DocumentNode; +export const QuestionDescriptionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"QuestionDescription"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}}]}}]} as unknown as DocumentNode; +export const SubmitAnswerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SubmitAnswer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"answer"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"submitAnswer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"answer"},"value":{"kind":"Variable","name":{"kind":"Name","value":"answer"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]} as unknown as DocumentNode; +export const MyAnswerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MyAnswer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lastSubmission"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"queryResult"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"rows"}}]}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]}}]} as unknown as DocumentNode; +export const SqlEditorContextDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SqlEditorContext"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"database"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"DatabaseStructure"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lastSubmission"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"submittedCode"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DatabaseStructure"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Database"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"structure"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"tables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"columns"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]} as unknown as DocumentNode; +export const SubmissionHistoryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SubmissionHistory"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"question"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"userSubmissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"submittedCode"}},{"kind":"Field","name":{"kind":"Name","value":"submittedAt"}}]}}]}}]}}]} as unknown as DocumentNode; export const ChallengeStatisticsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ChallengeStatistics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"submissionStatistics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalQuestions"}},{"kind":"Field","name":{"kind":"Name","value":"solvedQuestions"}},{"kind":"Field","name":{"kind":"Name","value":"attemptedQuestions"}}]}}]}}]}}]} as unknown as DocumentNode; export const ListQuestionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ListQuestions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"where"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"QuestionWhereInput"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"after"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Cursor"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"questions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"Variable","name":{"kind":"Name","value":"where"}}},{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"10"}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"after"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuestionCard"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuestionSolvedStatus"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionSolvedStatus"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"solved"}},{"kind":"Field","name":{"kind":"Name","value":"attempted"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"QuestionCard"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Question"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"difficulty"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"QuestionSolvedStatus"}}]}}]} as unknown as DocumentNode; export const CompletedQuestionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CompletedQuestions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"me"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"submissionStatistics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalQuestions"}},{"kind":"Field","name":{"kind":"Name","value":"solvedQuestions"}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/lib/apollo.rsc.ts b/lib/apollo.rsc.ts new file mode 100644 index 0000000..9f319a4 --- /dev/null +++ b/lib/apollo.rsc.ts @@ -0,0 +1,10 @@ +import { registerApolloClient } from "@apollo/client-integration-nextjs"; +import { headers } from "next/headers"; +import { makeClient } from "./apollo"; + +export const { getClient, query, PreloadQuery } = registerApolloClient(async () => { + const header = await headers(); + const token = header.get("Authorization")?.split(" ")[1]; + + return makeClient({ token }); +}); diff --git a/lib/csv-utils.ts b/lib/csv-utils.ts new file mode 100644 index 0000000..47a8b96 --- /dev/null +++ b/lib/csv-utils.ts @@ -0,0 +1,48 @@ +/** + * 將表格數據轉換為 CSV 格式 + */ +export function tableToCSV(columns: string[], rows: string[][]): string { + // 轉義 CSV 欄位中的特殊字符 + const escapeCSVField = (field: string): string => { + // 如果欄位包含逗號、雙引號、換行符或回車符,需要用雙引號包圍 + if (field.includes(",") || field.includes("\"") || field.includes("\n") || field.includes("\r")) { + // 將雙引號轉義為兩個雙引號 + return `"${field.replace(/"/g, "\"\"")}"`; + } + return field; + }; + + // 處理標題行 + const headerRow = columns.map(escapeCSVField).join(","); + + // 處理數據行 + const dataRows = rows.map(row => row.map(escapeCSVField).join(",")); + + // 組合所有行 + return [headerRow, ...dataRows].join("\n"); +} + +/** + * 比較兩個 CSV 字符串是否相等(忽略行順序) + */ +export function compareCSV(csv1: string, csv2: string): boolean { + // 分割成行並排序(除了標題行) + const lines1 = csv1.trim().split("\n"); + const lines2 = csv2.trim().split("\n"); + + // 如果行數不同,直接返回 false + if (lines1.length !== lines2.length) { + return false; + } + + // 比較標題行 + if (lines1[0] !== lines2[0]) { + return false; + } + + // 比較數據行(排序後比較,因為 SQL 結果順序可能不同) + const dataLines1 = lines1.slice(1).sort(); + const dataLines2 = lines2.slice(1).sort(); + + return dataLines1.every((line, index) => line === dataLines2[index]); +} diff --git a/app/(app)/challenges/_question/solved-status.ts b/lib/solved-status.ts similarity index 89% rename from app/(app)/challenges/_question/solved-status.ts rename to lib/solved-status.ts index 975d931..07f5852 100644 --- a/app/(app)/challenges/_question/solved-status.ts +++ b/lib/solved-status.ts @@ -1,5 +1,6 @@ import { type FragmentType, graphql, readFragment } from "@/gql"; -import type { SolvedStatus } from "../model"; + +export type SolvedStatus = "solved" | "unsolved" | "not-tried"; export const QUESTION_SOLVED_STATUS_FRAGMENT = graphql(` fragment QuestionSolvedStatus on Question { diff --git a/package.json b/package.json index faf0c59..7433a9b 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@apollo/client": "4.0.5", "@apollo/client-integration-nextjs": "^0.13.1", "@bprogress/next": "^3.2.12", + "@codemirror/lang-sql": "^6.10.0", "@graphql-codegen/client-preset": "^5.0.1", "@hookform/resolvers": "^5.2.2", "@radix-ui/react-alert-dialog": "^1.1.15", @@ -30,27 +31,31 @@ "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", - "@swc-contrib/plugin-graphql-codegen-client-preset": "^0.6.0", + "@swc-contrib/plugin-graphql-codegen-client-preset": "^0.7.0", "@tailwindcss/typography": "^0.5.18", "@tanstack/react-table": "^8.21.3", + "@uiw/react-codemirror": "^4.25.2", "babel-plugin-react-compiler": "19.1.0-rc.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "foxact": "^0.2.49", "graphql": "^16.11.0", "lucide-react": "^0.544.0", - "next": "15.6.0-canary.20", + "next": "15.6.0-canary.26", "next-themes": "^0.4.6", - "react": "19.2.0-canary-d415fd3e-20250919", - "react-dom": "19.2.0-canary-d415fd3e-20250919", + "react": "19.2.0-canary-83c88ad4-20250923", + "react-codemirror-merge": "^4.25.2", + "react-dom": "19.2.0-canary-83c88ad4-20250923", "react-hook-form": "^7.63.0", "react-remark": "^2.1.0", "remark": "^15.0.1", "remark-html": "^16.0.1", "sonner": "^2.0.7", + "sql-formatter": "^15.6.9", "tailwind-merge": "^3.3.1", "zod": "^4.1.11" }, @@ -65,14 +70,14 @@ "@types/node": "^24.5.2", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.44.1", "dprint": "^0.50.2", "eslint": "^9.36.0", - "eslint-config-next": "15.5.3", + "eslint-config-next": "15.5.4", "eslint-plugin-better-tailwindcss": "^3.7.9", "eslint-plugin-react-hooks": "^5.2.0", "tailwindcss": "^4.1.13", - "tw-animate-css": "^1.3.8", + "tw-animate-css": "^1.4.0", "typescript": "^5.9.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b0c09a..a51f6ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,70 +15,79 @@ importers: dependencies: '@apollo/client': specifier: 4.0.5 - version: 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2) + version: 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2) '@apollo/client-integration-nextjs': specifier: ^0.13.1 - version: 0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(next@15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919))(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2) + version: 0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(next@15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923))(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2) '@bprogress/next': specifier: ^3.2.12 - version: 3.2.12(next@15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919))(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 3.2.12(next@15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923))(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@codemirror/lang-sql': + specifier: ^6.10.0 + version: 6.10.0 '@graphql-codegen/client-preset': specifier: ^5.0.1 version: 5.0.1(graphql@16.11.0) '@hookform/resolvers': specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.63.0(react@19.2.0-canary-d415fd3e-20250919)) + version: 5.2.2(react-hook-form@7.63.0(react@19.2.0-canary-83c88ad4-20250923)) '@radix-ui/react-alert-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-avatar': specifier: ^1.1.10 - version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-checkbox': specifier: ^1.3.3 - version: 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-collapsible': specifier: ^1.1.12 - version: 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-dropdown-menu': specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-label': specifier: ^2.1.7 - version: 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-progress': specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-select': specifier: ^2.2.6 - version: 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-separator': specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-slot': specifier: ^1.2.3 - version: 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + version: 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-tabs': + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-toggle': specifier: ^1.1.10 - version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-toggle-group': specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/react-tooltip': specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) '@swc-contrib/plugin-graphql-codegen-client-preset': - specifier: ^0.6.0 - version: 0.6.0 + specifier: ^0.7.0 + version: 0.7.0 '@tailwindcss/typography': specifier: ^0.5.18 version: 0.5.18(tailwindcss@4.1.13) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 8.21.3(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@uiw/react-codemirror': + specifier: ^4.25.2 + version: 4.25.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.7)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.3)(codemirror@6.0.2)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -90,31 +99,34 @@ importers: version: 2.1.1 foxact: specifier: ^0.2.49 - version: 0.2.49(react@19.2.0-canary-d415fd3e-20250919) + version: 0.2.49(react@19.2.0-canary-83c88ad4-20250923) graphql: specifier: ^16.11.0 version: 16.11.0 lucide-react: specifier: ^0.544.0 - version: 0.544.0(react@19.2.0-canary-d415fd3e-20250919) + version: 0.544.0(react@19.2.0-canary-83c88ad4-20250923) next: - specifier: 15.6.0-canary.20 - version: 15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + specifier: 15.6.0-canary.26 + version: 15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 0.4.6(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) react: - specifier: 19.2.0-canary-d415fd3e-20250919 - version: 19.2.0-canary-d415fd3e-20250919 + specifier: 19.2.0-canary-83c88ad4-20250923 + version: 19.2.0-canary-83c88ad4-20250923 + react-codemirror-merge: + specifier: ^4.25.2 + version: 4.25.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.7)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.3)(codemirror@6.0.2)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) react-dom: - specifier: 19.2.0-canary-d415fd3e-20250919 - version: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + specifier: 19.2.0-canary-83c88ad4-20250923 + version: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) react-hook-form: specifier: ^7.63.0 - version: 7.63.0(react@19.2.0-canary-d415fd3e-20250919) + version: 7.63.0(react@19.2.0-canary-83c88ad4-20250923) react-remark: specifier: ^2.1.0 - version: 2.1.0(react@19.2.0-canary-d415fd3e-20250919) + version: 2.1.0(react@19.2.0-canary-83c88ad4-20250923) remark: specifier: ^15.0.1 version: 15.0.1 @@ -123,7 +135,10 @@ importers: version: 16.0.1 sonner: specifier: ^2.0.7 - version: 2.0.7(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + version: 2.0.7(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + sql-formatter: + specifier: ^15.6.9 + version: 15.6.9 tailwind-merge: specifier: ^3.3.1 version: 3.3.1 @@ -162,8 +177,8 @@ importers: specifier: ^19.1.9 version: 19.1.9(@types/react@19.1.13) '@typescript-eslint/parser': - specifier: ^8.44.0 - version: 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ^8.44.1 + version: 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) dprint: specifier: ^0.50.2 version: 0.50.2 @@ -171,8 +186,8 @@ importers: specifier: ^9.36.0 version: 9.36.0(jiti@2.5.1) eslint-config-next: - specifier: 15.5.3 - version: 15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 15.5.4 + version: 15.5.4(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) eslint-plugin-better-tailwindcss: specifier: ^3.7.9 version: 3.7.9(eslint@9.36.0(jiti@2.5.1))(tailwindcss@4.1.13) @@ -183,8 +198,8 @@ importers: specifier: ^4.1.13 version: 4.1.13 tw-animate-css: - specifier: ^1.3.8 - version: 1.3.8 + specifier: ^1.4.0 + version: 1.4.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -352,6 +367,36 @@ packages: react: '>=18.0.0' react-dom: '>=18.0.0' + '@codemirror/autocomplete@6.18.7': + resolution: {integrity: sha512-8EzdeIoWPJDsMBwz3zdzwXnUpCzMiCyz5/A3FIPpriaclFCGDkAzK13sMcnsu5rowqiyeQN2Vs2TsOcoDPZirQ==} + + '@codemirror/commands@6.8.1': + resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + + '@codemirror/lang-sql@6.10.0': + resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==} + + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} + + '@codemirror/lint@6.8.5': + resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} + + '@codemirror/merge@6.10.2': + resolution: {integrity: sha512-rmHzVkt5FnCtsi0IgvDIDjh/J4LmbfOboB7FMvVl21IHO0p1QM6jSwjkBjBD3D+c+T79OabEqoduCqvJCBV8Yg==} + + '@codemirror/search@6.5.11': + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/theme-one-dark@6.1.3': + resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} + + '@codemirror/view@6.38.3': + resolution: {integrity: sha512-x2t87+oqwB1mduiQZ6huIghjMt4uZKFEdj66IcXw7+a5iBEvv9lh7EWDRHI7crnD4BMGpnyq/RzmCGbiEZLcvQ==} + '@dprint/darwin-arm64@0.50.2': resolution: {integrity: sha512-4d08INZlTxbPW9LK9W8+93viN543/qA2Kxn4azVnPW/xCb2Im03UqJBz8mMm3nJZdtNnK3uTVG3ib1VW+XJisw==} cpu: [arm64] @@ -1019,63 +1064,75 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + '@mapbox/hast-util-table-cell-style@0.2.1': resolution: {integrity: sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==} engines: {node: '>=12'} + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/env@15.6.0-canary.20': - resolution: {integrity: sha512-+ljGWYCPxG5SNlTecwlcVcBnARQNv/CjzD73VlJg2oMvRnVrLCr+1zrjY1KnOVF4KsDxVTCD52V92YeAaJojNw==} + '@next/env@15.6.0-canary.26': + resolution: {integrity: sha512-ibIVqw+wrrZGMardMj2AazLYY19gj7toP3d8JtXqPdcDDD1saQFO6GZj5Y/JU3eg90THC8QV2dNGnypZSWI3Cw==} - '@next/eslint-plugin-next@15.5.3': - resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} + '@next/eslint-plugin-next@15.5.4': + resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==} - '@next/swc-darwin-arm64@15.6.0-canary.20': - resolution: {integrity: sha512-UFv71kNjbKhzdd7nd6f4UKALqKzal/f+dZ9X/ld9rfUmE/sVsCpBqbzu/Uw8KtGVwz1TKcsuR5A+p79SRhY39Q==} + '@next/swc-darwin-arm64@15.6.0-canary.26': + resolution: {integrity: sha512-2lXa1ekJ5eW8COFO2OZW4RRTnSv9vfV1ehTe8Wh0Y7CbFVpTIVfj3BdReVDRFNL3RA+bOtl5EIkYr2bc3fxhuQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.6.0-canary.20': - resolution: {integrity: sha512-Re+46/ZpzquBczPruty09ywO/uTVo2i6yeCr1+x7YpgEj/7jevIIOr9qHoWtTxdceco8+NwmjyPX3jKwqK/IEQ==} + '@next/swc-darwin-x64@15.6.0-canary.26': + resolution: {integrity: sha512-F/VXCekWTMkr2eI9iFJkLRobuDYh3k9ayRM2sC553ywDdlHVh2/nnG78ZpW1BA5Ex0kDTgZCX4TYZmu8YOoBvQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.6.0-canary.20': - resolution: {integrity: sha512-NdReZ2W87z8HttNuWgDPlcpBkQdzaG0WfB2KCwH17mT3NNhaZ3WCrRfp1FICiMIB/TjNi8ewjqYb+7J4vrslBg==} + '@next/swc-linux-arm64-gnu@15.6.0-canary.26': + resolution: {integrity: sha512-ThgMJEiAiCnPMZHfYQYT4Q/1HuPRLy+3NYEzb8VPkosj9PbvkTaU1jDcehMkbcp9GHo2GKsRCaDtKCtR4elwng==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.6.0-canary.20': - resolution: {integrity: sha512-3ItqqT6eRyz3tTtO0H+s/ZnmHWLioNxvNQ+NrCopprMQX4aCqT14g8juSCWyCxUpUCJewu1qzH1b8MG/w49ynA==} + '@next/swc-linux-arm64-musl@15.6.0-canary.26': + resolution: {integrity: sha512-/2mPvac9So9L7gUNYObjGZZmzGJhJA17844GOw7AXYqwpctrEqMXfZC3MyjL3qodE/Pq42nr3JscWbHVYdngMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.6.0-canary.20': - resolution: {integrity: sha512-4MwMRDSdkDk1URFfq8Jh4N2Ck6BY9QjSVukV0PqaF1BIncOdSd+OhdmawAI5h3GAmyhkEXajmqGz33U66uEHAg==} + '@next/swc-linux-x64-gnu@15.6.0-canary.26': + resolution: {integrity: sha512-j6k+ysuUKQRlLBcsgtuTWsvHUjLark5/E3AOahpCJrbk1TstVSSnBrmxxOO3AYVc7WiVU1Dfidt6rxftAgXj1g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.6.0-canary.20': - resolution: {integrity: sha512-XLGkiwp5z7BUd6DbpAkU+Y12JbckzEhwcRmPC9LMWgPzZovsFscjrDyTmYuyRMqaq2qKP+TmXWBwkHvalH8JEw==} + '@next/swc-linux-x64-musl@15.6.0-canary.26': + resolution: {integrity: sha512-/jzrFp3tlseZQ5tVV5vkt23gRbA9dg7qQOKAY4WQJMHgY5qGYlZg57ilJs//hhhjIi/YuJIgnMz3aQCtbZB+3Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.6.0-canary.20': - resolution: {integrity: sha512-rRmwdrIt4g/oX9m/oOiOvXf35cwmyDUbAgSJeE/sB5QZYz7dOgx7Cfj3K5YJJ8fYPCVIO9cALQCeWZuvIrVCBw==} + '@next/swc-win32-arm64-msvc@15.6.0-canary.26': + resolution: {integrity: sha512-fKShJdiS68jaMqk+F2qKTOZXx2u0qiyYE1Zc9w52RxM1woZCh8egTWzfDd2BDCtdA31sYinONhS8O1a5UDJl3g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.6.0-canary.20': - resolution: {integrity: sha512-3jfmbFAOLgRvqs5TKclq3u25lS7ctB/RwLiflbCq8pd9rmu0kIoUlFQP8kiX67bNLSv/p6tWYCd1XMEbyMRn2w==} + '@next/swc-win32-x64-msvc@15.6.0-canary.26': + resolution: {integrity: sha512-quHb3NOvrf2PCxw7Ex5lmD01gFc08NdxTaYufgwSG3ByhKQrQ0CKtmht5j8RswZNQ1xMqP+Bsw6cDP75mRP4CQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1502,6 +1559,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-toggle-group@1.1.11': resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} peerDependencies: @@ -1650,8 +1720,8 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc-contrib/plugin-graphql-codegen-client-preset@0.6.0': - resolution: {integrity: sha512-E3PUJ6HV708XOmfsCF11xAY15hNQyFqwWS5s0Z4sKb4nWbGs8OoXl0prCSLrilUXFhcyFLdk4PEhsPO6n7rQfA==} + '@swc-contrib/plugin-graphql-codegen-client-preset@0.7.0': + resolution: {integrity: sha512-AlkZn9tnprQ2sAJHsDWzARcXb6yI8E4YGcCVzcH7EF+eGkX6a59wH0HNexCRJdULafMjA9Zb6xv7z2RUJb/7Jg==} engines: {node: '>=16'} '@swc/helpers@0.5.15': @@ -1767,8 +1837,8 @@ packages: peerDependencies: graphql: ^16.0.0 - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1814,94 +1884,86 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.43.0': - resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} + '@typescript-eslint/eslint-plugin@8.44.1': + resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.43.0 + '@typescript-eslint/parser': ^8.44.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.44.0': - resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.43.0': - resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.44.0': - resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.43.0': - resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.44.0': - resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.43.0': - resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.44.0': - resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.43.0': - resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} + '@typescript-eslint/type-utils@8.44.1': + resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.43.0': - resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.44.0': - resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.43.0': - resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.44.0': - resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.43.0': - resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.43.0': - resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.44.0': - resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@uiw/codemirror-extensions-basic-setup@4.25.2': + resolution: {integrity: sha512-s2fbpdXrSMWEc86moll/d007ZFhu6jzwNu5cWv/2o7egymvLeZO52LWkewgbr+BUCGWGPsoJVWeaejbsb/hLcw==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/react-codemirror@4.25.2': + resolution: {integrity: sha512-XP3R1xyE0CP6Q0iR0xf3ed+cJzJnfmbLelgJR6osVVtMStGGZP3pGQjjwDRYptmjGHfEELUyyBLdY25h0BQg7w==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -2265,6 +2327,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2281,6 +2346,9 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -2312,6 +2380,9 @@ packages: typescript: optional: true + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -2432,6 +2503,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2518,8 +2592,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.5.3: - resolution: {integrity: sha512-e6j+QhQFOr5pfsc8VJbuTD9xTXJaRvMHYjEeLPA2pFkheNlgPLCkxdvhxhfuM4KGcqSZj2qEnpHisdTVs3BxuQ==} + eslint-config-next@15.5.4: + resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -3426,6 +3500,9 @@ packages: engines: {node: '>=10'} hasBin: true + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3446,14 +3523,18 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.6.0-canary.20: - resolution: {integrity: sha512-FzC5rYa5JgeITRnWX69kqrwM2xgaDlSO1EoPDtmMewpAH/H5Yh1D7+MaYQr+cyfDM0luSpqD6PJd2ej8950RTw==} + next@15.6.0-canary.26: + resolution: {integrity: sha512-Tcyaz63vs5e+R//hJbz9aJddqwPoEPynP2rUxEgLuW5ti8OW15TsydM7YRA5SH9JwElICql2VtKIUlVxs6EPuA==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -3675,10 +3756,28 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@19.2.0-canary-d415fd3e-20250919: - resolution: {integrity: sha512-x6oMy2coDRpRxmci7mbUm8a3SbuMFKAq+4RsnkcdTx9O+9CZh/av8lOSwoNQq83to4exCR5wxBZYeBr7jloZbA==} + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + + react-codemirror-merge@4.25.2: + resolution: {integrity: sha512-+AXsrV/uXocJvZajjbvXkuys18XFqb09a8BbvZT5DQ3CdMVkf9qISrpEJfX1eJumFdJ3EHtd9jm4Th9icENspg==} peerDependencies: - react: 19.2.0-canary-d415fd3e-20250919 + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-dom@19.2.0-canary-83c88ad4-20250923: + resolution: {integrity: sha512-czem6qxnoCIwp9iUE0KmouyA8DnAa3adstGvsTKeFjouDezsWkuLfrx5yAoLB0fmnb6KwRLwP/zZe0+g1NrXHg==} + peerDependencies: + react: 19.2.0-canary-83c88ad4-20250923 react-hook-form@7.63.0: resolution: {integrity: sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==} @@ -3725,8 +3824,8 @@ packages: '@types/react': optional: true - react@19.2.0-canary-d415fd3e-20250919: - resolution: {integrity: sha512-gNQ6vJjVZ73TiwaX9tRjGj5039lEQuGlkkncdLkA4XLsIyttTY8bmDEq1JtcQdybxsM7/WE1hgT8Xi/nk2LBrw==} + react@19.2.0-canary-83c88ad4-20250923: + resolution: {integrity: sha512-7bFyC2OmB4ZXAsryQr2XU4o9VFPq4GAbwNgwgBnetk0oNfVxCimGdDqxbEKNy6uKR9gXIfiQRcgSWyv4/gYaOw==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -3801,6 +3900,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3829,8 +3932,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.27.0-canary-d415fd3e-20250919: - resolution: {integrity: sha512-0lNnfpCOaj3cae33jshLBYVKRkLY6ga5JGrSVQX9M+q5Lkoor8PTFNTLNW4s7WlDui78ntyJrOrjirwoBaCWvw==} + scheduler@0.27.0-canary-83c88ad4-20250923: + resolution: {integrity: sha512-WF3tVgwfkZEYnXSRYmsnJ1DzVACMFIeoT6caE5I0rvFTZ7HXNoXqPCzLqF7viyXRwkLwWuhieCdDkHi+I4EtgQ==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -3935,6 +4038,10 @@ packages: sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} + sql-formatter@15.6.9: + resolution: {integrity: sha512-r9VKnkRfKW7jbhTgytwbM+JqmFclQYN9L58Z3UTktuy9V1f1Y+rGK3t70Truh2wIOJzvZkzobAQ2PwGjjXsr6Q==} + hasBin: true + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -3995,6 +4102,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -4105,8 +4215,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tw-animate-css@1.3.8: - resolution: {integrity: sha512-Qrk3PZ7l7wUcGYhwZloqfkWCmaXZAoqjkdbIDvzfGshwGtexa/DAs9koXxIkrpEasyevandomzCBAV1Yyop5rw==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -4268,6 +4378,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + web-namespaces@1.1.4: resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} @@ -4390,31 +4503,31 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@apollo/client-integration-nextjs@0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(next@15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919))(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2)': + '@apollo/client-integration-nextjs@0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(next@15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923))(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2)': dependencies: - '@apollo/client': 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2) - '@apollo/client-react-streaming': 0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2) - next: 15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@apollo/client': 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2) + '@apollo/client-react-streaming': 0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2) + next: 15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 rxjs: 7.8.2 transitivePeerDependencies: - '@types/react' - graphql - react-dom - '@apollo/client-react-streaming@0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2)': + '@apollo/client-react-streaming@0.13.1(@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2))(@types/react@19.1.13)(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2)': dependencies: - '@apollo/client': 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2) + '@apollo/client': 4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2) '@types/react-dom': 19.1.9(@types/react@19.1.13) '@wry/equality': 0.5.7 graphql: 16.11.0 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) rxjs: 7.8.2 transitivePeerDependencies: - '@types/react' - '@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)(rxjs@7.8.2)': + '@apollo/client@4.0.5(graphql-ws@6.0.6(graphql@16.11.0)(ws@8.18.3))(graphql@16.11.0)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)(rxjs@7.8.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) '@wry/caches': 1.0.1 @@ -4427,8 +4540,8 @@ snapshots: tslib: 2.8.1 optionalDependencies: graphql-ws: 6.0.6(graphql@16.11.0)(ws@8.18.3) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) '@ardatan/relay-compiler@12.0.3(graphql@16.11.0)': dependencies: @@ -4562,19 +4675,89 @@ snapshots: '@bprogress/core@1.3.4': {} - '@bprogress/next@3.2.12(next@15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919))(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@bprogress/next@3.2.12(next@15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923))(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@bprogress/core': 1.3.4 - '@bprogress/react': 1.2.7(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - next: 15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@bprogress/react': 1.2.7(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + next: 15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) - '@bprogress/react@1.2.7(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@bprogress/react@1.2.7(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@bprogress/core': 1.3.4 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + + '@codemirror/autocomplete@6.18.7': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.8.1': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + '@lezer/common': 1.2.3 + + '@codemirror/lang-sql@6.10.0': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/language@6.11.3': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/lint@6.8.5': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + crelt: 1.0.6 + + '@codemirror/merge@6.10.2': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + '@lezer/highlight': 1.2.1 + style-mod: 4.1.2 + + '@codemirror/search@6.5.11': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + crelt: 1.0.6 + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/theme-one-dark@6.1.3': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + '@lezer/highlight': 1.2.1 + + '@codemirror/view@6.38.3': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 '@dprint/darwin-arm64@0.50.2': optional: true @@ -4696,11 +4879,11 @@ snapshots: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.5(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@floating-ui/react-dom@2.1.5(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@floating-ui/dom': 1.7.3 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) '@floating-ui/utils@0.2.10': {} @@ -5134,10 +5317,10 @@ snapshots: dependencies: graphql: 16.11.0 - '@hookform/resolvers@5.2.2(react-hook-form@7.63.0(react@19.2.0-canary-d415fd3e-20250919))': + '@hookform/resolvers@5.2.2(react-hook-form@7.63.0(react@19.2.0-canary-83c88ad4-20250923))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.63.0(react@19.2.0-canary-d415fd3e-20250919) + react-hook-form: 7.63.0(react@19.2.0-canary-83c88ad4-20250923) '@humanfs/core@0.19.1': {} @@ -5385,45 +5568,57 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lezer/common@1.2.3': {} + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + '@mapbox/hast-util-table-cell-style@0.2.1': dependencies: unist-util-visit: 1.4.1 + '@marijn/find-cluster-break@1.0.2': {} + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@15.6.0-canary.20': {} + '@next/env@15.6.0-canary.26': {} - '@next/eslint-plugin-next@15.5.3': + '@next/eslint-plugin-next@15.5.4': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.6.0-canary.20': + '@next/swc-darwin-arm64@15.6.0-canary.26': optional: true - '@next/swc-darwin-x64@15.6.0-canary.20': + '@next/swc-darwin-x64@15.6.0-canary.26': optional: true - '@next/swc-linux-arm64-gnu@15.6.0-canary.20': + '@next/swc-linux-arm64-gnu@15.6.0-canary.26': optional: true - '@next/swc-linux-arm64-musl@15.6.0-canary.20': + '@next/swc-linux-arm64-musl@15.6.0-canary.26': optional: true - '@next/swc-linux-x64-gnu@15.6.0-canary.20': + '@next/swc-linux-x64-gnu@15.6.0-canary.26': optional: true - '@next/swc-linux-x64-musl@15.6.0-canary.20': + '@next/swc-linux-x64-musl@15.6.0-canary.26': optional: true - '@next/swc-win32-arm64-msvc@15.6.0-canary.20': + '@next/swc-win32-arm64-msvc@15.6.0-canary.26': optional: true - '@next/swc-win32-x64-msvc@15.6.0-canary.20': + '@next/swc-win32-x64-msvc@15.6.0-canary.26': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5506,444 +5701,460 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-context@1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) aria-hidden: 1.2.6 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-id@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) aria-hidden: 1.2.6 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': - dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': + dependencies: + '@floating-ui/react-dom': 2.1.5(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) '@radix-ui/rect': 1.1.1 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) aria-hidden: 1.2.6 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + optionalDependencies: + '@types/react': 19.1.13 + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - use-sync-external-store: 1.5.0(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + use-sync-external-store: 1.5.0(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@types/react': 19.1.13 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919) - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 '@types/react-dom': 19.1.9(@types/react@19.1.13) @@ -5958,7 +6169,7 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc-contrib/plugin-graphql-codegen-client-preset@0.6.0': {} + '@swc-contrib/plugin-graphql-codegen-client-preset@0.7.0': {} '@swc/helpers@0.5.15': dependencies: @@ -6041,11 +6252,11 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.13 - '@tanstack/react-table@8.21.3(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919)': + '@tanstack/react-table@8.21.3(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': dependencies: '@tanstack/table-core': 8.21.3 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) '@tanstack/table-core@8.21.3': {} @@ -6059,7 +6270,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -6108,14 +6319,14 @@ snapshots: dependencies: '@types/node': 24.5.2 - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 eslint: 9.36.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -6125,59 +6336,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3 eslint: 9.36.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - debug: 4.4.3 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) - '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.43.0': + '@typescript-eslint/scope-manager@8.44.1': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 - '@typescript-eslint/scope-manager@8.44.0': - dependencies: - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 - - '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - typescript: 5.9.2 - - '@typescript-eslint/type-utils@8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.3 eslint: 9.36.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) @@ -6185,32 +6378,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.43.0': {} - - '@typescript-eslint/types@8.44.0': {} - - '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.44.1': {} - '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -6221,26 +6396,48 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) eslint: 9.36.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.43.0': + '@typescript-eslint/visitor-keys@8.44.1': dependencies: - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/types': 8.44.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.44.0': + '@uiw/codemirror-extensions-basic-setup@4.25.2(@codemirror/autocomplete@6.18.7)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.3)': dependencies: - '@typescript-eslint/types': 8.44.0 - eslint-visitor-keys: 4.2.1 + '@codemirror/autocomplete': 6.18.7 + '@codemirror/commands': 6.8.1 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.8.5 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + + '@uiw/react-codemirror@4.25.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.7)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.3)(codemirror@6.0.2)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923)': + dependencies: + '@babel/runtime': 7.28.4 + '@codemirror/commands': 6.8.1 + '@codemirror/state': 6.5.2 + '@codemirror/theme-one-dark': 6.1.3 + '@codemirror/view': 6.38.3 + '@uiw/codemirror-extensions-basic-setup': 4.25.2(@codemirror/autocomplete@6.18.7)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.3) + codemirror: 6.0.2 + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' '@ungap/structured-clone@1.3.0': {} @@ -6608,6 +6805,16 @@ snapshots: clsx@2.1.1: {} + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/commands': 6.8.1 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.8.5 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -6620,6 +6827,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} + common-tags@1.8.2: {} concat-map@0.0.1: {} @@ -6650,6 +6859,8 @@ snapshots: optionalDependencies: typescript: 5.9.2 + crelt@1.0.6: {} + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -6749,6 +6960,8 @@ snapshots: dependencies: path-type: 4.0.0 + discontinuous-range@1.0.0: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -6904,16 +7117,16 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + eslint-config-next@15.5.4(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@next/eslint-plugin-next': 15.5.3 + '@next/eslint-plugin-next': 15.5.4 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.36.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.5.1)) @@ -6943,15 +7156,15 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.36.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.5.1)) @@ -6971,7 +7184,7 @@ snapshots: tailwindcss: 4.1.13 tsconfig-paths-webpack-plugin: 4.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6982,7 +7195,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.36.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -6994,7 +7207,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -7199,12 +7412,12 @@ snapshots: dependencies: fetch-blob: 3.2.0 - foxact@0.2.49(react@19.2.0-canary-d415fd3e-20250919): + foxact@0.2.49(react@19.2.0-canary-83c88ad4-20250923): dependencies: client-only: 0.0.1 server-only: 0.0.1 optionalDependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 function-bind@1.1.2: {} @@ -7744,9 +7957,9 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.544.0(react@19.2.0-canary-d415fd3e-20250919): + lucide-react@0.544.0(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 magic-string@0.30.18: dependencies: @@ -8008,6 +8221,8 @@ snapshots: mkdirp@3.0.1: {} + moo@0.5.2: {} + ms@2.1.3: {} mute-stream@2.0.0: {} @@ -8018,29 +8233,36 @@ snapshots: natural-compare@1.4.0: {} - next-themes@0.4.6(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919): + nearley@2.20.1: + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + + next-themes@0.4.6(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) - next@15.6.0-canary.20(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919): + next@15.6.0-canary.26(@babel/core@7.28.4)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923): dependencies: - '@next/env': 15.6.0-canary.20 + '@next/env': 15.6.0-canary.26 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001743 postcss: 8.4.31 - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) - styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: - '@next/swc-darwin-arm64': 15.6.0-canary.20 - '@next/swc-darwin-x64': 15.6.0-canary.20 - '@next/swc-linux-arm64-gnu': 15.6.0-canary.20 - '@next/swc-linux-arm64-musl': 15.6.0-canary.20 - '@next/swc-linux-x64-gnu': 15.6.0-canary.20 - '@next/swc-linux-x64-musl': 15.6.0-canary.20 - '@next/swc-win32-arm64-msvc': 15.6.0-canary.20 - '@next/swc-win32-x64-msvc': 15.6.0-canary.20 + '@next/swc-darwin-arm64': 15.6.0-canary.26 + '@next/swc-darwin-x64': 15.6.0-canary.26 + '@next/swc-linux-arm64-gnu': 15.6.0-canary.26 + '@next/swc-linux-arm64-musl': 15.6.0-canary.26 + '@next/swc-linux-x64-gnu': 15.6.0-canary.26 + '@next/swc-linux-x64-musl': 15.6.0-canary.26 + '@next/swc-win32-arm64-msvc': 15.6.0-canary.26 + '@next/swc-win32-x64-msvc': 15.6.0-canary.26 babel-plugin-react-compiler: 19.1.0-rc.3 sharp: 0.34.4 transitivePeerDependencies: @@ -8265,20 +8487,44 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919): + railroad-diagrams@1.0.0: {} + + randexp@0.4.6: + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + + react-codemirror-merge@4.25.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.7)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.3)(codemirror@6.0.2)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923): + dependencies: + '@babel/runtime': 7.28.4 + '@codemirror/merge': 6.10.2 + '@codemirror/state': 6.5.2 + '@codemirror/theme-one-dark': 6.1.3 + '@codemirror/view': 6.38.3 + '@uiw/react-codemirror': 4.25.2(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.18.7)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.3)(codemirror@6.0.2)(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923) + codemirror: 6.0.2 + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + + react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - scheduler: 0.27.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 + scheduler: 0.27.0-canary-83c88ad4-20250923 - react-hook-form@7.63.0(react@19.2.0-canary-d415fd3e-20250919): + react-hook-form@7.63.0(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 react-is@16.13.1: {} - react-remark@2.1.0(react@19.2.0-canary-d415fd3e-20250919): + react-remark@2.1.0(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 rehype-react: 6.2.1 remark-parse: 9.0.0 remark-rehype: 8.1.0 @@ -8286,34 +8532,34 @@ snapshots: transitivePeerDependencies: - supports-color - react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919): + react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.13 - react-remove-scroll@2.7.1(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919): + react-remove-scroll@2.7.1(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) - use-sidecar: 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919) + use-callback-ref: 1.3.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) + use-sidecar: 1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923) optionalDependencies: '@types/react': 19.1.13 - react-style-singleton@2.2.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919): + react-style-singleton@2.2.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923): dependencies: get-nonce: 1.0.1 - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.13 - react@19.2.0-canary-d415fd3e-20250919: {} + react@19.2.0-canary-83c88ad4-20250923: {} read-cache@1.0.0: dependencies: @@ -8425,6 +8671,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + ret@0.1.15: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -8458,7 +8706,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0-canary-d415fd3e-20250919: {} + scheduler@0.27.0-canary-83c88ad4-20250923: {} semver@6.3.1: {} @@ -8583,10 +8831,10 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - sonner@2.0.7(react-dom@19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919))(react@19.2.0-canary-d415fd3e-20250919): + sonner@2.0.7(react-dom@19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923))(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 - react-dom: 19.2.0-canary-d415fd3e-20250919(react@19.2.0-canary-d415fd3e-20250919) + react: 19.2.0-canary-83c88ad4-20250923 + react-dom: 19.2.0-canary-83c88ad4-20250923(react@19.2.0-canary-83c88ad4-20250923) source-map-js@1.2.1: {} @@ -8598,6 +8846,11 @@ snapshots: dependencies: tslib: 2.8.1 + sql-formatter@15.6.9: + dependencies: + argparse: 2.0.1 + nearley: 2.20.1 + stable-hash@0.0.5: {} stop-iteration-iterator@1.1.0: @@ -8686,14 +8939,16 @@ snapshots: strip-json-comments@3.1.1: {} + style-mod@4.1.2: {} + 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-d415fd3e-20250919): + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.2.0-canary-83c88ad4-20250923): dependencies: client-only: 0.0.1 - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 optionalDependencies: '@babel/core': 7.28.4 @@ -8789,7 +9044,7 @@ snapshots: tslib@2.8.1: {} - tw-animate-css@1.3.8: {} + tw-animate-css@1.4.0: {} type-check@0.4.0: dependencies: @@ -8969,24 +9224,24 @@ snapshots: urlpattern-polyfill@10.1.0: {} - use-callback-ref@1.3.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919): + use-callback-ref@1.3.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.13 - use-sidecar@1.1.3(@types/react@19.1.13)(react@19.2.0-canary-d415fd3e-20250919): + use-sidecar@1.1.3(@types/react@19.1.13)(react@19.2.0-canary-83c88ad4-20250923): dependencies: detect-node-es: 1.1.0 - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.13 - use-sync-external-store@1.5.0(react@19.2.0-canary-d415fd3e-20250919): + use-sync-external-store@1.5.0(react@19.2.0-canary-83c88ad4-20250923): dependencies: - react: 19.2.0-canary-d415fd3e-20250919 + react: 19.2.0-canary-83c88ad4-20250923 util-deprecate@1.0.2: {} @@ -9012,6 +9267,8 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + w3c-keyname@2.2.8: {} + web-namespaces@1.1.4: {} web-streams-polyfill@3.3.3: {} diff --git a/schema.graphql b/schema.graphql index bc34327..b53c420 100644 --- a/schema.graphql +++ b/schema.graphql @@ -102,6 +102,16 @@ type Database implements Node { """SQL schema""" schema: String! slug: String! + structure: DatabaseStructure! +} + +type DatabaseStructure { + tables: [DatabaseTable!]! +} + +type DatabaseTable { + columns: [String!]! + name: String! } """ @@ -684,6 +694,8 @@ type Question implements Node { """Question difficulty, e.g. 'easy'""" difficulty: QuestionDifficulty! id: ID! + """Get the last submission for this question.""" + lastSubmission: Submission """Reference answer""" referenceAnswer: String! referenceAnswerResult: SQLExecutionResult! @@ -707,7 +719,9 @@ type Question implements Node { ): SubmissionConnection! """Question title""" title: String! - """List of your submissions for this question.""" + """ + List of your submissions for this question, ordered by submitted at descending. + """ userSubmissions: [Submission!]! }