@@ -134,15 +145,6 @@ export default function SearchResults({
pointerEvents: showOverlay ? 'none' : 'auto'
}}
>
- {/* 가림막 오버레이 */}
- {showOverlay && (
-
- )}
{!searchPerformed ? (
diff --git a/docs/api_docs.md b/docs/api_docs.md
index 61e6415..bbe2129 100644
--- a/docs/api_docs.md
+++ b/docs/api_docs.md
@@ -1,210 +1,594 @@
-# api server docs - api v1
+# API Server Documentation
+**API Version:** v1
-## 목차
+---
-## base url
-- https://api.solidloop-studio.xyz/api/v1
+## Base URL
-## Admin
- - authorization 부분에 supabase jwt토큰을 필수로 넣어야 함.
+| Environment | URL |
+|------------|-----|
+| Production | `https://api.solidloop-studio.xyz/api/v1` |
+
+---
+
+## Authentication
+
+### Admin API
+- 모든 `/admin/*` API는 **Supabase JWT 토큰**이 필요함
+- `Authorization` 헤더에 Bearer Token 형식으로 전달
+
+```
+
+Authorization:
+
+````
+
+---
+
+## Admin API
### Crawler
-#### [GET] /admin/crawler/health
-- 크롤러 채널별로 health 상태를 반환합니다.
-- response schema
+#### GET /admin/crawler/health
+크롤러 채널별 상태를 조회합니다.
+
+**Response**
+
+| Field | Type | Description |
+|------|------|-------------|
+| channels | `{ id: string; healthy: boolean }[]` | 채널별 헬스 상태 |
+
```ts
{
- channels:{id: string, healthy: boolean}[]
+ channels: {
+ id: string;
+ healthy: boolean;
+ }[];
}
-```
+````
+
+---
+
+#### POST /admin/crawler/session
-#### [POST] /admin/crawler/session
-- 크롤러의 세션 정보를 저장합니다.
+크롤러의 세션 정보를 저장합니다.
+
+**Request Body**
+
+| Field | Type | Description |
+| ------------ | ------ | ----------- |
+| channelId | string | 채널 ID |
+| jwtToken | string | JWT 토큰 |
+| refreshToken | string | Refresh 토큰 |
-- Request body
```ts
{
- channelId: string,
- jwtToken: string,
- refreshToken: string
+ channelId: string;
+ jwtToken: string;
+ refreshToken: string;
}
```
-- response schema
+**Response**
+
```ts
- { message: 'Session saved successfully' }
+{
+ message: "Session saved successfully";
+}
```
-#### [POST] /admin/crawler/restart/:channelId
-- 해당 채널의 크롤러를 재시작 합니다
+---
+
+#### POST /admin/crawler/restart/:channelId
+
+특정 채널의 크롤러를 재시작합니다.
+
+**Path Parameter**
+
+| Name | Type | Description |
+| --------- | ------ | ----------- |
+| channelId | string | 크롤러 채널 ID |
+
+**Response**
-- response schema
```ts
{
- status: "ok",
- channel: channelId
+ status: "ok",
+ channel: string
}
```
+---
+
### Logs
-#### [GET] /admin/logs/api-server
-- api-server의 로그 조회
-- Parameters
- - date: 조회할 로그의 날짜 (형식 YYYY-MM-DD, 기본값 오늘 날짜)
-
-- Response
- - text/plain
+#### GET /admin/logs/api-server
+
+API 서버 로그를 조회합니다.
+
+**Query Parameters**
+
+| Name | Type | Default | Description |
+| ---- | ------ | ------- | -------------------- |
+| date | string | 오늘 날짜 | 로그 날짜 (`YYYY-MM-DD`) |
+
+**Response**
+
+* `text/plain`
+
+---
+
+#### GET /admin/logs/crawler
+
+크롤러 로그를 조회합니다.
-#### [GET] /admin/logs/crawler
-- crawlwe의 로그 조회
+**Query Parameters**
-- Parameters
- - date: 조회할 로그의 날짜 (형식 YYYY-MM-DD, 기본값 오늘 날짜)
-
-- Response
- - text/plain
+| Name | Type | Default | Description |
+| ---- | ------ | ------- | -------------------- |
+| date | string | 오늘 날짜 | 로그 날짜 (`YYYY-MM-DD`) |
-## User
-### [GET] /profile/total
-- 등록된 총 사용자 수 조회
+**Response**
+
+* `text/plain`
+
+---
+
+### Item (Admin)
+
+- 아이템 조회시 각 페이지당 최대 30개의 아이템입니다.
+
+#### GET /admin/item/items
+
+아이템 목록을 조회합니다.
+
+**Query Parameters**
+
+| Name | Type | Description |
+| ------ | ------ | ---------------- |
+| page | number | 페이지 번호 |
+
+---
+
+**Response**
+
+```ts
+{
+ items: {
+ id: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ group: string;
+ options: {
+ gEXP?: number; // 획득 경험치
+ hEXP?: number; // 분당 추가 경험치
+ gMNY?: number; // 획득 핑
+ hMNY?: number; // 분당 추가 핑
+ [key: string]: number;
+ };
+ }[];
+ totalCount: number;
+ currentPage: number;
+ totalPages: number;
+}
+```
+
+---
+
+### GET /admin/item/items/group/:group
+
+특정 그룹의 아이템 목록을 조회합니다.
+
+**Path Parameter**
+| Name | Type | Description |
+| ----- | ------ | ------------- |
+| group | string | 아이템 그룹 이름 |
+
+---
+**Response**
+
+```ts
+{
+ items: {
+ id: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ group: string;
+ options: {
+ gEXP?: number; // 획득 경험치
+ hEXP?: number; // 분당 추가 경험치
+ gMNY?: number; // 획득 핑
+ hMNY?: number; // 분당 추가 핑
+ [key: string]: number;
+ };
+ }[];
+ totalCount: number;
+ currentPage: number;
+ totalPages: number;
+}
+```
+
+---
+
+### GET /admin/item/items/name/:name
+
+특정 이름을 포함하는 아이템 목록을 조회합니다.
+
+**Path Parameter**
+| Name | Type | Description |
+| ----- | ------ | ------------- |
+| name | string | 아이템 이름 일부 |
+
+---
+
+**Response**
+
+```ts
+{
+ items: {
+ id: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ group: string;
+ options: {
+ gEXP?: number; // 획득 경험치
+ hEXP?: number; // 분당 추가 경험치
+ gMNY?: number; // 획득 핑
+ hMNY?: number; // 분당 추가 핑
+ [key: string]: number;
+ };
+ }[];
+ totalCount: number;
+ currentPage: number;
+ totalPages: number;
+}
+```
+
+---
+
+### POST /admin/item
+
+아이템을 추가합니다.
+
+**Request Body**
+| Field | Type | Description |
+| ----------- | ------ | -------------- |
+| id | string | 아이템 ID |
+| name | string | 아이템 이름 |
+| description | string | 아이템 설명 |
+| group | string | 아이템 그룹 이름 |
+| options | object | 아이템 옵션 |
+
+```ts
+{
+ id: string;
+ name: string;
+ description: string;
+ group: string;
+ options: object;
+}
+```
+
+---
+Response (201)
+
+```ts
+{
+ id: string;
+ group: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ options: object;
+}
+```
+
+---
+
+### PUT /admin/item/:id
+
+아이템 정보를 수정합니다.
+
+**Path Parameter**
+| Name | Type | Description |
+| ---- | ------ | ----------- |
+| id | string | 아이템 ID |
+
+**Request Body**
+| Field | Type | Description |
+| ----------- | ------ | -------------- |
+| name | string | 아이템 이름 |
+| description | string | 아이템 설명 |
+| group | string | 아이템 그룹 이름 |
+| options | object | 아이템 옵션 |
+
+```ts
+{
+ name?: string;
+ description?: string;
+ group?: string;
+ options?: object;
+}
+```
+
+---
+**Response (200)**
+
+```ts
+{
+ id: string;
+ group: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ options: object;
+}
+```
+
+---
+
+### DELETE /admin/item/:id
+
+아이템을 삭제합니다.
+
+**Path Parameter**
+| Name | Type | Description |
+| ---- | ------ | ----------- |
+| id | string | 아이템 ID |
+
+---
+**Response (204)**
+No Content - 성공적으로 삭제됨
+
+
+---
+
+## User API
+
+### GET /profile/total
+
+등록된 총 사용자 수를 조회합니다.
+
+**Response**
-#### Response
```ts
{
data: {
- totalUsers: number
+ totalUsers: number;
},
- status: 200
+ status: 200;
+}
+```
+
+---
+
+### GET /profile/:query
+
+유저 프로필 정보를 조회합니다.
+
+**Path Parameter**
+
+| Name | Type | Description |
+| ----- | ------ | ------------- |
+| query | string | 닉네임 또는 사용자 ID |
+
+**Query Parameters**
+
+| Name | Type | Description | Values |
+| ---- | ------ | ----------- | ------------ |
+| type | string | query의 유형 | `nick`, `id` |
+
+---
+
+#### Response (200)
+
+```ts
+{
+ data: {
+ user: {
+ id: string;
+ nickname: string;
+ exp: number;
+ observedAt: string; // ISO format
+ exordial: string;
+ level: number;
+ isPublic: boolean;
+ isLastOnlineHidden: boolean;
+ };
+ equipment: {
+ userId: string;
+ slot: string;
+ itemId: string;
+ }[];
+ record: {
+ id: string;
+ userId: string;
+ modeId: string;
+ total: number;
+ win: number;
+ exp: number;
+ playtime: number; // ms
+ }[];
+ presence: {
+ userId: string;
+ channelId: string | null;
+ roomId: string | null;
+ crawlerId: string;
+ updatedAt: string | null; // ISO format, if isLastOnlineHidden is true then null
+ };
+ };
+ status: 200;
+}
+```
+
+#### Error Codes
+
+| Status | Description |
+| ------ | ----------- |
+| 403 | 유저 정보가 비공개 |
+| 404 | 등록되지 않은 유저 |
+
+---
+### GET /profile/nickname/:nickname
+
+유저 정보를 조회합니다. 중복된 닉네임을 처리하기 위함입니다.
+
+**Path Parameter**
+
+| Name | Type | Description |
+| ----- | ------ | ------------- |
+| nickname | string | 닉네임 |
+
+---
+
+#### Response (200)
+
+```ts
+{
+ data: {
+ user: {
+ id: string;
+ nickname: string;
+ exp: number;
+ observedAt: string; // ISO format
+ exordial: string;
+ level: number;
+ isPublic: boolean;
+ isLastOnlineHidden: boolean;
+ };
+ equipment: {
+ userId: string;
+ slot: string;
+ itemId: string;
+ }[];
+ record: {
+ id: string;
+ userId: string;
+ modeId: string;
+ total: number;
+ win: number;
+ exp: number;
+ playtime: number; // ms
+ }[];
+ presence: {
+ userId: string;
+ channelId: string | null;
+ roomId: string | null;
+ crawlerId: string;
+ updatedAt: string | null; // ISO format, if isLastOnlineHidden is true then null
+ };
+ }[];
+ status: 200;
+}
+```
+
+---
+
+## Item API
+
+### GET /item
+
+아이템 정보를 조회합니다.
+
+**Query Parameters**
+
+| Name | Type | Description |
+| ----- | ------ | ------------------ |
+| query | string | 조회할 아이템 ID (쉼표 구분) |
+
+**Response**
+
+```ts
+{
+ data: {
+ id: string;
+ name: string;
+ description: string;
+ updatedAt: number;
+ group: string;
+ options: {
+ gEXP?: number; // 획득 경험치
+ hEXP?: number; // 분당 추가 경험치
+ gMNY?: number; // 획득 핑
+ hMNY?: number; // 분당 추가 핑
+ [key: string]: number;
+ };
+ };
+ status: 200;
+}
+```
+
+---
+
+## Mode API
+
+### GET /mode
+
+전체 모드 정보를 조회합니다.
+
+**Response**
+
+```ts
+{
+ data: {
+ modeId: string;
+ modeName: string;
+ group: string;
+ }[];
+ status: 200;
}
```
-### [GET] /profile/:query
-- 유저 프로필 조회
-
-- Parameters
- - query: string / 닉네임 또는 사용자 ID
- - type: string / 쿼리의 유형 (닉네임 또는 사용자 ID) / Available values : nick, id
+---
+
+## Ranking API
+
+### GET /ranking/:mode
+
+모드별 랭킹을 조회합니다.
+
+**Path Parameter**
+
+| Name | Type | Description |
+| ---- | ------ | ------------------------ |
+| mode | string | 모드 ID (`ALL` 사용 시 전체 합산) |
+
+**Query Parameters**
+
+| Name | Type | Default | Description |
+| ------ | ------ | ------- | ------------------------- |
+| page | number | 1 | 페이지 번호 |
+| option | string | - | `win` (승리 수), `exp` (경험치), `total` (총 플레이 판 수) |
+
+---
+
+**Response**
-Response
-- code 200
```ts
{
- data:{
- user: {
- id: string,
- nickname: string,
- exp: number,
- observedAt: string, // iso format
- exordial: string,
- level: number
- },
- equipment: {
- userId: string,
- slot: string,
- itemId: string
- }[],
- record: {
- id: string,
- userId: string,
- modeId: string,
- total: number,
- win: number,
- exp: number,
- playtime: number // ms
- }[],
- presence: {
- userId: string,
- channelId: string | null,
- roomId: string | null,
- crawlerId: string,
- updatedAt: string // ios format
- }
- },
- status: 200
-}
-```
-- code 404
-등록된 유저가 아님.
-
-
-## Item
-### [GET] /item
-- 아이템 정보 조회
-
-Parameters:
-- query: 조회할 아이템 ID들 (쉼표로 구분)
-
-Response:
-```ts
-{
- data: {
- id: string,
- name: string,
- description: string,
- updatedAt: number,
- group: string,
- options: {
- gEXP?: number, // 획득 경험치
- hEXP?: number, // 분당 추가 경험치
- gMNY?: number, // 획득 핑
- hMNY?: number, // 분당 추가 핑
- [key: string]: number
- }
- },
- status: 200
-}
-```
-
-## Mode
-### [GET] /mode
-- 모드 전체 정보 조회
-
-Response:
-```ts
-{
- data: {
- modeId: string,
- modeName: string,
- group: string
- }[],
- status: 200
-}
-```
-
-## Ranking
-### [GET] /ranking/:mode
-- 모드에 맞는 랭킹 조회
-
-Parameters:
-- mode: 랭킹을 조회할 모드 ID
-- page: 페이지 번호 (기본값 1)
-- option: 랭킹 옵션 (win 승리수 기준, exp 경험치 기준)
-
-Response:
-```ts
-{
- data:{
- rank: number,
- userRecord: {
- id: number,
- userId: string,
- modeId: string,
- total: number,
- win: number,
- exp: number,
- playtime: number
- },
- userInfo: {
- id: string,
- nickname: string,
- exp: number,
- observedAt: string, // iso format
- exordial: string,
- level: number
- }
- },
- status: 200
-}
-```
\ No newline at end of file
+ data: {
+ rank: number;
+ userRecord: {
+ id: number;
+ userId: string;
+ modeId: string;
+ total: number;
+ win: number;
+ exp: number;
+ playtime: number;
+ };
+ userInfo: {
+ id: string;
+ nickname: string;
+ exp: number;
+ observedAt: string;
+ exordial: string;
+ level: number;
+ };
+ };
+ status: 200;
+}
+```
diff --git a/package-lock.json b/package-lock.json
index b93305f..0dcc764 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -32,6 +32,8 @@
"@reduxjs/toolkit": "^2.5.0",
"@supabase/ssr": "^0.6.1",
"@supabase/supabase-js": "^2.48.1",
+ "@tailwindcss/typography": "^0.5.19",
+ "@tanstack/react-query": "^5.90.20",
"@tanstack/react-table": "^8.21.2",
"@tanstack/react-virtual": "^3.13.9",
"@types/react-window": "^1.8.8",
@@ -60,6 +62,7 @@
"react-redux": "^9.2.0",
"react-window": "^1.8.11",
"recharts": "^2.15.3",
+ "remark-gfm": "^4.0.1",
"swr": "^2.3.3",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
@@ -149,14 +152,24 @@
}
},
"node_modules/@actions/http-client": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.0.tgz",
- "integrity": "sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.2.tgz",
+ "integrity": "sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"tunnel": "^0.0.6",
- "undici": "^5.28.5"
+ "undici": "^6.23.0"
+ }
+ },
+ "node_modules/@actions/http-client/node_modules/undici": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
+ "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
}
},
"node_modules/@actions/io": {
@@ -2113,13 +2126,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
@@ -2815,9 +2825,9 @@
}
},
"node_modules/@emnapi/core": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
- "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -3582,6 +3592,7 @@
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
"integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"minipass": "^7.0.4"
},
@@ -4231,9 +4242,9 @@
}
},
"node_modules/@next/env": {
- "version": "15.5.9",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz",
- "integrity": "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz",
+ "integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
@@ -4247,9 +4258,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz",
- "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz",
+ "integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==",
"cpu": [
"arm64"
],
@@ -4263,9 +4274,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz",
- "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz",
+ "integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==",
"cpu": [
"x64"
],
@@ -4279,9 +4290,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz",
- "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz",
+ "integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==",
"cpu": [
"arm64"
],
@@ -4295,9 +4306,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz",
- "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz",
+ "integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==",
"cpu": [
"arm64"
],
@@ -4311,9 +4322,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz",
- "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz",
+ "integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==",
"cpu": [
"x64"
],
@@ -4327,9 +4338,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz",
- "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz",
+ "integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==",
"cpu": [
"x64"
],
@@ -4343,9 +4354,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz",
- "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz",
+ "integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==",
"cpu": [
"arm64"
],
@@ -4359,9 +4370,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.5.7",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz",
- "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz",
+ "integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==",
"cpu": [
"x64"
],
@@ -6547,6 +6558,57 @@
"tslib": "^2.8.0"
}
},
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
+ "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ }
+ },
+ "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.90.20",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz",
+ "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.90.20",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.20.tgz",
+ "integrity": "sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.90.20"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
"node_modules/@tanstack/react-table": {
"version": "8.21.2",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.2.tgz",
@@ -8155,12 +8217,13 @@
}
},
"node_modules/axios": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz",
- "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==",
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
+ "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
+ "license": "MIT",
"dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
@@ -8669,6 +8732,7 @@
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
"integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=18"
}
@@ -9092,9 +9156,9 @@
}
},
"node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"license": "MIT"
},
"node_modules/d3-array": {
@@ -9542,9 +9606,9 @@
"license": "Apache-2.0"
},
"node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
@@ -10645,9 +10709,9 @@
"license": "ISC"
},
"node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
@@ -10691,9 +10755,10 @@
}
},
"node_modules/form-data": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
- "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -13361,9 +13426,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT"
},
"node_modules/lodash.camelcase": {
@@ -13507,6 +13572,16 @@
"tmpl": "1.0.5"
}
},
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz",
@@ -13516,6 +13591,34 @@
"node": ">= 0.4"
}
},
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/mdast-util-from-markdown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
@@ -13539,6 +13642,107 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/mdast-util-mdx-expression": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
@@ -13763,6 +13967,127 @@
"micromark-util-types": "^2.0.0"
}
},
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/micromark-factory-destination": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
@@ -14208,6 +14533,7 @@
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
"integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"minipass": "^7.1.2"
},
@@ -14289,12 +14615,12 @@
"license": "MIT"
},
"node_modules/next": {
- "version": "15.5.9",
- "resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz",
- "integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==",
+ "version": "15.5.12",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz",
+ "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==",
"license": "MIT",
"dependencies": {
- "@next/env": "15.5.9",
+ "@next/env": "15.5.12",
"@swc/helpers": "0.5.15",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
@@ -14307,14 +14633,14 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "15.5.7",
- "@next/swc-darwin-x64": "15.5.7",
- "@next/swc-linux-arm64-gnu": "15.5.7",
- "@next/swc-linux-arm64-musl": "15.5.7",
- "@next/swc-linux-x64-gnu": "15.5.7",
- "@next/swc-linux-x64-musl": "15.5.7",
- "@next/swc-win32-arm64-msvc": "15.5.7",
- "@next/swc-win32-x64-msvc": "15.5.7",
+ "@next/swc-darwin-arm64": "15.5.12",
+ "@next/swc-darwin-x64": "15.5.12",
+ "@next/swc-linux-arm64-gnu": "15.5.12",
+ "@next/swc-linux-arm64-musl": "15.5.12",
+ "@next/swc-linux-x64-gnu": "15.5.12",
+ "@next/swc-linux-x64-musl": "15.5.12",
+ "@next/swc-win32-arm64-msvc": "15.5.12",
+ "@next/swc-win32-x64-msvc": "15.5.12",
"sharp": "^0.34.3"
},
"peerDependencies": {
@@ -15557,12 +15883,6 @@
"node": ">=4"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "license": "MIT"
- },
"node_modules/regexp.prototype.flags": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
@@ -15633,6 +15953,24 @@
"node": ">=6"
}
},
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/remark-parse": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
@@ -15664,6 +16002,21 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -16540,16 +16893,17 @@
}
},
"node_modules/supabase": {
- "version": "2.62.5",
- "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.62.5.tgz",
- "integrity": "sha512-KjR57sEwNpTLOMHo+Nt9bHtq9RGWV0GGp6MWALp7RQtOcZdUopUOH+hoOojAuVyk4ChOipB7POu0y3vssW272A==",
+ "version": "2.76.6",
+ "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.76.6.tgz",
+ "integrity": "sha512-VewP9LqtOhJZaZR75vcM99Q8exjPjBm9YiMvBn04zx1ikdX1DNPmzAilBJLK/ivjPDxMTlmag6+iJvJ+B+mIOA==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
"bin-links": "^6.0.0",
"https-proxy-agent": "^7.0.2",
"node-fetch": "^3.3.2",
- "tar": "7.5.2"
+ "tar": "7.5.7"
},
"bin": {
"supabase": "bin/supabase"
@@ -16714,10 +17068,11 @@
}
},
"node_modules/tar": {
- "version": "7.5.2",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
- "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
+ "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/fs-minipass": "^4.0.0",
"chownr": "^3.0.0",
@@ -17419,9 +17774,9 @@
}
},
"node_modules/use-sync-external-store": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
- "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -17880,6 +18235,7 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
"integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=18"
}
diff --git a/package.json b/package.json
index c9942f3..7143151 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,8 @@
"@reduxjs/toolkit": "^2.5.0",
"@supabase/ssr": "^0.6.1",
"@supabase/supabase-js": "^2.48.1",
+ "@tailwindcss/typography": "^0.5.19",
+ "@tanstack/react-query": "^5.90.20",
"@tanstack/react-table": "^8.21.2",
"@tanstack/react-virtual": "^3.13.9",
"@types/react-window": "^1.8.8",
@@ -68,6 +70,7 @@
"react-redux": "^9.2.0",
"react-window": "^1.8.11",
"recharts": "^2.15.3",
+ "remark-gfm": "^4.0.1",
"swr": "^2.3.3",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
diff --git a/supabase/.temp/cli-latest b/supabase/.temp/cli-latest
index 8c68db7..1dd6178 100644
--- a/supabase/.temp/cli-latest
+++ b/supabase/.temp/cli-latest
@@ -1 +1 @@
-v2.67.1
\ No newline at end of file
+v2.75.0
\ No newline at end of file
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 773b1e6..9e136e2 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -58,5 +58,5 @@ export default {
}
}
},
- plugins: [require("tailwindcss-animate")],
+ plugins: [require("tailwindcss-animate"), require("@tailwindcss/typography")],
} satisfies Config;