diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
new file mode 100644
index 0000000..0336090
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.md
@@ -0,0 +1,21 @@
+---
+name: bug report
+about: 버그 보고하기
+title: "[BUG] bug 내용"
+labels: "\U0001F41B bug"
+assignees: ''
+
+---
+
+
+
+## 🌴 작업 브랜치
+
+## 🐛 BUG 개요
+
+## 🚧 BUG 리포트
+
+## ✅ TODO 및 진행현황
+
+- [ ] todo1
+- [ ] todo2
diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md
new file mode 100644
index 0000000..7454e6a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature.md
@@ -0,0 +1,21 @@
+---
+name: feature
+about: 새로운 기능 구현하기
+title: "[FEATURE] view_feature 내용"
+labels: "✨ feature"
+assignees: ''
+
+---
+
+
+
+## 🌴 작업 브랜치
+
+## 🖥️ 개발 화면 캡쳐
+
+## 💼 TASK 개요
+
+## ✅ TODO 및 진행현황
+
+- [ ] todo1
+- [ ] todo2
diff --git a/.github/ISSUE_TEMPLATE/hotfix.md b/.github/ISSUE_TEMPLATE/hotfix.md
new file mode 100644
index 0000000..8442405
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/hotfix.md
@@ -0,0 +1,19 @@
+---
+name: hotfix
+about: 빠르게 수정하기
+title: "[HOTFIX] hotfix 내용"
+labels: "\U0001F525 hotfix"
+assignees: ''
+
+---
+
+
+
+## 🌴 작업 브랜치
+
+## 💼 TASK 개요
+
+## ✅ TODO 및 진행현황
+
+- [ ] todo1
+- [ ] todo2
diff --git a/.github/ISSUE_TEMPLATE/refactor.md b/.github/ISSUE_TEMPLATE/refactor.md
new file mode 100644
index 0000000..2ce739b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/refactor.md
@@ -0,0 +1,19 @@
+---
+name: refactor
+about: 리팩토링하기
+title: "[REFACTOR] refactor 내용"
+labels: "⚒️ refactor"
+assignees: ''
+
+---
+
+
+
+## 🌴 작업 브랜치
+
+## 🔨 Refactor 개요
+
+## ✅ TODO 및 진행현황
+
+- [ ] todo1
+- [ ] todo2
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..f715255
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,16 @@
+
+
+## 🖥️ 개발 화면 캡쳐
+
+
+## ✨ 구현 기능 명세
+
+
+
+## ✅ PR Point
+
+
+
+## 😭 어려웠던 점
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..734f55c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# env files (can opt-in for committing if needed)
+.env*
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+*.xml
+*.iml
+
+/test-results/*
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..c3f502a
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 디폴트 무시된 파일
+/shelf/
+/workspace.xml
+# 에디터 기반 HTTP 클라이언트 요청
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..8f7ac14
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "singleQuote": true,
+ "semi": false,
+ "useTabs": false,
+ "tabWidth": 2,
+ "trailingComma": "es5",
+ "printWidth": 120,
+ "plugins": ["prettier-plugin-tailwindcss"]
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..3db358c
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["github.copilot-chat"]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e546350
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "biome.enabled": false
+}
diff --git a/README.md b/README.md
index db1967c..215f946 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,279 @@
-# OnKu
+# 큐-첵 (Ku-check): 큐시즘의 모든 일을 한큐에 체크하다, 큐첵
+🔗 서비스 링크: https://ku-check.vercel.app
+
+큐첵 소개
+🎨 서비스 설명
+큐첵은 큐시즘 운영에 흩어져 있던 출결, 상벌점, 공지, 불참사유서 제출을 하나로 통합해 학회 운영을 더 정확하고 간편하게 만드는 전용 관리 서비스입니다.
+운영진은 반복적인 수기 행정을 줄일 수 있고, 학회원은 내 활동 현황과 이번 주 핵심 정보를 한 곳에서 확인하며 불참사유서까지 앱에서 바로 제출할 수 있습니다.
+
+## 🤝 팀원 소개
+
+
+ Frontend (FE)
+
+
+
+
+
+ 황유림
+ Frontend Lead
+
+
+
+ 진채정
+ Frontend
+
+
+
+
+
+
+## 🛠 기술 스택
+
+| 기술 / 도구 | 선택이유 |
+|------|-------------|
+| Next.js | Next.js를 도입한 핵심 목표는 사용자 성능 향상입니다. SSR/SSG를 통한 빠른 초기 로딩 속도 확보, 자동 이미지 최적화, 유연한 레이아웃 시스템 등 Next.js가 제공하는 강력한 최적화 이점들을 적극 활용하여 사용자 경험(UX)을 극대화하고자 했습니다. |
+| TypeScript | TypeScript를 도입한 가장 큰 이유는 정적 타입 검사를 통해 런타임 에러를 개발 단계에서 미리 차단하여 서비스의 안정성을 극대화하기 위해서입니다. 또한, 명확한 타입 추론과 강력한 자동 완성 기능은 코드의 가독성과 개발 생산성을 높여주었으며, 유지보수성을 확보하는 데 결정적인 역할을 했습니다.|
+| pnpm | pnpm을 도입한 가장 큰 이유는 압도적인 디스크 공간 효율성과 빠른 설치 속도 때문입니다. npm/yarn과 달리 node_modules에 패키지를 복제하지 않고 전역 스토어에서 하드 링크(Hard Link) 방식으로 파일을 가져와, 디스크 사용량을 획기적으로 줄이고 중복 설치를 방지합니다. 또한, package.json에 명시된 의존성에만 접근할 수 있는 엄격한 node_modules 구조를 구현하여, '유령 의존성(Phantom Dependencies)' 문제를 원천적으로 차단하고 프로젝트의 안정성을 높여줍니다.|
+| TailwindCSS | TailwindCSS는 '유틸리티 퍼스트(Utility-First)' 접근 방식은 미리 정의된 클래스를 JSX/HTML 내에서 직접 조합하게 하여, CSS 파일과 코드를 오가는 컨텍스트 스위칭 비용을 완전히 제거했습니다. 직관적인 반응형 디자인과 상태 관리를 통해 개발 생산성을 높일 수 있었습니다.|
+| Zustand | Zustand는 매우 간결한 문법과 최소한의 설정으로 상태 관리를 가능하게 해 개발 생산성을 극대화합니다. 또한, Provider로 감쌀 필요가 없고 상태의 필요한 부분만 구독하여 불필요한 리렌더링을 자동으로 방지하기 때문에 성능 최적화에 유리하여 선택하게 되었습니다.|
+| E2E | E2E 테스트를 도입한 이유는 '실제 사용자' 관점에서 핵심 기능(회원가입, 큐픽, 불참사유서 작성)의 전체 흐름을 시뮬레이션하여, 애플리케이션의 무결성을 보장하기 위해서입니다. 이는 유닛/통합 테스트가 발견하기 어려운 프론트엔드, 백엔드 API, DB를 아우르는 복합적인 상호작용에서 발생하는 버그를 잡아내며, 배포 전 가장 높은 수준의 서비스 안정성을 확보하게 해줍니다.|
+
+
+## 🗂️ 폴더 구조
+```
+KuCheck-Front/
+├── src/
+│ ├── app/ # Next.js App Router - 페이지 및 레이아웃
+│ │ ├── layout.tsx # 루트 레이아웃
+│ │ ├── route.ts # 홈페이지
+│ │ ├── (auth)/ # 인증 관련 라우트 그룹
+│ │ ├── (manager)/ # 매니저 기능 라우트 그룹
+│ │ └── (member)/ # 멤버 기능 라우트 그룹
+│ │
+│ ├── components/ # 재사용 가능한 React 컴포넌트
+│ │ ├── common/ # 공통 컴포넌트 (Header, Footer, Sidebar 등)
+│ │ ├── ui/ # UI 원자 컴포넌트 (Button, Input, Modal 등)
+│ │ ├── manager/ # 매니저 전용 컴포넌트
+│ │ │ ├── QRCodeScanner/
+│ │ │ ├── AttendanceList/
+│ │ │ └── ...
+│ │ └── member/ # 멤버 전용 컴포넌트
+│ │ ├── CheckIn/
+│ │ ├── AbsenceForm/
+│ │ └── ...
+│ │
+│ ├── hooks/ # 커스텀 React Hooks
+│ │ ├── useAuth.ts # 인증 관련 훅
+│ │ ├── useAttendance.ts # 출석 관련 훅
+│ │ ├── useFetch.ts # API 요청 관리 훅
+│ │ └── ...
+│ │
+│ ├── lib/ # 유틸리티 및 라이브러리 설정
+│ │ ├── api/ # API 클라이언트
+│ │ │ ├── axiosInstance.ts # Axios 설정
+│ │ │ └── endpoints.ts # API 엔드포인트 정의
+│ │ ├── utils/ # 공통 유틸리티 함수들
+│ │ │ ├── imageOptimizer.ts # 이미지 최적화
+│ │ │ ├── dateFormatter.ts # 날짜 포맷팅
+│ │ │ └── ...
+│ │ └── ...
+│ │
+│ ├── store/ # Zustand 상태 관리
+│ │ ├── authStore.ts # 인증 상태
+│ │ ├── attendanceStore.ts # 출석 상태
+│ │ └── ...
+│ │
+│ ├── types/ # TypeScript 타입 정의
+│ │ ├── attendance.ts # 출석 관련 타입
+│ │ ├── user.ts # 사용자 관련 타입
+│ │ ├── api.ts # API 응답 타입
+│ │ └── ...
+│ │
+│ ├── constants/ # 상수 정의
+│ │ ├── routes.ts # 라우트 경로
+│ │ ├── messages.ts # 에러/성공 메시지
+│ │ └── ...
+│ │
+│ ├── assets/ # icons
+│ │ ├── images/
+│ │ ├── icons/
+│ │ └── fonts/
+│ │
+│ ├── utils/ # 전역 유틸리티 함수
+│ │ ├── validators.ts # 입력 검증 함수
+│ │ ├── errorHandler.ts # 에러 처리
+│ │ └── ...
+│ │
+│ └── middleware.ts # Next.js 미들웨어 (인증 체크 등)
+│
+├── tests/ # E2E 테스트 (Playwright)
+│ ├── signup.spec.ts # 회원가입 플로우 테스트
+│ ├── attendance.spec.ts # 출석 기능 테스트
+│ └── ...
+│
+├── public/ # 정적 파일 (이미지, 폰트 등)
+│
+├── package.json # 프로젝트 메타데이터 및 의존성
+├── tsconfig.json # TypeScript 설정
+├── next.config.ts # Next.js 설정
+├── tailwind.config.ts # Tailwind CSS 설정
+├── eslint.config.mjs # ESLint 설정
+└── .prettierrc # Prettier 설정
+```
+
+---
+
+## 📁 폴더별 상세 설명
+
+### **src/app**
+Next.js의 App Router 기반 라우팅 시스템입니다. 폴더 구조가 곧 URL 경로가 되어 직관적인 페이지 관리가 가능합니다. 라우트 그룹(`(auth)`, `(manager)`, `(member)`)을 사용하여 공통 레이아웃을 공유하면서도 URL 경로에 포함되지 않게 관리합니다.
+
+### **src/components**
+재사용 가능한 React 컴포넌트를 기능과 역할에 따라 분류했습니다.
+- **common**: 모든 페이지에서 공통으로 사용되는 Header, Footer, Navigation 등
+- **ui**: shadcn/ui 기본 UI 요소들
+- **manager/member**: 각 사용자 역할별 전용 컴포넌트
+
+### **src/hooks**
+React의 Hooks를 활용한 로직 재사용입니다. API 호출, 상태 관리, 폼 처리 등 복잡한 로직을 분리하여 컴포넌트의 순수성을 유지하고 테스트 가능성을 높입니다.
+
+### **src/lib**
+공통 라이브러리 및 도구들을 관리합니다.
+- **client**: CSR API 엔드포인트 관리
+- **server**: SSR API 엔드포인트 관리
+
+### **src/store**
+Zustand를 사용한 전역 상태 관리입니다. 각 도메인별로 스토어를 분리하여 필요한 상태만 구독하고 불필요한 리렌더링을 방지합니다.
+
+### **src/types**
+TypeScript의 인터페이스와 타입을 중앙집중식으로 관리합니다. API 응답, 컴포넌트 Props, 도메인 모델 등을 명확하게 정의하여 개발 안정성을 높입니다.
+
+### **src/constants**
+매직 스트링(magic string)과 하드코딩된 값들을 제거합니다. 라우트 경로, 메시지, 설정값 등을 한곳에서 관리하여 유지보수성을 향상시킵니다.
+
+### **src/utils**
+전역 유틸리티 함수로, 입력 검증, 에러 처리, 데이터 변환 등 애플리케이션 전체에서 필요한 기능들을 담당합니다.
+
+### **tests**
+Playwright를 사용한 E2E 테스트입니다. 실제 사용자 관점에서 회원가입, 출석 체크인, 불참사유서 제출 등 핵심 기능 흐름을 자동화하여 배포 전 품질을 검증합니다.
+
+---
+
+### 주요 설계 원칙
+
+1. **도메인 기반 구조**: 기능별로 폴더를 구분하여 확장성과 유지보수성을 확보
+2. **단일 책임 원칙**: 각 파일/폴더는 하나의 명확한 책임을 가짐
+3. **타입 안정성**: TypeScript를 철저히 활용하여 런타임 에러 사전 방지
+4. **성능 최적화**: Next.js의 이미지 최적화, 동적 import, 코드 분할 활용
+5. **테스트 가능성**: 로직을 컴포넌트에서 분리하여 E2E 테스트 커버리지 극대화
+
+---
+
+## 📈 개선 경험
+
+### 1️⃣ 출석체크 페이지 이미지 로딩 속도가 느리다
+
+| 목차 | 설명 |
+|------|-------------|
+| 문제 상황 | 저희 서비스 메인 로직인 출석체크 페이지에서 나의 프로필을 불러오는 이미지 부분의 로딩 속도가 현저하게 떨어지는 문제가 발생하였습니다. **LCP 29.6초**, **실질적인 체감으로는 5-6초 정도 이후 이미지가 로드** 되는 문제점이 있었습니다. 충분히 사용자가 느끼기도 **"느리다"** 판단될 것이라 생각하였고, 이 때문에 전체적인 앱서비스 완성도가 떨어져보이는 문제점이 있다고 판단하여 개선을 진행하였습니다. |
+| 해결 과정 | 처음에는 Image 태그 속성의 `fetchPriority={'high'}` 와 이미지 사이즈를 지정하여 이미지 최적화를 진행해보았고, next.config.js 이미지 리사이징 설정, 캐시 설정을 진행하여 LCP 지수를 감소시키고자 하였습니다. `deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840]` `imageSizes: [16, 32, 48, 64, 96, 128, 256, 384]` `minimumCacheTTL: 60 * 60 * 24 * 365` 하지만 여전히 동일한 성능 지수를 나타내고 있었고, Image 태그 속성만으로는 이미지 최적화가 어렵겠다는 판단을 하게 되었습니다. Cloudinary, ImageKit, UploadCare와 같은 이미지 최적화 라이브러리 사용을 고려했으나, **근본적인 문제를 포장하기 위해 또 다른 라이브러리를 추가하는 것이 과연 올바른 해결책인가** 하는 의문이 들었습니다. 따라서 사고를 전환하여 **"아예 업로드 단계에서 이미지 용량을 줄여볼까?"** 하는 접근을 시도했습니다. 저희 서비스는 출석체크, 상벌점, 세션 장소 공지 등이 주요 기능이었기 때문에 이미지는 중요도가 낮았습니다. 특히 출석체크 페이지의 프로필 이미지는 모바일 화면에서만 사용되므로 큰 크기와 용량이 필요하지 않았습니다. **[1] 이미지 리사이징** 종횡비 유지하며 최대 크기 제한: `let { width, height } = img` `const aspectRatio = width / height` `if (width > maxWidth) { width = maxWidth; height = width / aspectRatio }` `if (height > maxHeight) { height = maxHeight; width = height * aspectRatio }` 📊 효과: 4000×3000 → 1920×1080 축소 시 파일 크기 대폭 감소 **[2] Canvas 화질 최적화** 리사이징 시 이미지 품질 보존: `ctx.imageSmoothingEnabled = true` `ctx.imageSmoothingQuality = 'high'` 📊 효과: 품질 저하로 인한 재압축 방지, 단일 최적화 단계로 효율화 **[3] Quality 파라미터 제어** JPEG 압축률 최적화: `quality = 0.8` 📊 효과: 지각할 수 없는 수준의 손실 압축으로 파일 크기 최적화 **[4] 정수 반올림으로 렌더링 최적화** 소수점 캔버스 크기 제거: `canvas.width = Math.round(width)` `canvas.height = Math.round(height)` 📊 효과: 렌더링 성능 향상, 캔버스 그리기 시간 단축 (29초 → 18초) **[5] WebP 변환** 확장자를 JPEG/PNG에서 WebP로 변경: `if (shouldConvertToWebP) { blob = await convertToWebP(canvas, quality) }` 📊 효과: 20~30% 크기 감소로 이미지 다운로드 시간 단축 |
+| 결과 | **LCP 성능 지수 개선: 29.6초 → 18.8초 → 13.8초** 업로드 단계에서의 이미지 리사이징, Canvas 화질 최적화, Quality 파라미터 제어, 정수 반올림, WebP 변환 등 다양한 최적화 기법을 조합하여 **74% 성능 개선**을 달성했습니다. 백엔드 개발자분들의 적극적인 협력으로 WebP 확장자 지원을 추가하여 이미지 다운로드 시간을 추가로 단축할 수 있었습니다. 현재도 학회원분들, 멘토링, AI 등을 통해 추가적인 이미지 최적화 방안을 지속적으로 연구 중입니다. |
+
+### 2️⃣ 출석체크 페이지 초기 로딩 속도가 느리다
+
+| 목차 | 설명 |
+|------|-------------|
+| 문제 상황 | IT 경영학회 큐시즘의 출석체크 앱서비스 구현 중, 가장 중요한 출석체크 페이지의 **FCP(First Contentful Paint)가 현저하게 저하**되었습니다. 실제 사용자가 QR코드를 인식하려면 **아무것도 보이지 않은 상태로 3-4초 정도 대기**해야 하고, 화면이 로딩되면 QR코드를 인식해야 하는 상황이었습니다. 이는 사용자의 불편을 야기할 수 있으므로, **FCP 성능 증가 및 로딩 중 사용자 경험 개선**이 필요했습니다. |
+| 해결 과정 | **[1] Dynamic Import - QRCode 비동기 로드** qrcode.react 라이브러리는 약 20-30KB 용량을 가지고 있었고, 초기 페이지 로드 시 무조건 다운로드되고 있었습니다. 개선 전: `import { QRCodeSVG } from 'qrcode.react'` (메인 번들에 포함) 개선 후: `const QRCodeSVG = dynamic(() => import('qrcode.react').then(...), { ssr: false, loading: () => <스켈레톤UI /> })` 효과: - 페이지 초기 로드 시 QRCodeSVG 코드 제외 - 렌더링 시 스켈레톤 UI 먼저 표시 - 백그라운드에서 라이브러리 비동기 다운로드 - 로드 완료 후 스켈레톤이 실제 QRCode로 교체 📊 로딩 중 사용자가 페이지 변화를 감지할 수 있어 불안감 제거 **[2] useCallback - 함수 메모이제이션** 개선 전: `const startTimer = (expAtValue: string) => { ... }` useEffect 내 expAt, token 변경 시마다 새로운 함수 객체 생성 개선 후: `const startTimer = useCallback((expAtValue: string) => { ... }, [])` 📊 효과: 함수 참조 유지, 자식 컴포넌트의 불필요한 리렌더링 방지, 메모리 효율성 증가 **[3] useMemo - 계산 결과 캐싱** 개선 전: 남은 초(remainingSeconds)가 매초 업데이트될 때마다 `qrData = JSON.stringify({ token: tokenData.token })` 재계산 10분 진행 시 600번의 불필요한 리렌더링 발생 개선 후: `const qrData = useMemo(() => (tokenData?.token ? JSON.stringify(...) : ''), [tokenData?.token])` 📊 효과: token 변경 시만 qrData 재계산, remainingSeconds 업데이트 시 캐싱된 값 사용으로 불필요한 렌더링 제거 |
+| 결과 | **FCP 성능 향상: 5.6초 → 1.7초** **LightHouse 기준 성능지수: 13% 개선** Dynamic Import, useCallback, useMemo를 조합하여 초기 로딩 속도를 획기적으로 개선하고, 사용자가 로딩 중임을 인지할 수 있는 스켈레톤 UI로 경험을 개선했습니다. 이를 통해 출석체크 프로세스의 사용성이 크게 향상되었습니다. |
+
+### 3️⃣ E2E 테스트 코드로 회원가입 페이지 타입 안정화
+
+| 목차 | 설명 |
+|------|-------------|
+| 문제 상황 | UT세션 준비를 위해 QA를 진행하는 과정에서 예상치 못한 사용자 입력들이 발견되었습니다. **이름 필드**: 황유림**><**, **ㅁㅇㅁㄴ**, **너무 긴 이름** **전화번호 필드**: 101-421 (불완전한 입력) **악의적 입력**: **<script></script>** (XSS 공격 시도) 농담식으로 스크립트 코드를 넣기도 했지만, 실제 서비스 사용 중 예상과 다르게 입력하는 사용자는 분명히 발생할 것으로 예상되었습니다. 이러한 변수들을 최대한 제어하고 대응하기 위해 **E2E 테스트 코드 도입의 필요성**을 인식하게 되었습니다. |
+| 해결 과정 | 다양한 테스트 도구 중 **Playwright 기반의 E2E 테스트**를 선택했습니다. 이유는 사용자 시나리오를 직접 설정하여 실제 사용자 흐름대로 서비스가 문제없이 동작하는지 검증할 수 있기 때문입니다. 회원가입은 Step별로 구성되어 있었고 (Step 1: 이름 입력, Step 2: 학과 입력 등), 각 Step에서 요구되는 기능들을 검증했습니다. **과한 테스트보다는 목적 지향적인 테스트 작성**: 다른 기능 구현이 남아있어 리소스 낭비를 피하고, **다양한 입력을 하는 사용자를 제어하기 위한 테스트 코드**에 집중했습니다. **테스트 작성 후 발견된 이슈**: disable 처리, error 로직 미흡 등이 드러났고, 테스트에서 통과하지 못한 케이스들을 예외처리했습니다. **[1] 이름 유효성 검증** `validateName(name)`: 빈 값 체크, 최소/최대 길이(1-100자) 검증, 한글/영문/공백만 허용 특수문자 제거: `/^[가-힣a-zA-Z\s]+$/` 정규식으로 한글, 영문만 허용 📊 효과: 예상 밖의 이름 입력 차단 **[2] 휴대폰 번호 유효성 검증** `isValidPhoneNumber(phoneNumber)`: 010, 02~064 지역번호 포함 모든 유효한 형식 검증 정규식: `/^(010-\d{4}-\d{4}|0(2|31|32|...)-\d{3,4}-\d{4})$/` 📊 효과: 불완전하거나 잘못된 전화번호 입력 방지 **[3] 휴대폰 에러 메시지 처리** `getPhoneNumberErrorMessage(phoneNumber)`: 입력 없을 때, 13자 미만, 유효하지 않은 형식 등 상황별 에러 메시지 제공 📊 효과: 사용자에게 명확한 피드백 제공 |
+| 결과 | **테스트 통과율: 64% → 100%** 체계적인 입력 검증으로 회원가입 프로세스의 모든 시나리오를 안정적으로 제어할 수 있게 되었습니다. 현재 입력을 받는 기능 2가지 중 회원가입에 이어 **다른 입력 기능에도 동일한 E2E 테스트를 적용 중**입니다. |
+
+
+## ⚒️ 사용 아키텍쳐
+### 📲 BBF 패턴 (Backend-Based Fetching)
+
+### 핵심
+클라이언트 → **Route Handler** → 백엔드
+(토큰은 서버에 보관, XSS 공격 방지)
+
+---
+
+### Route Handler 작성 패턴
+
+#### GET
+```typescript
+export async function GET() {
+ const { data, error } = await apiCallServer('/v1/endpoint', {
+ method: 'GET',
+ })
+ if (error) return Response.json({ error }, { status: 400 })
+ return Response.json({ success: true, data })
+}
+```
+
+#### POST with 검증
+```typescript
+export async function POST(request: Request) {
+ const body = await request.json()
+ if (!body.id) return Response.json({ error: 'id required' }, { status: 400 })
+
+ const { data, error } = await apiCallServer('/v1/endpoint', {
+ method: 'POST',
+ body: JSON.stringify(body),
+ })
+ if (error) return Response.json({ error }, { status: 400 })
+ return Response.json({ success: true, data })
+}
+```
+
+#### 동적 라우트
+```typescript
+export async function GET(
+ { params }: { params: { id: string } }
+) {
+ if (!params.id) return Response.json({ error: 'id required' }, { status: 400 })
+
+ const { data, error } = await apiCallServer(`/v1/endpoint/${params.id}`, {
+ method: 'GET',
+ })
+ if (error) return Response.json({ error }, { status: 400 })
+ return Response.json(data)
+}
+```
+
+---
+
+### 클라이언트 사용
+```typescript
+// ✅ 올바른 사용
+const res = await fetch('/api/absence', { method: 'POST' })
+
+// ❌ 절대 금지
+import { apiCallServer } from '@/lib/api.server' // 에러!
+```
+
+---
+
+### 폴더 구조
+```
+src/app/api/
+├── absence/route.ts
+├── absence/manage/route.ts
+├── absence/manage/[sessionId]/route.ts
+├── attendance/...
+├── auth/cookies/route.ts
+└── points/manage/...
+
+src/lib/
+├── api.server.ts # 핵심 함수
+└── auth.server.ts # 토큰 관리
+```
+
diff --git a/components.json b/components.json
new file mode 100644
index 0000000..edcaef2
--- /dev/null
+++ b/components.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "",
+ "css": "src/app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "iconLibrary": "lucide",
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "registries": {}
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..b19482d
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,24 @@
+import js from '@eslint/js'
+import * as tseslint from 'typescript-eslint'
+import prettierPlugin from 'eslint-plugin-prettier'
+
+export default [
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ {
+ files: ['**/*.{js,ts,jsx,tsx}'],
+ languageOptions: {
+ parser: tseslint.parser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ },
+ plugins: {
+ prettier: prettierPlugin,
+ },
+ rules: {
+ 'prettier/prettier': 'warn',
+ },
+ },
+]
diff --git a/next.config.ts b/next.config.ts
new file mode 100644
index 0000000..ae60dd8
--- /dev/null
+++ b/next.config.ts
@@ -0,0 +1,30 @@
+import type { NextConfig } from 'next'
+
+const nextConfig: NextConfig = {
+ /* config options here */
+ images: {
+ formats: ['image/avif', 'image/webp'],
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'onku-dev-vlfjiejfi32r3jqp.s3.ap-northeast-2.amazonaws.com',
+ },
+ ],
+ unoptimized: true,
+ // 이미지 리사이징 설정
+ deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+ imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
+
+ // 캐시 설정
+ minimumCacheTTL: 60 * 60 * 24 * 365, // 1년
+ },
+ eslint: {
+ ignoreDuringBuilds: true,
+ },
+ typescript: {
+ ignoreBuildErrors: true,
+ },
+ reactStrictMode: false,
+}
+
+export default nextConfig
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..6faae88
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,9915 @@
+{
+ "name": "onku",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "onku",
+ "version": "0.1.0",
+ "dependencies": {
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@tanstack/react-query": "^5.90.2",
+ "clsx": "^2.1.1",
+ "eslint-plugin-prettier": "^5.5.4",
+ "framer-motion": "^12.23.22",
+ "next": "15.5.4",
+ "react": "19.1.0",
+ "react-dom": "19.1.0",
+ "typescript-eslint": "^8.45.0",
+ "zustand": "^5.0.8"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3",
+ "@svgr/cli": "^8.1.0",
+ "@svgr/webpack": "^8.1.0",
+ "@tailwindcss/postcss": "^4",
+ "@types/node": "^20",
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "eslint": "^9.36.0",
+ "eslint-config-next": "15.5.4",
+ "prettier-plugin-tailwindcss": "^0.6.14",
+ "tailwindcss": "^4",
+ "typescript": "^5"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
+ "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
+ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.4",
+ "@babel/types": "^7.28.4",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
+ "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
+ "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
+ "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "debug": "^4.4.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.10"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
+ "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
+ "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.4"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
+ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
+ "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
+ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+ "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
+ "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz",
+ "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz",
+ "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
+ "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.3",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
+ "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
+ "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/template": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz",
+ "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
+ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz",
+ "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
+ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
+ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
+ "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
+ "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
+ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
+ "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz",
+ "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/traverse": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
+ "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.27.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+ "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
+ "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
+ "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
+ "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
+ "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
+ "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+ "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+ "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz",
+ "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
+ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
+ "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
+ "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
+ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
+ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
+ "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.27.1",
+ "@babel/plugin-syntax-import-attributes": "^7.27.1",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.28.0",
+ "@babel/plugin-transform-async-to-generator": "^7.27.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.28.0",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-class-static-block": "^7.28.3",
+ "@babel/plugin-transform-classes": "^7.28.3",
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-dotall-regex": "^7.27.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-explicit-resource-management": "^7.28.0",
+ "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.27.1",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.27.1",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-numeric-separator": "^7.27.1",
+ "@babel/plugin-transform-object-rest-spread": "^7.28.0",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/plugin-transform-private-methods": "^7.27.1",
+ "@babel/plugin-transform-private-property-in-object": "^7.27.1",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.28.3",
+ "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.27.1",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "core-js-compat": "^3.43.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
+ "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-transform-react-display-name": "^7.27.1",
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
+ "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
+ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
+ "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz",
+ "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
+ "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+ "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+ "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz",
+ "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+ "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
+ "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.3",
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz",
+ "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.4"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
+ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz",
+ "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz",
+ "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz",
+ "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz",
+ "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz",
+ "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz",
+ "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz",
+ "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz",
+ "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz",
+ "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz",
+ "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz",
+ "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz",
+ "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz",
+ "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz",
+ "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz",
+ "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz",
+ "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz",
+ "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz",
+ "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz",
+ "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.5.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz",
+ "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz",
+ "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz",
+ "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "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"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz",
+ "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.4.tgz",
+ "integrity": "sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz",
+ "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz",
+ "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz",
+ "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz",
+ "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz",
+ "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz",
+ "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz",
+ "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz",
+ "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
+ "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
+ "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
+ "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/cli": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/cli/-/cli-8.1.0.tgz",
+ "integrity": "sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-prettier": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.2",
+ "commander": "^9.4.1",
+ "dashify": "^2.0.0",
+ "glob": "^8.0.3",
+ "snake-case": "^3.0.4"
+ },
+ "bin": {
+ "svgr": "bin/svgr"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/cli/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-prettier": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-prettier/-/plugin-prettier-8.1.0.tgz",
+ "integrity": "sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deepmerge": "^4.3.1",
+ "prettier": "^2.8.7"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-prettier/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz",
+ "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "enhanced-resolve": "^5.18.3",
+ "jiti": "^2.6.0",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.19",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz",
+ "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.5.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.14",
+ "@tailwindcss/oxide-darwin-x64": "4.1.14",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.14",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.14",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.14",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.14",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.14"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz",
+ "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz",
+ "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz",
+ "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz",
+ "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz",
+ "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz",
+ "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz",
+ "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz",
+ "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz",
+ "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz",
+ "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.5.0",
+ "@emnapi/runtime": "^1.5.0",
+ "@emnapi/wasi-threads": "^1.1.0",
+ "@napi-rs/wasm-runtime": "^1.0.5",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz",
+ "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz",
+ "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz",
+ "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.1.14",
+ "@tailwindcss/oxide": "4.1.14",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.1.14"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.90.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.2.tgz",
+ "integrity": "sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.90.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.2.tgz",
+ "integrity": "sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.90.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.19.19",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz",
+ "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.0.tgz",
+ "integrity": "sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.0.tgz",
+ "integrity": "sha512-brtBs0MnE9SMx7px208g39lRmC5uHZs96caOJfTjFcYSLHNamvaSMfJNagChVNkup2SdtOxKX1FDBkRSJe1ZAg==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz",
+ "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.45.0",
+ "@typescript-eslint/type-utils": "8.45.0",
+ "@typescript-eslint/utils": "8.45.0",
+ "@typescript-eslint/visitor-keys": "8.45.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.45.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz",
+ "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.45.0",
+ "@typescript-eslint/types": "8.45.0",
+ "@typescript-eslint/typescript-estree": "8.45.0",
+ "@typescript-eslint/visitor-keys": "8.45.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz",
+ "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.45.0",
+ "@typescript-eslint/types": "^8.45.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz",
+ "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.45.0",
+ "@typescript-eslint/visitor-keys": "8.45.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz",
+ "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz",
+ "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.45.0",
+ "@typescript-eslint/typescript-estree": "8.45.0",
+ "@typescript-eslint/utils": "8.45.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz",
+ "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz",
+ "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.45.0",
+ "@typescript-eslint/tsconfig-utils": "8.45.0",
+ "@typescript-eslint/types": "8.45.0",
+ "@typescript-eslint/visitor-keys": "8.45.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz",
+ "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.45.0",
+ "@typescript-eslint/types": "8.45.0",
+ "@typescript-eslint/typescript-estree": "8.45.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz",
+ "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.45.0",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
+ "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.7",
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
+ "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz",
+ "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001746",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz",
+ "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "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"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.45.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz",
+ "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.25.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/dashify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz",
+ "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz",
+ "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.229",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.229.tgz",
+ "integrity": "sha512-cwhDcZKGcT/rEthLRJ9eBlMDkh1sorgsuk+6dpsehV0g9CABsIqBxU4rLRjG+d/U6pYU1s37A4lSKrVc5lSQYg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz",
+ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.3.1",
+ "@eslint/core": "^0.15.2",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.36.0",
+ "@eslint/plugin-kit": "^0.3.5",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.4.tgz",
+ "integrity": "sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "15.5.4",
+ "@rushstack/eslint-patch": "^1.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^5.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+ "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.4.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^2.0.0",
+ "stable-hash": "^0.0.5",
+ "tinyglobby": "^0.2.13",
+ "unrs-resolver": "^1.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz",
+ "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==",
+ "license": "MIT",
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.11.7"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "license": "ISC"
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "12.23.24",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz",
+ "integrity": "sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.23.23",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
+ "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "license": "MIT"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lru-cache/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "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"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.23.23",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
+ "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/napi-postinstall": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz",
+ "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
+ },
+ "node_modules/next": {
+ "version": "15.5.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz",
+ "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.5.4",
+ "@swc/helpers": "0.5.15",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.5.4",
+ "@next/swc-darwin-x64": "15.5.4",
+ "@next/swc-linux-arm64-gnu": "15.5.4",
+ "@next/swc-linux-arm64-musl": "15.5.4",
+ "@next/swc-linux-x64-gnu": "15.5.4",
+ "@next/swc-linux-x64-musl": "15.5.4",
+ "@next/swc-win32-arm64-msvc": "15.5.4",
+ "@next/swc-win32-x64-msvc": "15.5.4",
+ "sharp": "^0.34.3"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.21",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz",
+ "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
+ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/prettier-plugin-tailwindcss": {
+ "version": "0.6.14",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz",
+ "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "@ianvs/prettier-plugin-sort-imports": "*",
+ "@prettier/plugin-hermes": "*",
+ "@prettier/plugin-oxc": "*",
+ "@prettier/plugin-pug": "*",
+ "@shopify/prettier-plugin-liquid": "*",
+ "@trivago/prettier-plugin-sort-imports": "*",
+ "@zackad/prettier-plugin-twig": "*",
+ "prettier": "^3.0",
+ "prettier-plugin-astro": "*",
+ "prettier-plugin-css-order": "*",
+ "prettier-plugin-import-sort": "*",
+ "prettier-plugin-jsdoc": "*",
+ "prettier-plugin-marko": "*",
+ "prettier-plugin-multiline-arrays": "*",
+ "prettier-plugin-organize-attributes": "*",
+ "prettier-plugin-organize-imports": "*",
+ "prettier-plugin-sort-imports": "*",
+ "prettier-plugin-style-order": "*",
+ "prettier-plugin-svelte": "*"
+ },
+ "peerDependenciesMeta": {
+ "@ianvs/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@prettier/plugin-hermes": {
+ "optional": true
+ },
+ "@prettier/plugin-oxc": {
+ "optional": true
+ },
+ "@prettier/plugin-pug": {
+ "optional": true
+ },
+ "@shopify/prettier-plugin-liquid": {
+ "optional": true
+ },
+ "@trivago/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@zackad/prettier-plugin-twig": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-css-order": {
+ "optional": true
+ },
+ "prettier-plugin-import-sort": {
+ "optional": true
+ },
+ "prettier-plugin-jsdoc": {
+ "optional": true
+ },
+ "prettier-plugin-marko": {
+ "optional": true
+ },
+ "prettier-plugin-multiline-arrays": {
+ "optional": true
+ },
+ "prettier-plugin-organize-attributes": {
+ "optional": true
+ },
+ "prettier-plugin-organize-imports": {
+ "optional": true
+ },
+ "prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "prettier-plugin-style-order": {
+ "optional": true
+ },
+ "prettier-plugin-svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
+ "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz",
+ "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz",
+ "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.0",
+ "semver": "^7.7.2"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.4",
+ "@img/sharp-darwin-x64": "0.34.4",
+ "@img/sharp-libvips-darwin-arm64": "1.2.3",
+ "@img/sharp-libvips-darwin-x64": "1.2.3",
+ "@img/sharp-libvips-linux-arm": "1.2.3",
+ "@img/sharp-libvips-linux-arm64": "1.2.3",
+ "@img/sharp-libvips-linux-ppc64": "1.2.3",
+ "@img/sharp-libvips-linux-s390x": "1.2.3",
+ "@img/sharp-libvips-linux-x64": "1.2.3",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.3",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.3",
+ "@img/sharp-linux-arm": "0.34.4",
+ "@img/sharp-linux-arm64": "0.34.4",
+ "@img/sharp-linux-ppc64": "0.34.4",
+ "@img/sharp-linux-s390x": "0.34.4",
+ "@img/sharp-linux-x64": "0.34.4",
+ "@img/sharp-linuxmusl-arm64": "0.34.4",
+ "@img/sharp-linuxmusl-x64": "0.34.4",
+ "@img/sharp-wasm32": "0.34.4",
+ "@img/sharp-win32-arm64": "0.34.4",
+ "@img/sharp-win32-ia32": "0.34.4",
+ "@img/sharp-win32-x64": "0.34.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stable-hash": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz",
+ "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "@pkgr/core": "^0.2.9"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
+ "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
+ "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz",
+ "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
+ "@typescript-eslint/typescript-estree": "8.45.0",
+ "@typescript-eslint/utils": "8.45.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "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"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz",
+ "integrity": "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18.0.0",
+ "immer": ">=9.0.6",
+ "react": ">=18.0.0",
+ "use-sync-external-store": ">=1.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "use-sync-external-store": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2ee7b16
--- /dev/null
+++ b/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "onku",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build --turbopack",
+ "start": "next start",
+ "lint": "eslint",
+ "svgr": "svgr --icon --typescript --no-prettier --out-dir src/assets/svgComponents public/common --ignore-existing",
+ "test:e2e": "playwright test",
+ "test:e2e:ui": "playwright test --ui",
+ "test:e2e:debug": "playwright test --debug",
+ "test:e2e:headed": "playwright test --headed",
+ "test:e2e:report": "playwright show-report"
+ },
+ "dependencies": {
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-label": "^2.1.8",
+ "@radix-ui/react-switch": "^1.2.6",
+ "@tanstack/react-query": "^5.90.2",
+ "@tiptap/extension-bullet-list": "^3.10.1",
+ "@tiptap/extension-heading": "^3.10.1",
+ "@tiptap/extension-link": "^3.10.1",
+ "@tiptap/extension-list-item": "^3.10.1",
+ "@tiptap/extension-ordered-list": "^3.10.1",
+ "@tiptap/react": "^3.10.1",
+ "@tiptap/starter-kit": "^3.10.1",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "eslint-plugin-prettier": "^5.5.4",
+ "framer-motion": "^12.23.22",
+ "heic2any": "^0.0.4",
+ "isomorphic-dompurify": "^2.31.0",
+ "js-cookie": "^3.0.5",
+ "lucide-react": "^0.548.0",
+ "next": "15.5.7",
+ "qrcode.react": "^4.2.0",
+ "react": "19.1.0",
+ "react-dom": "19.1.0",
+ "react-loading-skeleton": "^3.5.0",
+ "react-query": "^3.39.3",
+ "tailwind-merge": "^3.3.1",
+ "typescript-eslint": "^8.45.0",
+ "vaul": "^1.1.2",
+ "zustand": "^5.0.8"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3",
+ "@playwright/test": "^1.56.1",
+ "@svgr/cli": "^8.1.0",
+ "@svgr/webpack": "^8.1.0",
+ "@tailwindcss/postcss": "^4",
+ "@tailwindcss/typography": "^0.5.19",
+ "@types/js-cookie": "^3.0.6",
+ "@types/node": "^20",
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "eslint": "^9.36.0",
+ "eslint-config-next": "15.5.4",
+ "jsdom": "^27.2.0",
+ "prettier-plugin-tailwindcss": "^0.6.14",
+ "tailwindcss": "^4",
+ "tw-animate-css": "^1.4.0",
+ "typescript": "^5"
+ },
+ "packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402"
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..a1e3112
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,8047 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@radix-ui/react-dialog':
+ specifier: ^1.1.15
+ version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.1.16
+ version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-label':
+ specifier: ^2.1.8
+ version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-switch':
+ specifier: ^1.2.6
+ version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@tanstack/react-query':
+ specifier: ^5.90.2
+ version: 5.90.10(react@19.1.0)
+ '@tiptap/extension-bullet-list':
+ specifier: ^3.10.1
+ version: 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-heading':
+ specifier: ^3.10.1
+ version: 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-link':
+ specifier: ^3.10.1
+ version: 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-list-item':
+ specifier: ^3.10.1
+ version: 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-ordered-list':
+ specifier: ^3.10.1
+ version: 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/react':
+ specifier: ^3.10.1
+ version: 3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@tiptap/starter-kit':
+ specifier: ^3.10.1
+ version: 3.11.0
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ eslint-plugin-prettier:
+ specifier: ^5.5.4
+ version: 5.5.4(eslint@9.39.1(jiti@2.6.1))(prettier@2.8.8)
+ framer-motion:
+ specifier: ^12.23.22
+ version: 12.23.24(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ heic2any:
+ specifier: ^0.0.4
+ version: 0.0.4
+ isomorphic-dompurify:
+ specifier: ^2.31.0
+ version: 2.32.0
+ js-cookie:
+ specifier: ^3.0.5
+ version: 3.0.5
+ lucide-react:
+ specifier: ^0.548.0
+ version: 0.548.0(react@19.1.0)
+ next:
+ specifier: 15.5.7
+ version: 15.5.7(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ qrcode.react:
+ specifier: ^4.2.0
+ version: 4.2.0(react@19.1.0)
+ react:
+ specifier: 19.1.0
+ version: 19.1.0
+ react-dom:
+ specifier: 19.1.0
+ version: 19.1.0(react@19.1.0)
+ react-loading-skeleton:
+ specifier: ^3.5.0
+ version: 3.5.0(react@19.1.0)
+ react-query:
+ specifier: ^3.39.3
+ version: 3.39.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ tailwind-merge:
+ specifier: ^3.3.1
+ version: 3.4.0
+ typescript-eslint:
+ specifier: ^8.45.0
+ version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ vaul:
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ zustand:
+ specifier: ^5.0.8
+ version: 5.0.8(@types/react@19.2.6)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0))
+ devDependencies:
+ '@eslint/eslintrc':
+ specifier: ^3
+ version: 3.3.1
+ '@playwright/test':
+ specifier: ^1.56.1
+ version: 1.56.1
+ '@svgr/cli':
+ specifier: ^8.1.0
+ version: 8.1.0(typescript@5.9.3)
+ '@svgr/webpack':
+ specifier: ^8.1.0
+ version: 8.1.0(typescript@5.9.3)
+ '@tailwindcss/postcss':
+ specifier: ^4
+ version: 4.1.17
+ '@tailwindcss/typography':
+ specifier: ^0.5.19
+ version: 0.5.19(tailwindcss@4.1.17)
+ '@types/js-cookie':
+ specifier: ^3.0.6
+ version: 3.0.6
+ '@types/node':
+ specifier: ^20
+ version: 20.19.25
+ '@types/react':
+ specifier: ^19
+ version: 19.2.6
+ '@types/react-dom':
+ specifier: ^19
+ version: 19.2.3(@types/react@19.2.6)
+ eslint:
+ specifier: ^9.36.0
+ version: 9.39.1(jiti@2.6.1)
+ eslint-config-next:
+ specifier: 15.5.4
+ version: 15.5.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ jsdom:
+ specifier: ^27.2.0
+ version: 27.2.0
+ prettier-plugin-tailwindcss:
+ specifier: ^0.6.14
+ version: 0.6.14(prettier@2.8.8)
+ tailwindcss:
+ specifier: ^4
+ version: 4.1.17
+ tw-animate-css:
+ specifier: ^1.4.0
+ version: 1.4.0
+ typescript:
+ specifier: ^5
+ version: 5.9.3
+
+packages:
+
+ '@acemir/cssom@0.9.23':
+ resolution: {integrity: sha512-2kJ1HxBKzPLbmhZpxBiTZggjtgCwKg1ma5RHShxvd6zgqhDEdEkzpiwe7jLkI2p2BrZvFCXIihdoMkl1H39VnA==}
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@asamuzakjp/css-color@4.0.5':
+ resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==}
+
+ '@asamuzakjp/dom-selector@6.7.4':
+ resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==}
+
+ '@asamuzakjp/nwsapi@2.3.9':
+ resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
+
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.28.5':
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.28.5':
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.28.5':
+ resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5':
+ resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-define-polyfill-provider@0.6.5':
+ resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-remap-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-replace-supers@7.27.1':
+ resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-wrap-function@7.28.3':
+ resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.28.5':
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5':
+ resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1':
+ resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1':
+ resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1':
+ resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3':
+ resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-assertions@7.27.1':
+ resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.27.1':
+ resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.27.1':
+ resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.27.1':
+ resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-arrow-functions@7.27.1':
+ resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-generator-functions@7.28.0':
+ resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-block-scoped-functions@7.27.1':
+ resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-block-scoping@7.28.5':
+ resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-properties@7.27.1':
+ resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-static-block@7.28.3':
+ resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+
+ '@babel/plugin-transform-classes@7.28.4':
+ resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-computed-properties@7.27.1':
+ resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-destructuring@7.28.5':
+ resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-dotall-regex@7.27.1':
+ resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-keys@7.27.1':
+ resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1':
+ resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-dynamic-import@7.27.1':
+ resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-explicit-resource-management@7.28.0':
+ resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-exponentiation-operator@7.28.5':
+ resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1':
+ resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-for-of@7.27.1':
+ resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-function-name@7.27.1':
+ resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-json-strings@7.27.1':
+ resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-literals@7.27.1':
+ resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.5':
+ resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-member-expression-literals@7.27.1':
+ resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-amd@7.27.1':
+ resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.27.1':
+ resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-systemjs@7.28.5':
+ resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-umd@7.27.1':
+ resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.27.1':
+ resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-new-target@7.27.1':
+ resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1':
+ resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-numeric-separator@7.27.1':
+ resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-rest-spread@7.28.4':
+ resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-super@7.27.1':
+ resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-catch-binding@7.27.1':
+ resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.28.5':
+ resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-parameters@7.27.7':
+ resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-methods@7.27.1':
+ resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-property-in-object@7.27.1':
+ resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-property-literals@7.27.1':
+ resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-constant-elements@7.27.1':
+ resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-display-name@7.28.0':
+ resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-development@7.27.1':
+ resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx@7.27.1':
+ resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-pure-annotations@7.27.1':
+ resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regenerator@7.28.4':
+ resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regexp-modifiers@7.27.1':
+ resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-reserved-words@7.27.1':
+ resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1':
+ resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-spread@7.27.1':
+ resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-sticky-regex@7.27.1':
+ resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-template-literals@7.27.1':
+ resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typeof-symbol@7.27.1':
+ resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.28.5':
+ resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-escapes@7.27.1':
+ resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-property-regex@7.27.1':
+ resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-regex@7.27.1':
+ resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-sets-regex@7.27.1':
+ resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/preset-env@7.28.5':
+ resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-modules@0.1.6-no-external-plugins':
+ resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+
+ '@babel/preset-react@7.28.5':
+ resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-typescript@7.28.5':
+ resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.28.5':
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.28.5':
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+
+ '@csstools/color-helpers@5.1.0':
+ resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
+ engines: {node: '>=18'}
+
+ '@csstools/css-calc@2.1.4':
+ resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-color-parser@3.1.0':
+ resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-parser-algorithms@3.0.5':
+ resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-syntax-patches-for-csstree@1.0.16':
+ resolution: {integrity: sha512-2SpS4/UaWQaGpBINyG5ZuCHnUDeVByOhvbkARwfmnfxDvTaj80yOI1cD8Tw93ICV5Fx4fnyDKWQZI1CDtcWyUg==}
+ engines: {node: '>=18'}
+
+ '@csstools/css-tokenizer@3.0.4':
+ resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
+ engines: {node: '>=18'}
+
+ '@emnapi/core@1.7.1':
+ resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==}
+
+ '@emnapi/runtime@1.7.1':
+ resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
+
+ '@emnapi/wasi-threads@1.1.0':
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+ '@eslint-community/eslint-utils@4.9.0':
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.1':
+ resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.1':
+ resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.39.1':
+ resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.7.3':
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+ '@floating-ui/dom@1.7.4':
+ resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+
+ '@floating-ui/react-dom@2.1.6':
+ resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.10':
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@img/colour@1.0.0':
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
+
+ '@next/env@15.5.7':
+ resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==}
+
+ '@next/eslint-plugin-next@15.5.4':
+ resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==}
+
+ '@next/swc-darwin-arm64@15.5.7':
+ resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@15.5.7':
+ resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@15.5.7':
+ resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-arm64-musl@15.5.7':
+ resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-x64-gnu@15.5.7':
+ resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-linux-x64-musl@15.5.7':
+ resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-win32-arm64-msvc@15.5.7':
+ resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@15.5.7':
+ resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+
+ '@pkgr/core@0.2.9':
+ resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@playwright/test@1.56.1':
+ resolution: {integrity: sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ '@radix-ui/primitive@1.1.3':
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+
+ '@radix-ui/react-arrow@1.1.7':
+ resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
+ 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-collection@1.1.7':
+ resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
+ 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-compose-refs@1.1.2':
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.2':
+ resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dialog@1.1.15':
+ resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
+ 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-direction@1.1.1':
+ resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.11':
+ resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
+ 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-dropdown-menu@2.1.16':
+ resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
+ 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-focus-guards@1.1.3':
+ resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.7':
+ resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
+ 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-id@1.1.1':
+ resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-label@2.1.8':
+ resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==}
+ 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-menu@2.1.16':
+ resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
+ 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-popper@1.2.8':
+ resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
+ 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-portal@1.1.9':
+ resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
+ 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-presence@1.1.5':
+ resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
+ 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-primitive@2.1.3':
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
+ 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-primitive@2.1.4':
+ resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==}
+ 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-roving-focus@1.1.11':
+ resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
+ 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-slot@1.2.3':
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-slot@1.2.4':
+ resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-switch@1.2.6':
+ resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==}
+ 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-use-callback-ref@1.1.1':
+ resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.2.2':
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-effect-event@0.0.2':
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.1':
+ resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.1':
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.1':
+ resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.1':
+ resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.1':
+ resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/rect@1.1.1':
+ resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
+
+ '@remirror/core-constants@3.0.0':
+ resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/eslint-patch@1.15.0':
+ resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==}
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0':
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0':
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0':
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0':
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0':
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@8.1.0':
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/cli@8.1.0':
+ resolution: {integrity: sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ '@svgr/core@8.1.0':
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+
+ '@svgr/plugin-jsx@8.1.0':
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@svgr/plugin-prettier@8.1.0':
+ resolution: {integrity: sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@svgr/plugin-svgo@8.1.0':
+ resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@svgr/webpack@8.1.0':
+ resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==}
+ engines: {node: '>=14'}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tailwindcss/node@4.1.17':
+ resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==}
+
+ '@tailwindcss/oxide-android-arm64@4.1.17':
+ resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.17':
+ resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.1.17':
+ resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.17':
+ resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17':
+ resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.17':
+ resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.17':
+ resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.17':
+ resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.17':
+ resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.17':
+ resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.17':
+ resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.17':
+ resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.1.17':
+ resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==}
+ engines: {node: '>= 10'}
+
+ '@tailwindcss/postcss@4.1.17':
+ resolution: {integrity: sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==}
+
+ '@tailwindcss/typography@0.5.19':
+ resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
+ '@tanstack/query-core@5.90.10':
+ resolution: {integrity: sha512-EhZVFu9rl7GfRNuJLJ3Y7wtbTnENsvzp+YpcAV7kCYiXni1v8qZh++lpw4ch4rrwC0u/EZRnBHIehzCGzwXDSQ==}
+
+ '@tanstack/react-query@5.90.10':
+ resolution: {integrity: sha512-BKLss9Y8PQ9IUjPYQiv3/Zmlx92uxffUOX8ZZNoQlCIZBJPT5M+GOMQj7xislvVQ6l1BstBjcX0XB/aHfFYVNw==}
+ peerDependencies:
+ react: ^18 || ^19
+
+ '@tiptap/core@3.11.0':
+ resolution: {integrity: sha512-kmS7ZVpHm1EMnW1Wmft9H5ZLM7E0G0NGBx+aGEHGDcNxZBXD2ZUa76CuWjIhOGpwsPbELp684ZdpF2JWoNi4Dg==}
+ peerDependencies:
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-blockquote@3.11.0':
+ resolution: {integrity: sha512-0H8WVW6Vn4GJ7sQ6wfyDgUU+DqM8fp62g8N0fFPiEhoYtpIYUmCqGhpKnqYR0tet6ofFa648XmA6n2VX7sugzw==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-bold@3.11.0':
+ resolution: {integrity: sha512-V/c3XYO09Le9GlBGq1MK4c97Fffi0GADQTbZ+LFoi65nUrAwutn5wYnXBcEyWQI6RmFWVDJTieamqtc4j9teyw==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-bubble-menu@3.11.0':
+ resolution: {integrity: sha512-P3j9lQ+EZ5Zg/isJzLpCPX7bp7WUBmz8GPs/HPlyMyN2su8LqXntITBZr8IP1JNBlB/wR83k/W0XqdC57mG7cA==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-bullet-list@3.11.0':
+ resolution: {integrity: sha512-IKdb1C3bHA1sGPiUcntkL+wHebRg71K5+tgaaRnMw0qmtcpcOQb5zhQOSm5bXUsgCk/WgT04dkZPnpn6Gg1PvQ==}
+ peerDependencies:
+ '@tiptap/extension-list': ^3.11.0
+
+ '@tiptap/extension-code-block@3.11.0':
+ resolution: {integrity: sha512-y01RJVbygDJWYXxZ0SiCYwvUF2X91RANCLSdb8X0qiwVPgNOzsDrrzS/iqoXkiYmM93pJw+ZWelEZxRvxEwsrg==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-code@3.11.0':
+ resolution: {integrity: sha512-5OpR5O4bveHe1KG9CJsto86NgkuerYq3OLY78vzh9uFCLdv7xgXA2aZYJfRMhbZ7hKsR7hHg1etBJUCk+TKsMg==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-document@3.11.0':
+ resolution: {integrity: sha512-N2G3cwL2Dtur/CgD/byJmFx9T5no6fTO/U462VP3rthQYrRA1AB3TCYqtlwJkmyoxRTNd4qIg4imaPl8ej6Heg==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-dropcursor@3.11.0':
+ resolution: {integrity: sha512-gW/QMGAyiXGSpO+X/lTeiBQn1Or8T8UVB3y9Cv2Lh6zx0SWU+FA28EH+y6s3fm872reN4dH/9rEvMuJjhU/BEw==}
+ peerDependencies:
+ '@tiptap/extensions': ^3.11.0
+
+ '@tiptap/extension-floating-menu@3.11.0':
+ resolution: {integrity: sha512-nEHdWZHEJYX1II1oJQ4aeZ8O/Kss4BRbYFXQFGIvPelCfCYEATpUJh3aq3767ARSq40bOWyu+Dcd4SCW0We6Sw==}
+ peerDependencies:
+ '@floating-ui/dom': ^1.0.0
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-gapcursor@3.11.0':
+ resolution: {integrity: sha512-lXGEZiYX7k/pEFr8BgDE91vqjLTwuf+qhHLTgIpfhbt562nShLPIDj9Vzu3xrR4fwUAMiUNiLyaeInb8j3I4kg==}
+ peerDependencies:
+ '@tiptap/extensions': ^3.11.0
+
+ '@tiptap/extension-hard-break@3.11.0':
+ resolution: {integrity: sha512-NJEHTj++kFOayQXKSQSi9j9eAG33eSiJqai2pf4U+snW94fmb8cYLUurDmfYRe20O6EzBSX0X3GjVlkOz+5b7A==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-heading@3.11.0':
+ resolution: {integrity: sha512-4Eo67Yo7vsYLkizcMoGdZAR9aHbC7FFTrqfNEd4Em3ajRi0iNqyWMaI90UCYlitDdRdqFlq/njWrMqBOLUgaWQ==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-horizontal-rule@3.11.0':
+ resolution: {integrity: sha512-FugFHZG+oiMBV6k42hn9NOA4wRNc2b9UeEIMR+XwEMpWJInV4VwSwDvu8JClgkDo8z7FEnker9e51DZ00CLWqg==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-italic@3.11.0':
+ resolution: {integrity: sha512-WP6wL2b//8bLVdeUCWOpYA7nUStvrAMMD0nRn0F9CEW+l7vH6El2PZFhHmJ9uqXo5MnyugBpARiwgxfoAlef5w==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-link@3.11.0':
+ resolution: {integrity: sha512-RoUkGqowVMKLE76KktNOGhzNMyKtwrSDRqeYCe1ODPuOMZvDGexOE8cIuA4A1ODkgN6ji9qE/9Sf8uhpZdH39Q==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-list-item@3.11.0':
+ resolution: {integrity: sha512-KXTTSBH/T/WW8O1YhK/lVmwlSGh2w2VVucUkMLhgk1VPchahAkn2LfgbgKrCRG/F8M8Jlfvz67iJDo6+bbNqew==}
+ peerDependencies:
+ '@tiptap/extension-list': ^3.11.0
+
+ '@tiptap/extension-list-keymap@3.11.0':
+ resolution: {integrity: sha512-vm1zGdEqcbQnrGlVXchk1ibmTsyxyfGcGPVWsc4MG+UAFcNfcpAnvCar71BF4RGGPtpzOWdqGkvJENyh0L5/Hw==}
+ peerDependencies:
+ '@tiptap/extension-list': ^3.11.0
+
+ '@tiptap/extension-list@3.11.0':
+ resolution: {integrity: sha512-4Ane7VCVZ+GFOQNuy2nMP+SoWH7EemC3geTTqvgHm1H0tbSosxLJAVaZ9dF06F35RJmYCm+jLJUhRVd156eCRQ==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/extension-ordered-list@3.11.0':
+ resolution: {integrity: sha512-kO8GH4w4Xil+qPiHJLAyILdGHF9hCjkhoVtPD8YEfqK6Qx3bZql5FPySCQNs+MU6rLSCCdam8SUPGY/+SCufqA==}
+ peerDependencies:
+ '@tiptap/extension-list': ^3.11.0
+
+ '@tiptap/extension-paragraph@3.11.0':
+ resolution: {integrity: sha512-hxgjZOXOqstRTWv+QjWJjK23rD5qzIV9ePlhX3imLeq/MgX0aU9VBDaG5SGKbSjaBNQnpLw6+sABJi3CDP6Z5A==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-strike@3.11.0':
+ resolution: {integrity: sha512-XVP/WMYLrqLBfUsGPu2H9MrOUZLhGUaxtZ3hSRffDi/lsw53x/coZ9eO0FxOB9R7z2ksHWmticIs+0YnKt9LNQ==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-text@3.11.0':
+ resolution: {integrity: sha512-ELAYm2BuChzZOqDG9B0k3W6zqM4pwNvXkam28KgHGiT2y7Ni68Rb+NXp16uVR+5zR6hkqnQ/BmJSKzAW59MXpA==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extension-underline@3.11.0':
+ resolution: {integrity: sha512-D3PsS/84RlQKFjd5eerMIUioC0mNh4yy1RRV/WbXx6ugu+6T+0hT42gNk9Ap8pDsVQZCk0SHfDyBEUFC2KOwKw==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+
+ '@tiptap/extensions@3.11.0':
+ resolution: {integrity: sha512-g43beA73ZMLezez1st9LEwYrRHZ0FLzlsSlOZKk7sdmtHLmuqWHf4oyb0XAHol1HZIdGv104rYaGNgmQXr1ecQ==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+
+ '@tiptap/pm@3.11.0':
+ resolution: {integrity: sha512-plCQDLCZIOc92cizB8NNhBRN0szvYR3cx9i5IXo6v9Xsgcun8KHNcJkesc2AyeqdIs0BtOJZaqQ9adHThz8UDw==}
+
+ '@tiptap/react@3.11.0':
+ resolution: {integrity: sha512-SDGei/2DjwmhzsxIQNr6dkB6NxLgXZjQ6hF36NfDm4937r5NLrWrNk5tCsoDQiKZ0DHEzuJ6yZM5C7I7LZLB6w==}
+ peerDependencies:
+ '@tiptap/core': ^3.11.0
+ '@tiptap/pm': ^3.11.0
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@tiptap/starter-kit@3.11.0':
+ resolution: {integrity: sha512-8kMMYqVSZ2Oqji+mY1o9meTjCRWp4DplFegu7APqDEQRhlb6mBI0wNuazYb7FKJIHJTtf0F6cYglJrxpu9c/fA==}
+
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/js-cookie@3.0.6':
+ resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/linkify-it@5.0.0':
+ resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
+
+ '@types/markdown-it@14.1.2':
+ resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
+
+ '@types/mdurl@2.0.0':
+ resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
+
+ '@types/node@20.19.25':
+ resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.6':
+ resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==}
+
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+ '@types/use-sync-external-store@0.0.6':
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
+
+ '@typescript-eslint/eslint-plugin@8.47.0':
+ resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.47.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.47.0':
+ resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==}
+ 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.47.0':
+ resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.47.0':
+ resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.47.0':
+ resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.47.0':
+ resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==}
+ 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.47.0':
+ resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.47.0':
+ resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.47.0':
+ resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==}
+ 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.47.0':
+ resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
+ cpu: [arm]
+ os: [android]
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
+ cpu: [arm64]
+ os: [android]
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
+ cpu: [x64]
+ os: [win32]
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
+ engines: {node: '>=10'}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axe-core@4.11.0:
+ resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==}
+ engines: {node: '>=4'}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ babel-plugin-polyfill-corejs2@0.4.14:
+ resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-corejs3@0.13.0:
+ resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-regenerator@0.6.5:
+ resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ baseline-browser-mapping@2.8.29:
+ resolution: {integrity: sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==}
+ hasBin: true
+
+ bidi-js@1.0.3:
+ resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
+
+ big-integer@1.6.52:
+ resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+ engines: {node: '>=0.6'}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ broadcast-channel@3.7.0:
+ resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==}
+
+ browserslist@4.28.0:
+ resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001756:
+ resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ commander@9.5.0:
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
+ engines: {node: ^12.20.0 || >=14}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ core-js-compat@3.47.0:
+ resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ crelt@1.0.6:
+ resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-tree@3.1.0:
+ resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ cssstyle@5.3.3:
+ resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==}
+ engines: {node: '>=20'}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ dashify@2.0.0:
+ resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==}
+ engines: {node: '>=4'}
+
+ data-urls@6.0.0:
+ resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
+ engines: {node: '>=20'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ dompurify@3.3.0:
+ resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ electron-to-chromium@1.5.256:
+ resolution: {integrity: sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ enhanced-resolve@5.18.3:
+ resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-abstract@1.24.0:
+ resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.2.1:
+ resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ 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'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.10.1:
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+
+ eslint-module-utils@2.12.1:
+ resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-jsx-a11y@6.10.2:
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+ eslint-plugin-prettier@5.5.4:
+ resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ '@types/eslint': '>=8.0.0'
+ eslint: '>=8.0.0'
+ eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
+ prettier: '>=3.0.0'
+ peerDependenciesMeta:
+ '@types/eslint':
+ optional: true
+ eslint-config-prettier:
+ optional: true
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react@7.37.5:
+ resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.39.1:
+ resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ framer-motion@12.23.24:
+ resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ glob@8.1.0:
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+ engines: {node: '>=12'}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ heic2any@0.0.4:
+ resolution: {integrity: sha512-3lLnZiDELfabVH87htnRolZ2iehX9zwpRyGNz22GKXIu0fznlblf0/ftppXKNqS26dqFSeqfIBhAmAj/uSp0cA==}
+
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isomorphic-dompurify@2.32.0:
+ resolution: {integrity: sha512-4i6G4ICY57wQpiaNd6WcwhHUAqGDAJGWRlfWKLunBchJjtF2HV4eUeJtUupoEddbnnxYUiRhqfd9e4aDYR7ROA==}
+ engines: {node: '>=20.19.5'}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
+ js-cookie@3.0.5:
+ resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+ engines: {node: '>=14'}
+
+ js-sha3@0.8.0:
+ resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ jsdom@27.2.0:
+ resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ peerDependencies:
+ canvas: ^3.0.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lightningcss-android-arm64@1.30.2:
+ resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.30.2:
+ resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.30.2:
+ resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.30.2:
+ resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.30.2:
+ resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.30.2:
+ resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ linkify-it@5.0.0:
+ resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
+
+ linkifyjs@4.3.2:
+ resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@11.2.2:
+ resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==}
+ engines: {node: 20 || >=22}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lucide-react@0.548.0:
+ resolution: {integrity: sha512-63b16z63jM9yc1MwxajHeuu0FRZFsDtljtDjYm26Kd86UQ5HQzu9ksEtoUUw4RBuewodw/tGFmvipePvRsKeDA==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ markdown-it@14.1.0:
+ resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
+ hasBin: true
+
+ match-sorter@6.3.4:
+ resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+ mdn-data@2.12.2:
+ resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
+
+ mdurl@2.0.0:
+ resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ microseconds@0.2.0:
+ resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ motion-dom@12.23.23:
+ resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==}
+
+ motion-utils@12.23.6:
+ resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nano-time@1.0.0:
+ resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ next@15.5.7:
+ resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==}
+ engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ oblivious-set@1.0.0:
+ resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ orderedmap@2.1.1:
+ resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse5@8.0.0:
+ resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ playwright-core@1.56.1:
+ resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.56.1:
+ resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+
+ prettier-plugin-tailwindcss@0.6.14:
+ resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-hermes': '*'
+ '@prettier/plugin-oxc': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-hermes':
+ optional: true
+ '@prettier/plugin-oxc':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ prosemirror-changeset@2.3.1:
+ resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==}
+
+ prosemirror-collab@1.3.1:
+ resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==}
+
+ prosemirror-commands@1.7.1:
+ resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==}
+
+ prosemirror-dropcursor@1.8.2:
+ resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==}
+
+ prosemirror-gapcursor@1.4.0:
+ resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==}
+
+ prosemirror-history@1.5.0:
+ resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==}
+
+ prosemirror-inputrules@1.5.1:
+ resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==}
+
+ prosemirror-keymap@1.2.3:
+ resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==}
+
+ prosemirror-markdown@1.13.2:
+ resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==}
+
+ prosemirror-menu@1.2.5:
+ resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==}
+
+ prosemirror-model@1.25.4:
+ resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==}
+
+ prosemirror-schema-basic@1.2.4:
+ resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==}
+
+ prosemirror-schema-list@1.5.1:
+ resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==}
+
+ prosemirror-state@1.4.4:
+ resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==}
+
+ prosemirror-tables@1.8.1:
+ resolution: {integrity: sha512-DAgDoUYHCcc6tOGpLVPSU1k84kCUWTWnfWX3UDy2Delv4ryH0KqTD6RBI6k4yi9j9I8gl3j8MkPpRD/vWPZbug==}
+
+ prosemirror-trailing-node@3.0.0:
+ resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==}
+ peerDependencies:
+ prosemirror-model: ^1.22.1
+ prosemirror-state: ^1.4.2
+ prosemirror-view: ^1.33.8
+
+ prosemirror-transform@1.10.5:
+ resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==}
+
+ prosemirror-view@1.41.3:
+ resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==}
+
+ punycode.js@2.3.1:
+ resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
+ engines: {node: '>=6'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qrcode.react@4.2.0:
+ resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-dom@19.1.0:
+ resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==}
+ peerDependencies:
+ react: ^19.1.0
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-loading-skeleton@3.5.0:
+ resolution: {integrity: sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ react-query@3.39.3:
+ resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.7.1:
+ resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react@19.1.0:
+ resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
+ engines: {node: '>=0.10.0'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regenerate-unicode-properties@10.2.2:
+ resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ regexpu-core@6.4.0:
+ resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==}
+ engines: {node: '>=4'}
+
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.13.0:
+ resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==}
+ hasBin: true
+
+ remove-accents@0.5.0:
+ resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rope-sequence@1.3.4:
+ resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
+ scheduler@0.26.0:
+ resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ svgo@3.3.2:
+ resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+ synckit@0.11.11:
+ resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ tailwind-merge@3.4.0:
+ resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
+
+ tailwindcss@4.1.17:
+ resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==}
+
+ tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+ engines: {node: '>=6'}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tldts-core@7.0.18:
+ resolution: {integrity: sha512-jqJC13oP4FFAahv4JT/0WTDrCF9Okv7lpKtOZUGPLiAnNbACcSg8Y8T+Z9xthOmRBqi/Sob4yi0TE0miRCvF7Q==}
+
+ tldts@7.0.18:
+ resolution: {integrity: sha512-lCcgTAgMxQ1JKOWrVGo6E69Ukbnx4Gc1wiYLRf6J5NN4HRYJtCby1rPF8rkQ4a6qqoFBK5dvjJ1zJ0F7VfDSvw==}
+ hasBin: true
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ tough-cookie@6.0.0:
+ resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==}
+ engines: {node: '>=16'}
+
+ tr46@6.0.0:
+ resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
+ engines: {node: '>=20'}
+
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tw-animate-css@1.4.0:
+ resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ typescript-eslint@8.47.0:
+ resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==}
+ 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@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uc.micro@2.1.0:
+ resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-value-ecmascript@2.2.1:
+ resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==}
+ engines: {node: '>=4'}
+
+ unicode-property-aliases-ecmascript@2.2.0:
+ resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
+ engines: {node: '>=4'}
+
+ unload@2.2.0:
+ resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
+
+ unrs-resolver@1.11.1:
+ resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
+
+ update-browserslist-db@1.1.4:
+ resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vaul@1.1.2:
+ resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+
+ w3c-keyname@2.2.8:
+ resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ webidl-conversions@8.0.0:
+ resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==}
+ engines: {node: '>=20'}
+
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
+ whatwg-url@15.1.0:
+ resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==}
+ engines: {node: '>=20'}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.19:
+ resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zustand@5.0.8:
+ resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: '>=1.2.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
+
+snapshots:
+
+ '@acemir/cssom@0.9.23': {}
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@asamuzakjp/css-color@4.0.5':
+ dependencies:
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+ lru-cache: 11.2.2
+
+ '@asamuzakjp/dom-selector@6.7.4':
+ dependencies:
+ '@asamuzakjp/nwsapi': 2.3.9
+ bidi-js: 1.0.3
+ css-tree: 3.1.0
+ is-potential-custom-element-name: 1.0.1
+ lru-cache: 11.2.2
+
+ '@asamuzakjp/nwsapi@2.3.9': {}
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.28.5': {}
+
+ '@babel/core@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.28.5
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/traverse': 7.28.5
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ regexpu-core: 6.4.0
+ semver: 6.3.1
+
+ '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ debug: 4.4.3
+ lodash.debounce: 4.0.8
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ dependencies:
+ '@babel/types': 7.28.5
+
+ '@babel/helper-plugin-utils@7.27.1': {}
+
+ '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-wrap-function': 7.28.3
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helper-wrap-function@7.28.3':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+
+ '@babel/parser@7.28.5':
+ dependencies:
+ '@babel/types': 7.28.5
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5)
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-globals': 7.28.0
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5)
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/template': 7.27.2
+
+ '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5)
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/preset-env@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/core': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)
+ '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5)
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5)
+ '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5)
+ '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5)
+ '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5)
+ '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5)
+ '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5)
+ '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5)
+ '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5)
+ babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5)
+ babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5)
+ babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5)
+ core-js-compat: 3.47.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/types': 7.28.5
+ esutils: 2.0.3
+
+ '@babel/preset-react@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5)
+ '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.28.4': {}
+
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
+ '@babel/traverse@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.28.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@csstools/color-helpers@5.1.0': {}
+
+ '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/color-helpers': 5.1.0
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-syntax-patches-for-csstree@1.0.16': {}
+
+ '@csstools/css-tokenizer@3.0.4': {}
+
+ '@emnapi/core@1.7.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.7.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.39.1(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.21.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.1':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.39.1': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@floating-ui/core@1.7.3':
+ dependencies:
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/dom@1.7.4':
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@floating-ui/dom': 1.7.4
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@floating-ui/utils@0.2.10': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@img/colour@1.0.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.7.1
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ dependencies:
+ '@emnapi/core': 1.7.1
+ '@emnapi/runtime': 1.7.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
+ '@next/env@15.5.7': {}
+
+ '@next/eslint-plugin-next@15.5.4':
+ dependencies:
+ fast-glob: 3.3.1
+
+ '@next/swc-darwin-arm64@15.5.7':
+ optional: true
+
+ '@next/swc-darwin-x64@15.5.7':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@15.5.7':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@15.5.7':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@15.5.7':
+ optional: true
+
+ '@next/swc-linux-x64-musl@15.5.7':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@15.5.7':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@15.5.7':
+ optional: true
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@nolyfill/is-core-module@1.0.39': {}
+
+ '@pkgr/core@0.2.9': {}
+
+ '@playwright/test@1.56.1':
+ dependencies:
+ playwright: 1.56.1
+
+ '@radix-ui/primitive@1.1.3': {}
+
+ '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-context@1.1.2(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.6)(react@19.1.0)
+ aria-hidden: 1.2.6
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ react-remove-scroll: 2.7.1(@types/react@19.2.6)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-direction@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-id@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ aria-hidden: 1.2.6
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ react-remove-scroll: 2.7.1(@types/react@19.2.6)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/rect': 1.1.1
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.4(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-slot@1.2.3(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-slot@1.2.4(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.6)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/rect': 1.1.1
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/react-use-size@1.1.1(@types/react@19.2.6)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.6)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ '@radix-ui/rect@1.1.1': {}
+
+ '@remirror/core-constants@3.0.0': {}
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/eslint-patch@1.15.0': {}
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+
+ '@svgr/babel-preset@8.1.0(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.5)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.5)
+
+ '@svgr/cli@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ '@svgr/plugin-prettier': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ commander: 9.5.0
+ dashify: 2.0.0
+ glob: 8.1.0
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/core@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ dependencies:
+ '@babel/types': 7.28.5
+ entities: 4.5.0
+
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@svgr/plugin-prettier@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))':
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ deepmerge: 4.3.1
+ prettier: 2.8.8
+
+ '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)':
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ deepmerge: 4.3.1
+ svgo: 3.3.2
+ transitivePeerDependencies:
+ - typescript
+
+ '@svgr/webpack@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.5)
+ '@babel/preset-env': 7.28.5(@babel/core@7.28.5)
+ '@babel/preset-react': 7.28.5(@babel/core@7.28.5)
+ '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tailwindcss/node@4.1.17':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.18.3
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.17
+
+ '@tailwindcss/oxide-android-arm64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.17':
+ optional: true
+
+ '@tailwindcss/oxide@4.1.17':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.1.17
+ '@tailwindcss/oxide-darwin-arm64': 4.1.17
+ '@tailwindcss/oxide-darwin-x64': 4.1.17
+ '@tailwindcss/oxide-freebsd-x64': 4.1.17
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.17
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.17
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.17
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.17
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.17
+
+ '@tailwindcss/postcss@4.1.17':
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ '@tailwindcss/node': 4.1.17
+ '@tailwindcss/oxide': 4.1.17
+ postcss: 8.5.6
+ tailwindcss: 4.1.17
+
+ '@tailwindcss/typography@0.5.19(tailwindcss@4.1.17)':
+ dependencies:
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 4.1.17
+
+ '@tanstack/query-core@5.90.10': {}
+
+ '@tanstack/react-query@5.90.10(react@19.1.0)':
+ dependencies:
+ '@tanstack/query-core': 5.90.10
+ react: 19.1.0
+
+ '@tiptap/core@3.11.0(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/pm': 3.11.0
+
+ '@tiptap/extension-blockquote@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-bold@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-bubble-menu@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@floating-ui/dom': 1.7.4
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+ optional: true
+
+ '@tiptap/extension-bullet-list@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-code-block@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+
+ '@tiptap/extension-code@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-document@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-dropcursor@3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-floating-menu@3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@floating-ui/dom': 1.7.4
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+ optional: true
+
+ '@tiptap/extension-gapcursor@3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-hard-break@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-heading@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-horizontal-rule@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+
+ '@tiptap/extension-italic@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-link@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+ linkifyjs: 4.3.2
+
+ '@tiptap/extension-list-item@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-list-keymap@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+
+ '@tiptap/extension-ordered-list@3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-paragraph@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-strike@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-text@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extension-underline@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+
+ '@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+
+ '@tiptap/pm@3.11.0':
+ dependencies:
+ prosemirror-changeset: 2.3.1
+ prosemirror-collab: 1.3.1
+ prosemirror-commands: 1.7.1
+ prosemirror-dropcursor: 1.8.2
+ prosemirror-gapcursor: 1.4.0
+ prosemirror-history: 1.5.0
+ prosemirror-inputrules: 1.5.1
+ prosemirror-keymap: 1.2.3
+ prosemirror-markdown: 1.13.2
+ prosemirror-menu: 1.2.5
+ prosemirror-model: 1.25.4
+ prosemirror-schema-basic: 1.2.4
+ prosemirror-schema-list: 1.5.1
+ prosemirror-state: 1.4.4
+ prosemirror-tables: 1.8.1
+ prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)
+ prosemirror-transform: 1.10.5
+ prosemirror-view: 1.41.3
+
+ '@tiptap/react@3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+ '@types/react': 19.2.6
+ '@types/react-dom': 19.2.3(@types/react@19.2.6)
+ '@types/use-sync-external-store': 0.0.6
+ fast-deep-equal: 3.1.3
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ use-sync-external-store: 1.6.0(react@19.1.0)
+ optionalDependencies:
+ '@tiptap/extension-bubble-menu': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-floating-menu': 3.11.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ transitivePeerDependencies:
+ - '@floating-ui/dom'
+
+ '@tiptap/starter-kit@3.11.0':
+ dependencies:
+ '@tiptap/core': 3.11.0(@tiptap/pm@3.11.0)
+ '@tiptap/extension-blockquote': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-bold': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-bullet-list': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-code': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-code-block': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-document': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-dropcursor': 3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-gapcursor': 3.11.0(@tiptap/extensions@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-hard-break': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-heading': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-horizontal-rule': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-italic': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-link': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-list': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/extension-list-item': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-list-keymap': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-ordered-list': 3.11.0(@tiptap/extension-list@3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0))
+ '@tiptap/extension-paragraph': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-strike': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-text': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extension-underline': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))
+ '@tiptap/extensions': 3.11.0(@tiptap/core@3.11.0(@tiptap/pm@3.11.0))(@tiptap/pm@3.11.0)
+ '@tiptap/pm': 3.11.0
+
+ '@trysound/sax@0.2.0': {}
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/estree@1.0.8': {}
+
+ '@types/js-cookie@3.0.6': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/linkify-it@5.0.0': {}
+
+ '@types/markdown-it@14.1.2':
+ dependencies:
+ '@types/linkify-it': 5.0.0
+ '@types/mdurl': 2.0.0
+
+ '@types/mdurl@2.0.0': {}
+
+ '@types/node@20.19.25':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/react-dom@19.2.3(@types/react@19.2.6)':
+ dependencies:
+ '@types/react': 19.2.6
+
+ '@types/react@19.2.6':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/trusted-types@2.0.7':
+ optional: true
+
+ '@types/use-sync-external-store@0.0.6': {}
+
+ '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.47.0
+ '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.47.0
+ eslint: 9.39.1(jiti@2.6.1)
+ graphemer: 1.4.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.47.0
+ '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.47.0
+ debug: 4.4.3
+ eslint: 9.39.1(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.47.0
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.47.0':
+ dependencies:
+ '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/visitor-keys': 8.47.0
+
+ '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.1(jiti@2.6.1)
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.47.0': {}
+
+ '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/visitor-keys': 8.47.0
+ debug: 4.4.3
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.7.3
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.47.0
+ '@typescript-eslint/types': 8.47.0
+ '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3)
+ eslint: 9.39.1(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.47.0':
+ dependencies:
+ '@typescript-eslint/types': 8.47.0
+ eslint-visitor-keys: 4.2.1
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.12
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ optional: true
+
+ acorn-jsx@5.3.2(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ agent-base@7.1.4: {}
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.6:
+ dependencies:
+ tslib: 2.8.1
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-includes@3.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.findlastindex@1.2.6:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ ast-types-flow@0.0.8: {}
+
+ async-function@1.0.0: {}
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axe-core@4.11.0: {}
+
+ axobject-query@4.1.0: {}
+
+ babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5):
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/core': 7.28.5
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5):
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5)
+ core-js-compat: 3.47.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5):
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5)
+ transitivePeerDependencies:
+ - supports-color
+
+ balanced-match@1.0.2: {}
+
+ baseline-browser-mapping@2.8.29: {}
+
+ bidi-js@1.0.3:
+ dependencies:
+ require-from-string: 2.0.2
+
+ big-integer@1.6.52: {}
+
+ boolbase@1.0.0: {}
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ broadcast-channel@3.7.0:
+ dependencies:
+ '@babel/runtime': 7.28.4
+ detect-node: 2.1.0
+ js-sha3: 0.8.0
+ microseconds: 0.2.0
+ nano-time: 1.0.0
+ oblivious-set: 1.0.0
+ rimraf: 3.0.2
+ unload: 2.2.0
+
+ browserslist@4.28.0:
+ dependencies:
+ baseline-browser-mapping: 2.8.29
+ caniuse-lite: 1.0.30001756
+ electron-to-chromium: 1.5.256
+ node-releases: 2.0.27
+ update-browserslist-db: 1.1.4(browserslist@4.28.0)
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ camelcase@6.3.0: {}
+
+ caniuse-lite@1.0.30001756: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
+ client-only@0.0.1: {}
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ commander@7.2.0: {}
+
+ commander@9.5.0: {}
+
+ concat-map@0.0.1: {}
+
+ convert-source-map@2.0.0: {}
+
+ core-js-compat@3.47.0:
+ dependencies:
+ browserslist: 4.28.0
+
+ cosmiconfig@8.3.6(typescript@5.9.3):
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.9.3
+
+ crelt@1.0.6: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@2.3.1:
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.1
+
+ css-tree@3.1.0:
+ dependencies:
+ mdn-data: 2.12.2
+ source-map-js: 1.2.1
+
+ css-what@6.2.2: {}
+
+ cssesc@3.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ cssstyle@5.3.3:
+ dependencies:
+ '@asamuzakjp/css-color': 4.0.5
+ '@csstools/css-syntax-patches-for-csstree': 1.0.16
+ css-tree: 3.1.0
+
+ csstype@3.2.3: {}
+
+ damerau-levenshtein@1.0.8: {}
+
+ dashify@2.0.0: {}
+
+ data-urls@6.0.0:
+ dependencies:
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 15.1.0
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decimal.js@10.6.0: {}
+
+ deep-is@0.1.4: {}
+
+ deepmerge@4.3.1: {}
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ detect-libc@2.1.2: {}
+
+ detect-node-es@1.1.0: {}
+
+ detect-node@2.1.0: {}
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ dompurify@3.3.0:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ electron-to-chromium@1.5.256: {}
+
+ emoji-regex@9.2.2: {}
+
+ enhanced-resolve@5.18.3:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.24.0:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.19
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-iterator-helpers@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ safe-array-concat: 1.1.3
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.1.0:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-config-next@15.5.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
+ dependencies:
+ '@next/eslint-plugin-next': 15.5.4
+ '@rushstack/eslint-patch': 1.15.0
+ '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.1(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1))
+ eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1))
+ eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1))
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3
+ eslint: 9.39.1(jiti@2.6.1)
+ get-tsconfig: 4.13.0
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.15
+ unrs-resolver: 1.11.1
+ optionalDependencies:
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.1(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.39.1(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1))
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ aria-query: 5.3.2
+ array-includes: 3.1.9
+ array.prototype.flatmap: 1.3.3
+ ast-types-flow: 0.0.8
+ axe-core: 4.11.0
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 9.39.1(jiti@2.6.1)
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.1.0
+ string.prototype.includes: 2.0.1
+
+ eslint-plugin-prettier@5.5.4(eslint@9.39.1(jiti@2.6.1))(prettier@2.8.8):
+ dependencies:
+ eslint: 9.39.1(jiti@2.6.1)
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ synckit: 0.11.11
+
+ eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ eslint: 9.39.1(jiti@2.6.1)
+
+ eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)):
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.2.1
+ eslint: 9.39.1(jiti@2.6.1)
+ estraverse: 5.3.0
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+ string.prototype.repeat: 1.0.0
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint@9.39.1(jiti@2.6.1):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.1
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.1
+ '@eslint/js': 9.39.1
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-diff@1.3.0: {}
+
+ fast-glob@3.3.1:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+
+ flatted@3.3.3: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ framer-motion@12.23.24(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ dependencies:
+ motion-dom: 12.23.23
+ motion-utils: 12.23.6
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.2:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ generator-function@2.0.1: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-nonce@1.0.1: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-tsconfig@4.13.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ glob@8.1.0:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.1.6
+ once: 1.4.0
+
+ globals@14.0.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ has-bigints@1.1.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ heic2any@0.0.4: {}
+
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-arrayish@0.2.1: {}
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-bun-module@2.0.0:
+ dependencies:
+ semver: 7.7.3
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-generator-function@1.1.2:
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.19
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ isomorphic-dompurify@2.32.0:
+ dependencies:
+ dompurify: 3.3.0
+ jsdom: 27.2.0
+ transitivePeerDependencies:
+ - bufferutil
+ - canvas
+ - supports-color
+ - utf-8-validate
+
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+
+ jiti@2.6.1: {}
+
+ js-cookie@3.0.5: {}
+
+ js-sha3@0.8.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ jsdom@27.2.0:
+ dependencies:
+ '@acemir/cssom': 0.9.23
+ '@asamuzakjp/dom-selector': 6.7.4
+ cssstyle: 5.3.3
+ data-urls: 6.0.0
+ decimal.js: 10.6.0
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ is-potential-custom-element-name: 1.0.1
+ parse5: 8.0.0
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 6.0.0
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 8.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 15.1.0
+ ws: 8.18.3
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ language-subtag-registry@0.3.23: {}
+
+ language-tags@1.0.9:
+ dependencies:
+ language-subtag-registry: 0.3.23
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lightningcss-android-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-x64@1.30.2:
+ optional: true
+
+ lightningcss-freebsd-x64@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.30.2:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ optional: true
+
+ lightningcss@1.30.2:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.30.2
+ lightningcss-darwin-arm64: 1.30.2
+ lightningcss-darwin-x64: 1.30.2
+ lightningcss-freebsd-x64: 1.30.2
+ lightningcss-linux-arm-gnueabihf: 1.30.2
+ lightningcss-linux-arm64-gnu: 1.30.2
+ lightningcss-linux-arm64-musl: 1.30.2
+ lightningcss-linux-x64-gnu: 1.30.2
+ lightningcss-linux-x64-musl: 1.30.2
+ lightningcss-win32-arm64-msvc: 1.30.2
+ lightningcss-win32-x64-msvc: 1.30.2
+
+ lines-and-columns@1.2.4: {}
+
+ linkify-it@5.0.0:
+ dependencies:
+ uc.micro: 2.1.0
+
+ linkifyjs@4.3.2: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.debounce@4.0.8: {}
+
+ lodash.merge@4.6.2: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ lru-cache@11.2.2: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lucide-react@0.548.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ markdown-it@14.1.0:
+ dependencies:
+ argparse: 2.0.1
+ entities: 4.5.0
+ linkify-it: 5.0.0
+ mdurl: 2.0.0
+ punycode.js: 2.3.1
+ uc.micro: 2.1.0
+
+ match-sorter@6.3.4:
+ dependencies:
+ '@babel/runtime': 7.28.4
+ remove-accents: 0.5.0
+
+ math-intrinsics@1.1.0: {}
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.0.30: {}
+
+ mdn-data@2.12.2: {}
+
+ mdurl@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ microseconds@0.2.0: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimist@1.2.8: {}
+
+ motion-dom@12.23.23:
+ dependencies:
+ motion-utils: 12.23.6
+
+ motion-utils@12.23.6: {}
+
+ ms@2.1.3: {}
+
+ nano-time@1.0.0:
+ dependencies:
+ big-integer: 1.6.52
+
+ nanoid@3.3.11: {}
+
+ napi-postinstall@0.3.4: {}
+
+ natural-compare@1.4.0: {}
+
+ next@15.5.7(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@next/env': 15.5.7
+ '@swc/helpers': 0.5.15
+ caniuse-lite: 1.0.30001756
+ postcss: 8.4.31
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.1.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
+ '@playwright/test': 1.56.1
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-releases@2.0.27: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ oblivious-set@1.0.0: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ orderedmap@2.1.1: {}
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse5@8.0.0:
+ dependencies:
+ entities: 6.0.1
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-type@4.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.3: {}
+
+ playwright-core@1.56.1: {}
+
+ playwright@1.56.1:
+ dependencies:
+ playwright-core: 1.56.1
+ optionalDependencies:
+ fsevents: 2.3.2
+
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier-plugin-tailwindcss@0.6.14(prettier@2.8.8):
+ dependencies:
+ prettier: 2.8.8
+
+ prettier@2.8.8: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ prosemirror-changeset@2.3.1:
+ dependencies:
+ prosemirror-transform: 1.10.5
+
+ prosemirror-collab@1.3.1:
+ dependencies:
+ prosemirror-state: 1.4.4
+
+ prosemirror-commands@1.7.1:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+
+ prosemirror-dropcursor@1.8.2:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+ prosemirror-view: 1.41.3
+
+ prosemirror-gapcursor@1.4.0:
+ dependencies:
+ prosemirror-keymap: 1.2.3
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-view: 1.41.3
+
+ prosemirror-history@1.5.0:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+ prosemirror-view: 1.41.3
+ rope-sequence: 1.3.4
+
+ prosemirror-inputrules@1.5.1:
+ dependencies:
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+
+ prosemirror-keymap@1.2.3:
+ dependencies:
+ prosemirror-state: 1.4.4
+ w3c-keyname: 2.2.8
+
+ prosemirror-markdown@1.13.2:
+ dependencies:
+ '@types/markdown-it': 14.1.2
+ markdown-it: 14.1.0
+ prosemirror-model: 1.25.4
+
+ prosemirror-menu@1.2.5:
+ dependencies:
+ crelt: 1.0.6
+ prosemirror-commands: 1.7.1
+ prosemirror-history: 1.5.0
+ prosemirror-state: 1.4.4
+
+ prosemirror-model@1.25.4:
+ dependencies:
+ orderedmap: 2.1.1
+
+ prosemirror-schema-basic@1.2.4:
+ dependencies:
+ prosemirror-model: 1.25.4
+
+ prosemirror-schema-list@1.5.1:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+
+ prosemirror-state@1.4.4:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-transform: 1.10.5
+ prosemirror-view: 1.41.3
+
+ prosemirror-tables@1.8.1:
+ dependencies:
+ prosemirror-keymap: 1.2.3
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+ prosemirror-view: 1.41.3
+
+ prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3):
+ dependencies:
+ '@remirror/core-constants': 3.0.0
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-view: 1.41.3
+
+ prosemirror-transform@1.10.5:
+ dependencies:
+ prosemirror-model: 1.25.4
+
+ prosemirror-view@1.41.3:
+ dependencies:
+ prosemirror-model: 1.25.4
+ prosemirror-state: 1.4.4
+ prosemirror-transform: 1.10.5
+
+ punycode.js@2.3.1: {}
+
+ punycode@2.3.1: {}
+
+ qrcode.react@4.2.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ queue-microtask@1.2.3: {}
+
+ react-dom@19.1.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ scheduler: 0.26.0
+
+ react-is@16.13.1: {}
+
+ react-loading-skeleton@3.5.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ react-query@3.39.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/runtime': 7.28.4
+ broadcast-channel: 3.7.0
+ match-sorter: 6.3.4
+ react: 19.1.0
+ optionalDependencies:
+ react-dom: 19.1.0(react@19.1.0)
+
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.6)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-style-singleton: 2.2.3(@types/react@19.2.6)(react@19.1.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ react-remove-scroll@2.7.1(@types/react@19.2.6)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.6)(react@19.1.0)
+ react-style-singleton: 2.2.3(@types/react@19.2.6)(react@19.1.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.2.6)(react@19.1.0)
+ use-sidecar: 1.1.3(@types/react@19.2.6)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ react-style-singleton@2.2.3(@types/react@19.2.6)(react@19.1.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ react@19.1.0: {}
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regenerate-unicode-properties@10.2.2:
+ dependencies:
+ regenerate: 1.4.2
+
+ regenerate@1.4.2: {}
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ regexpu-core@6.4.0:
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.2.2
+ regjsgen: 0.8.0
+ regjsparser: 0.13.0
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.2.1
+
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.13.0:
+ dependencies:
+ jsesc: 3.1.0
+
+ remove-accents@0.5.0: {}
+
+ require-from-string@2.0.2: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ resolve@2.0.0-next.5:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ reusify@1.1.0: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rope-sequence@1.3.4: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safer-buffer@2.1.2: {}
+
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
+ scheduler@0.26.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.7.3: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ source-map-js@1.2.1: {}
+
+ stable-hash@0.0.5: {}
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ string.prototype.includes@2.0.1:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+
+ string.prototype.matchall@4.0.12:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+
+ string.prototype.repeat@1.0.0:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ strip-bom@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.0):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.1.0
+ optionalDependencies:
+ '@babel/core': 7.28.5
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svg-parser@2.0.4: {}
+
+ svgo@3.3.2:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 5.2.2
+ css-tree: 2.3.1
+ css-what: 6.2.2
+ csso: 5.0.5
+ picocolors: 1.1.1
+
+ symbol-tree@3.2.4: {}
+
+ synckit@0.11.11:
+ dependencies:
+ '@pkgr/core': 0.2.9
+
+ tailwind-merge@3.4.0: {}
+
+ tailwindcss@4.1.17: {}
+
+ tapable@2.3.0: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tldts-core@7.0.18: {}
+
+ tldts@7.0.18:
+ dependencies:
+ tldts-core: 7.0.18
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ tough-cookie@6.0.0:
+ dependencies:
+ tldts: 7.0.18
+
+ tr46@6.0.0:
+ dependencies:
+ punycode: 2.3.1
+
+ ts-api-utils@2.1.0(typescript@5.9.3):
+ dependencies:
+ typescript: 5.9.3
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tw-animate-css@1.4.0: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
+ typescript-eslint@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.1(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.9.3: {}
+
+ uc.micro@2.1.0: {}
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@6.21.0: {}
+
+ unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+ unicode-match-property-ecmascript@2.0.0:
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.1
+ unicode-property-aliases-ecmascript: 2.2.0
+
+ unicode-match-property-value-ecmascript@2.2.1: {}
+
+ unicode-property-aliases-ecmascript@2.2.0: {}
+
+ unload@2.2.0:
+ dependencies:
+ '@babel/runtime': 7.28.4
+ detect-node: 2.1.0
+
+ unrs-resolver@1.11.1:
+ dependencies:
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.11.1
+ '@unrs/resolver-binding-android-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-x64': 1.11.1
+ '@unrs/resolver-binding-freebsd-x64': 1.11.1
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-musl': 1.11.1
+ '@unrs/resolver-binding-wasm32-wasi': 1.11.1
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
+
+ update-browserslist-db@1.1.4(browserslist@4.28.0):
+ dependencies:
+ browserslist: 4.28.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ use-callback-ref@1.3.3(@types/react@19.2.6)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ use-sidecar@1.1.3(@types/react@19.2.6)(react@19.1.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.6
+
+ use-sync-external-store@1.6.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ util-deprecate@1.0.2: {}
+
+ vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
+ w3c-keyname@2.2.8: {}
+
+ w3c-xmlserializer@5.0.0:
+ dependencies:
+ xml-name-validator: 5.0.0
+
+ webidl-conversions@8.0.0: {}
+
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@15.1.0:
+ dependencies:
+ tr46: 6.0.0
+ webidl-conversions: 8.0.0
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.19
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.19:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ wrappy@1.0.2: {}
+
+ ws@8.18.3: {}
+
+ xml-name-validator@5.0.0: {}
+
+ xmlchars@2.2.0: {}
+
+ yallist@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ zustand@5.0.8(@types/react@19.2.6)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)):
+ optionalDependencies:
+ '@types/react': 19.2.6
+ react: 19.1.0
+ use-sync-external-store: 1.6.0(react@19.1.0)
diff --git a/postcss.config.mjs b/postcss.config.mjs
new file mode 100644
index 0000000..c7bcb4b
--- /dev/null
+++ b/postcss.config.mjs
@@ -0,0 +1,5 @@
+const config = {
+ plugins: ["@tailwindcss/postcss"],
+};
+
+export default config;
diff --git a/public/banner.png b/public/banner.png
new file mode 100644
index 0000000..ef9d1ed
Binary files /dev/null and b/public/banner.png differ
diff --git a/public/common/manager/Tiptap-1-icon.svg b/public/common/manager/Tiptap-1-icon.svg
new file mode 100644
index 0000000..7f93b34
--- /dev/null
+++ b/public/common/manager/Tiptap-1-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-2-icon.svg b/public/common/manager/Tiptap-2-icon.svg
new file mode 100644
index 0000000..b4d48cb
--- /dev/null
+++ b/public/common/manager/Tiptap-2-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-3-icon.svg b/public/common/manager/Tiptap-3-icon.svg
new file mode 100644
index 0000000..839a96f
--- /dev/null
+++ b/public/common/manager/Tiptap-3-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-4-icon.svg b/public/common/manager/Tiptap-4-icon.svg
new file mode 100644
index 0000000..5d087f5
--- /dev/null
+++ b/public/common/manager/Tiptap-4-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-5-icon.svg b/public/common/manager/Tiptap-5-icon.svg
new file mode 100644
index 0000000..cc5a10e
--- /dev/null
+++ b/public/common/manager/Tiptap-5-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-6-icon.svg b/public/common/manager/Tiptap-6-icon.svg
new file mode 100644
index 0000000..f108998
--- /dev/null
+++ b/public/common/manager/Tiptap-6-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/Tiptap-7-icon.svg b/public/common/manager/Tiptap-7-icon.svg
new file mode 100644
index 0000000..c446e03
--- /dev/null
+++ b/public/common/manager/Tiptap-7-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/absence-icon.svg b/public/common/manager/absence-icon.svg
new file mode 100644
index 0000000..9743850
--- /dev/null
+++ b/public/common/manager/absence-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/add-photo-icon.svg b/public/common/manager/add-photo-icon.svg
new file mode 100644
index 0000000..f9335ce
--- /dev/null
+++ b/public/common/manager/add-photo-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/apple-icon.svg b/public/common/manager/apple-icon.svg
new file mode 100644
index 0000000..3f82ac6
--- /dev/null
+++ b/public/common/manager/apple-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/manager/arrow-left-icon.svg b/public/common/manager/arrow-left-icon.svg
new file mode 100644
index 0000000..4b2bfb6
--- /dev/null
+++ b/public/common/manager/arrow-left-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/attendance-icon.svg b/public/common/manager/attendance-icon.svg
new file mode 100644
index 0000000..69a5f98
--- /dev/null
+++ b/public/common/manager/attendance-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/attendance-on-icon.svg b/public/common/manager/attendance-on-icon.svg
new file mode 100644
index 0000000..ea8f1b1
--- /dev/null
+++ b/public/common/manager/attendance-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/calendar-icon.svg b/public/common/manager/calendar-icon.svg
new file mode 100644
index 0000000..144ef66
--- /dev/null
+++ b/public/common/manager/calendar-icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/calendar-on-icon.svg b/public/common/manager/calendar-on-icon.svg
new file mode 100644
index 0000000..4ccd9b4
--- /dev/null
+++ b/public/common/manager/calendar-on-icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/cancle-icon.svg b/public/common/manager/cancle-icon.svg
new file mode 100644
index 0000000..757cb8e
--- /dev/null
+++ b/public/common/manager/cancle-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/check-one-icon.svg b/public/common/manager/check-one-icon.svg
new file mode 100644
index 0000000..e2b011d
--- /dev/null
+++ b/public/common/manager/check-one-icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/chevron-left.svg b/public/common/manager/chevron-left.svg
new file mode 100644
index 0000000..56e99a0
--- /dev/null
+++ b/public/common/manager/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/chevron-right.svg b/public/common/manager/chevron-right.svg
new file mode 100644
index 0000000..1f7a2e3
--- /dev/null
+++ b/public/common/manager/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/document-icon.svg b/public/common/manager/document-icon.svg
new file mode 100644
index 0000000..c840b3d
--- /dev/null
+++ b/public/common/manager/document-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/document-on-icon.svg b/public/common/manager/document-on-icon.svg
new file mode 100644
index 0000000..0296aee
--- /dev/null
+++ b/public/common/manager/document-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/down-icon.svg b/public/common/manager/down-icon.svg
new file mode 100644
index 0000000..142002b
--- /dev/null
+++ b/public/common/manager/down-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/drop-l-icon.svg b/public/common/manager/drop-l-icon.svg
new file mode 100644
index 0000000..707a045
--- /dev/null
+++ b/public/common/manager/drop-l-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/drop-r-icon.svg b/public/common/manager/drop-r-icon.svg
new file mode 100644
index 0000000..cb1a16d
--- /dev/null
+++ b/public/common/manager/drop-r-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/edit-blue.svg b/public/common/manager/edit-blue.svg
new file mode 100644
index 0000000..19e7ddc
--- /dev/null
+++ b/public/common/manager/edit-blue.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-brown.svg b/public/common/manager/edit-brown.svg
new file mode 100644
index 0000000..40f779b
--- /dev/null
+++ b/public/common/manager/edit-brown.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-cyan.svg b/public/common/manager/edit-cyan.svg
new file mode 100644
index 0000000..edb7f55
--- /dev/null
+++ b/public/common/manager/edit-cyan.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-green.svg b/public/common/manager/edit-green.svg
new file mode 100644
index 0000000..55eaebb
--- /dev/null
+++ b/public/common/manager/edit-green.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-lime.svg b/public/common/manager/edit-lime.svg
new file mode 100644
index 0000000..8f34d13
--- /dev/null
+++ b/public/common/manager/edit-lime.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-orrange.svg b/public/common/manager/edit-orrange.svg
new file mode 100644
index 0000000..45d58bc
--- /dev/null
+++ b/public/common/manager/edit-orrange.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-pink.svg b/public/common/manager/edit-pink.svg
new file mode 100644
index 0000000..2f38b34
--- /dev/null
+++ b/public/common/manager/edit-pink.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-purple.svg b/public/common/manager/edit-purple.svg
new file mode 100644
index 0000000..3c78a4b
--- /dev/null
+++ b/public/common/manager/edit-purple.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-red.svg b/public/common/manager/edit-red.svg
new file mode 100644
index 0000000..ba0a1b0
--- /dev/null
+++ b/public/common/manager/edit-red.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/edit-yellow.svg b/public/common/manager/edit-yellow.svg
new file mode 100644
index 0000000..45d58bc
--- /dev/null
+++ b/public/common/manager/edit-yellow.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/header-arrow-right.svg b/public/common/manager/header-arrow-right.svg
new file mode 100644
index 0000000..56ecfb3
--- /dev/null
+++ b/public/common/manager/header-arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/kakao-icon.svg b/public/common/manager/kakao-icon.svg
new file mode 100644
index 0000000..b00ba48
--- /dev/null
+++ b/public/common/manager/kakao-icon.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/kupic-arrow-icon.svg b/public/common/manager/kupic-arrow-icon.svg
new file mode 100644
index 0000000..f8154ae
--- /dev/null
+++ b/public/common/manager/kupic-arrow-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/kupick-icon.svg b/public/common/manager/kupick-icon.svg
new file mode 100644
index 0000000..80ac12b
--- /dev/null
+++ b/public/common/manager/kupick-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/left-icon.svg b/public/common/manager/left-icon.svg
new file mode 100644
index 0000000..b905798
--- /dev/null
+++ b/public/common/manager/left-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/link-icon.svg b/public/common/manager/link-icon.svg
new file mode 100644
index 0000000..52c797b
--- /dev/null
+++ b/public/common/manager/link-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/log-out.svg b/public/common/manager/log-out.svg
new file mode 100644
index 0000000..e2114cf
--- /dev/null
+++ b/public/common/manager/log-out.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/manager/logo-icon.svg b/public/common/manager/logo-icon.svg
new file mode 100644
index 0000000..0f5c72b
--- /dev/null
+++ b/public/common/manager/logo-icon.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/manage-image.svg b/public/common/manager/manage-image.svg
new file mode 100644
index 0000000..f49ac23
--- /dev/null
+++ b/public/common/manager/manage-image.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/management-right-icon.svg b/public/common/manager/management-right-icon.svg
new file mode 100644
index 0000000..56ecfb3
--- /dev/null
+++ b/public/common/manager/management-right-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/manager-icon.svg b/public/common/manager/manager-icon.svg
new file mode 100644
index 0000000..846c52b
--- /dev/null
+++ b/public/common/manager/manager-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/manager-on-icon.svg b/public/common/manager/manager-on-icon.svg
new file mode 100644
index 0000000..287be86
--- /dev/null
+++ b/public/common/manager/manager-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/member-icon.svg b/public/common/manager/member-icon.svg
new file mode 100644
index 0000000..d491f2b
--- /dev/null
+++ b/public/common/manager/member-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/member-on-icon.svg b/public/common/manager/member-on-icon.svg
new file mode 100644
index 0000000..8769d99
--- /dev/null
+++ b/public/common/manager/member-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/modal-x-icon.svg b/public/common/manager/modal-x-icon.svg
new file mode 100644
index 0000000..ee4abc9
--- /dev/null
+++ b/public/common/manager/modal-x-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/naver-icon.svg b/public/common/manager/naver-icon.svg
new file mode 100644
index 0000000..cdf9da9
--- /dev/null
+++ b/public/common/manager/naver-icon.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/new-icon.svg b/public/common/manager/new-icon.svg
new file mode 100644
index 0000000..4076e47
--- /dev/null
+++ b/public/common/manager/new-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/notice-icon.svg b/public/common/manager/notice-icon.svg
new file mode 100644
index 0000000..7bb5e97
--- /dev/null
+++ b/public/common/manager/notice-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/notice-image-icon.svg b/public/common/manager/notice-image-icon.svg
new file mode 100644
index 0000000..6360878
--- /dev/null
+++ b/public/common/manager/notice-image-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/notice-on-icon.svg b/public/common/manager/notice-on-icon.svg
new file mode 100644
index 0000000..0caa61e
--- /dev/null
+++ b/public/common/manager/notice-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/notice-plus-icon.svg b/public/common/manager/notice-plus-icon.svg
new file mode 100644
index 0000000..7fb98c9
--- /dev/null
+++ b/public/common/manager/notice-plus-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/notice-setting-icon.svg b/public/common/manager/notice-setting-icon.svg
new file mode 100644
index 0000000..e2047f0
--- /dev/null
+++ b/public/common/manager/notice-setting-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/manager/notice-tag-icon.svg b/public/common/manager/notice-tag-icon.svg
new file mode 100644
index 0000000..9d5159b
--- /dev/null
+++ b/public/common/manager/notice-tag-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/phone-icon.svg b/public/common/manager/phone-icon.svg
new file mode 100644
index 0000000..90cff0c
--- /dev/null
+++ b/public/common/manager/phone-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/plus-icon.svg b/public/common/manager/plus-icon.svg
new file mode 100644
index 0000000..fe59a1c
--- /dev/null
+++ b/public/common/manager/plus-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/point-icon.svg b/public/common/manager/point-icon.svg
new file mode 100644
index 0000000..376affd
--- /dev/null
+++ b/public/common/manager/point-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/point-on-icon.svg b/public/common/manager/point-on-icon.svg
new file mode 100644
index 0000000..60a2b18
--- /dev/null
+++ b/public/common/manager/point-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/pointdown-icon.svg b/public/common/manager/pointdown-icon.svg
new file mode 100644
index 0000000..48ff947
--- /dev/null
+++ b/public/common/manager/pointdown-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/pointup-icon.svg b/public/common/manager/pointup-icon.svg
new file mode 100644
index 0000000..4a7654e
--- /dev/null
+++ b/public/common/manager/pointup-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/qr-check-icon.svg b/public/common/manager/qr-check-icon.svg
new file mode 100644
index 0000000..6750b7b
--- /dev/null
+++ b/public/common/manager/qr-check-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/qr-error-icon.svg b/public/common/manager/qr-error-icon.svg
new file mode 100644
index 0000000..8cfa03b
--- /dev/null
+++ b/public/common/manager/qr-error-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/manager/right-icon.svg b/public/common/manager/right-icon.svg
new file mode 100644
index 0000000..63d2f1f
--- /dev/null
+++ b/public/common/manager/right-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/schedule-icon.svg b/public/common/manager/schedule-icon.svg
new file mode 100644
index 0000000..e11b26f
--- /dev/null
+++ b/public/common/manager/schedule-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/schedule-on-icon.svg b/public/common/manager/schedule-on-icon.svg
new file mode 100644
index 0000000..c24dc10
--- /dev/null
+++ b/public/common/manager/schedule-on-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/manager/session-none-icon.svg b/public/common/manager/session-none-icon.svg
new file mode 100644
index 0000000..0194f5f
--- /dev/null
+++ b/public/common/manager/session-none-icon.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/manager/side-menu-icon.svg b/public/common/manager/side-menu-icon.svg
new file mode 100644
index 0000000..1c88945
--- /dev/null
+++ b/public/common/manager/side-menu-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/manager/up-icon.svg b/public/common/manager/up-icon.svg
new file mode 100644
index 0000000..1456eac
--- /dev/null
+++ b/public/common/manager/up-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/QR-icon.svg b/public/common/member/QR-icon.svg
new file mode 100644
index 0000000..66e51bd
--- /dev/null
+++ b/public/common/member/QR-icon.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/member/absence-note-icon.svg b/public/common/member/absence-note-icon.svg
new file mode 100644
index 0000000..84daaf1
--- /dev/null
+++ b/public/common/member/absence-note-icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/public/common/member/akar-icons_circle-check-fill-icon.svg b/public/common/member/akar-icons_circle-check-fill-icon.svg
new file mode 100644
index 0000000..c49dccd
--- /dev/null
+++ b/public/common/member/akar-icons_circle-check-fill-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/alert-error-icon.svg b/public/common/member/alert-error-icon.svg
new file mode 100644
index 0000000..67a207d
--- /dev/null
+++ b/public/common/member/alert-error-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/alert-info-icon.svg b/public/common/member/alert-info-icon.svg
new file mode 100644
index 0000000..debb825
--- /dev/null
+++ b/public/common/member/alert-info-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/alert-success-icon.svg b/public/common/member/alert-success-icon.svg
new file mode 100644
index 0000000..5362863
--- /dev/null
+++ b/public/common/member/alert-success-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/apple-logo-icon.svg b/public/common/member/apple-logo-icon.svg
new file mode 100644
index 0000000..2edbe09
--- /dev/null
+++ b/public/common/member/apple-logo-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/arrow-rotate-left-icon.svg b/public/common/member/arrow-rotate-left-icon.svg
new file mode 100644
index 0000000..37f8918
--- /dev/null
+++ b/public/common/member/arrow-rotate-left-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/bar-icon.svg b/public/common/member/bar-icon.svg
new file mode 100644
index 0000000..13220bb
--- /dev/null
+++ b/public/common/member/bar-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/blue-home-logo-icon.svg b/public/common/member/blue-home-logo-icon.svg
new file mode 100644
index 0000000..67d8ced
--- /dev/null
+++ b/public/common/member/blue-home-logo-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/calendar-icon.svg b/public/common/member/calendar-icon.svg
new file mode 100644
index 0000000..147c8bb
--- /dev/null
+++ b/public/common/member/calendar-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/camera-icon.svg b/public/common/member/camera-icon.svg
new file mode 100644
index 0000000..26ab921
--- /dev/null
+++ b/public/common/member/camera-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/cancel-icon.svg b/public/common/member/cancel-icon.svg
new file mode 100644
index 0000000..750d5aa
--- /dev/null
+++ b/public/common/member/cancel-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/chevron-down-icon.svg b/public/common/member/chevron-down-icon.svg
new file mode 100644
index 0000000..7f68d97
--- /dev/null
+++ b/public/common/member/chevron-down-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/chevron-left-black-icon.svg b/public/common/member/chevron-left-black-icon.svg
new file mode 100644
index 0000000..1766548
--- /dev/null
+++ b/public/common/member/chevron-left-black-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/chevron-right-gray-600-icon.svg b/public/common/member/chevron-right-gray-600-icon.svg
new file mode 100644
index 0000000..56ecfb3
--- /dev/null
+++ b/public/common/member/chevron-right-gray-600-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/chevron-right-primary-500-icon.svg b/public/common/member/chevron-right-primary-500-icon.svg
new file mode 100644
index 0000000..77c380c
--- /dev/null
+++ b/public/common/member/chevron-right-primary-500-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/chevron-up-icon.svg b/public/common/member/chevron-up-icon.svg
new file mode 100644
index 0000000..1456eac
--- /dev/null
+++ b/public/common/member/chevron-up-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/danger-icon.svg b/public/common/member/danger-icon.svg
new file mode 100644
index 0000000..4809ca7
--- /dev/null
+++ b/public/common/member/danger-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/error-404-icon.svg b/public/common/member/error-404-icon.svg
new file mode 100644
index 0000000..9403f54
--- /dev/null
+++ b/public/common/member/error-404-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/feedback-banner-profile-icon.svg b/public/common/member/feedback-banner-profile-icon.svg
new file mode 100644
index 0000000..ae79770
--- /dev/null
+++ b/public/common/member/feedback-banner-profile-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/fill-check-icon.svg b/public/common/member/fill-check-icon.svg
new file mode 100644
index 0000000..2d00022
--- /dev/null
+++ b/public/common/member/fill-check-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/gray-paperclip-icon.svg b/public/common/member/gray-paperclip-icon.svg
new file mode 100644
index 0000000..ce745f1
--- /dev/null
+++ b/public/common/member/gray-paperclip-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/help-circle-icon.svg b/public/common/member/help-circle-icon.svg
new file mode 100644
index 0000000..d0040cb
--- /dev/null
+++ b/public/common/member/help-circle-icon.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/member/home-calendar-icon.svg b/public/common/member/home-calendar-icon.svg
new file mode 100644
index 0000000..dc3a153
--- /dev/null
+++ b/public/common/member/home-calendar-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/home-logo.svg b/public/common/member/home-logo.svg
new file mode 100644
index 0000000..fedaea5
--- /dev/null
+++ b/public/common/member/home-logo.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/image-uploader-icon.svg b/public/common/member/image-uploader-icon.svg
new file mode 100644
index 0000000..995ca38
--- /dev/null
+++ b/public/common/member/image-uploader-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/kakao-logo-icon.svg b/public/common/member/kakao-logo-icon.svg
new file mode 100644
index 0000000..ca7769b
--- /dev/null
+++ b/public/common/member/kakao-logo-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/member/log-out-icon.svg b/public/common/member/log-out-icon.svg
new file mode 100644
index 0000000..ff3a69a
--- /dev/null
+++ b/public/common/member/log-out-icon.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/public/common/member/mock_profile.JPG b/public/common/member/mock_profile.JPG
new file mode 100644
index 0000000..5a0d3bf
Binary files /dev/null and b/public/common/member/mock_profile.JPG differ
diff --git a/public/common/member/notice-icon.svg b/public/common/member/notice-icon.svg
new file mode 100644
index 0000000..6f33e96
--- /dev/null
+++ b/public/common/member/notice-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/notification-icon.svg b/public/common/member/notification-icon.svg
new file mode 100644
index 0000000..5291074
--- /dev/null
+++ b/public/common/member/notification-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/paperclip-icon.svg b/public/common/member/paperclip-icon.svg
new file mode 100644
index 0000000..ce745f1
--- /dev/null
+++ b/public/common/member/paperclip-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/penalty-point-icon.svg b/public/common/member/penalty-point-icon.svg
new file mode 100644
index 0000000..48d8c19
--- /dev/null
+++ b/public/common/member/penalty-point-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/play-icon.svg b/public/common/member/play-icon.svg
new file mode 100644
index 0000000..f764d0a
--- /dev/null
+++ b/public/common/member/play-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/plus-circle-icon.svg b/public/common/member/plus-circle-icon.svg
new file mode 100644
index 0000000..19dafb5
--- /dev/null
+++ b/public/common/member/plus-circle-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/points-icon.svg b/public/common/member/points-icon.svg
new file mode 100644
index 0000000..7939ab9
--- /dev/null
+++ b/public/common/member/points-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/polygon14-icon.svg b/public/common/member/polygon14-icon.svg
new file mode 100644
index 0000000..292f0c3
--- /dev/null
+++ b/public/common/member/polygon14-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/profile-icon.svg b/public/common/member/profile-icon.svg
new file mode 100644
index 0000000..360dae5
--- /dev/null
+++ b/public/common/member/profile-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/public/common/member/refresh-cw-icon.svg b/public/common/member/refresh-cw-icon.svg
new file mode 100644
index 0000000..4639e99
--- /dev/null
+++ b/public/common/member/refresh-cw-icon.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/common/member/reward-point-icon.svg b/public/common/member/reward-point-icon.svg
new file mode 100644
index 0000000..5514dfc
--- /dev/null
+++ b/public/common/member/reward-point-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/schedule-icon.svg b/public/common/member/schedule-icon.svg
new file mode 100644
index 0000000..ffa4ba1
--- /dev/null
+++ b/public/common/member/schedule-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/search-icon.svg b/public/common/member/search-icon.svg
new file mode 100644
index 0000000..eefa2f0
--- /dev/null
+++ b/public/common/member/search-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/session-notice-blue-icon.svg b/public/common/member/session-notice-blue-icon.svg
new file mode 100644
index 0000000..b4c8de5
--- /dev/null
+++ b/public/common/member/session-notice-blue-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/setting-icon.svg b/public/common/member/setting-icon.svg
new file mode 100644
index 0000000..c5b9933
--- /dev/null
+++ b/public/common/member/setting-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/upload-cloud-icon.svg b/public/common/member/upload-cloud-icon.svg
new file mode 100644
index 0000000..73eff2a
--- /dev/null
+++ b/public/common/member/upload-cloud-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/common/member/white_X_icon.svg b/public/common/member/white_X_icon.svg
new file mode 100644
index 0000000..cc0f244
--- /dev/null
+++ b/public/common/member/white_X_icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/x-circle-icon.svg b/public/common/member/x-circle-icon.svg
new file mode 100644
index 0000000..47c3b28
--- /dev/null
+++ b/public/common/member/x-circle-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/common/member/x-gray-300-icon.svg b/public/common/member/x-gray-300-icon.svg
new file mode 100644
index 0000000..d1a2188
--- /dev/null
+++ b/public/common/member/x-gray-300-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/common/member/x-icon.svg b/public/common/member/x-icon.svg
new file mode 100644
index 0000000..2ab947e
--- /dev/null
+++ b/public/common/member/x-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/file.svg b/public/file.svg
new file mode 100644
index 0000000..004145c
--- /dev/null
+++ b/public/file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/fonts/PretendardVariable.ttf b/public/fonts/PretendardVariable.ttf
new file mode 100644
index 0000000..32b0811
Binary files /dev/null and b/public/fonts/PretendardVariable.ttf differ
diff --git a/public/fonts/PretendardVariable.woff2 b/public/fonts/PretendardVariable.woff2
new file mode 100644
index 0000000..49c54b5
Binary files /dev/null and b/public/fonts/PretendardVariable.woff2 differ
diff --git a/public/globe.svg b/public/globe.svg
new file mode 100644
index 0000000..567f17b
--- /dev/null
+++ b/public/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/next.svg b/public/next.svg
new file mode 100644
index 0000000..5174b28
--- /dev/null
+++ b/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/people/chaejeong.png b/public/people/chaejeong.png
new file mode 100644
index 0000000..5c5fc2c
Binary files /dev/null and b/public/people/chaejeong.png differ
diff --git a/public/people/hyunjin.jpg b/public/people/hyunjin.jpg
new file mode 100644
index 0000000..0d695aa
Binary files /dev/null and b/public/people/hyunjin.jpg differ
diff --git a/public/people/inwoo.png b/public/people/inwoo.png
new file mode 100644
index 0000000..c55b352
Binary files /dev/null and b/public/people/inwoo.png differ
diff --git a/public/people/jueon.svg b/public/people/jueon.svg
new file mode 100644
index 0000000..fada1f9
--- /dev/null
+++ b/public/people/jueon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/public/people/minji.png b/public/people/minji.png
new file mode 100644
index 0000000..4f31abd
Binary files /dev/null and b/public/people/minji.png differ
diff --git a/public/people/sojeong.png b/public/people/sojeong.png
new file mode 100644
index 0000000..3e2e45d
Binary files /dev/null and b/public/people/sojeong.png differ
diff --git a/public/people/yeongrok.png b/public/people/yeongrok.png
new file mode 100644
index 0000000..251308e
Binary files /dev/null and b/public/people/yeongrok.png differ
diff --git a/public/people/yulim.png b/public/people/yulim.png
new file mode 100644
index 0000000..ec1fe50
Binary files /dev/null and b/public/people/yulim.png differ
diff --git a/public/png/mock-image-1.png b/public/png/mock-image-1.png
new file mode 100644
index 0000000..33829d5
Binary files /dev/null and b/public/png/mock-image-1.png differ
diff --git a/public/png/mock-image-2.png b/public/png/mock-image-2.png
new file mode 100644
index 0000000..44088b5
Binary files /dev/null and b/public/png/mock-image-2.png differ
diff --git a/public/png/mock-profile.png b/public/png/mock-profile.png
new file mode 100644
index 0000000..ada2c68
Binary files /dev/null and b/public/png/mock-profile.png differ
diff --git a/public/ut/UT_01.png b/public/ut/UT_01.png
new file mode 100644
index 0000000..5a7fa4d
Binary files /dev/null and b/public/ut/UT_01.png differ
diff --git a/public/ut/UT_02.png b/public/ut/UT_02.png
new file mode 100644
index 0000000..604194f
Binary files /dev/null and b/public/ut/UT_02.png differ
diff --git a/public/ut/UT_03.jpg b/public/ut/UT_03.jpg
new file mode 100644
index 0000000..275420c
Binary files /dev/null and b/public/ut/UT_03.jpg differ
diff --git a/public/ut/UT_04.jpg b/public/ut/UT_04.jpg
new file mode 100644
index 0000000..79f48db
Binary files /dev/null and b/public/ut/UT_04.jpg differ
diff --git a/public/vercel.svg b/public/vercel.svg
new file mode 100644
index 0000000..7705396
--- /dev/null
+++ b/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/window.svg b/public/window.svg
new file mode 100644
index 0000000..b2b2a44
--- /dev/null
+++ b/public/window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/(manager)/attendance/layout.tsx b/src/app/(manager)/attendance/layout.tsx
new file mode 100644
index 0000000..4657abd
--- /dev/null
+++ b/src/app/(manager)/attendance/layout.tsx
@@ -0,0 +1,3 @@
+export default function AttendanceLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/attendance/page.tsx b/src/app/(manager)/attendance/page.tsx
new file mode 100644
index 0000000..8c8a792
--- /dev/null
+++ b/src/app/(manager)/attendance/page.tsx
@@ -0,0 +1,57 @@
+import SessionInfo from '@/components/manager/attendance/SessionInfo'
+import AbsenceTable from '@/components/manager/attendance/AbsenceTable'
+import { getSessionScheduleServer, getSessionDetailServer } from '@/lib/manager/session'
+import { findUpcomingOrCurrentSession, formatDateToMD, formatTimeToHM } from '@/utils/manager/attendance'
+
+export default async function AttendancePage() {
+ // 기본값 설정
+ let currentSessionId: number | undefined
+ let title: string | undefined
+ let location: string | undefined
+ let time: string | undefined
+ let isHoliday: boolean | undefined
+ let category: string | undefined
+
+ // 세션 스케줄 가져오기
+ const sessionScheduleResult = await getSessionScheduleServer(1, 20)
+
+ // 가장 가까운 세션 찾기
+ if (sessionScheduleResult.success && sessionScheduleResult.data) {
+ const upcomingSession = findUpcomingOrCurrentSession(sessionScheduleResult.data)
+ if (upcomingSession) {
+ currentSessionId = upcomingSession.sessionId // 동적으로 세션 ID 설정
+ title = upcomingSession.title
+ isHoliday = upcomingSession.isHoliday
+ category = upcomingSession.category
+
+ // 세션 상세 정보 가져오기 (장소, 시간 정보)
+ if (upcomingSession.sessionDetailId) {
+ const sessionDetailResult = await getSessionDetailServer(upcomingSession.sessionDetailId)
+ if (sessionDetailResult.success && sessionDetailResult.data) {
+ const { place, startTime, endTime } = sessionDetailResult.data
+ const formattedDate = formatDateToMD(upcomingSession.startDate)
+ const formattedStartTime = formatTimeToHM(startTime)
+ const formattedEndTime = formatTimeToHM(endTime)
+ location = place
+ time = `${formattedDate} ${formattedStartTime} - ${formattedEndTime}`
+ }
+ }
+ }
+ }
+
+ return (
+
+
+ {currentSessionId ? (
+
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/src/app/(manager)/attendance/qr/page.tsx b/src/app/(manager)/attendance/qr/page.tsx
new file mode 100644
index 0000000..5958d02
--- /dev/null
+++ b/src/app/(manager)/attendance/qr/page.tsx
@@ -0,0 +1,5 @@
+import ManagerAttendanceQRClient from '@/components/manager/attendance/qr/ManagerAttendanceQRClient'
+
+export default function ManagerAttendanceQRPage() {
+ return
+}
diff --git a/src/app/(manager)/check-document/layout.tsx b/src/app/(manager)/check-document/layout.tsx
new file mode 100644
index 0000000..a5e4f69
--- /dev/null
+++ b/src/app/(manager)/check-document/layout.tsx
@@ -0,0 +1,3 @@
+export default function CheckDocumentLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/check-document/page.tsx b/src/app/(manager)/check-document/page.tsx
new file mode 100644
index 0000000..4f51ea6
--- /dev/null
+++ b/src/app/(manager)/check-document/page.tsx
@@ -0,0 +1,10 @@
+import CheckTable from '@/components/manager/check-document/CheckTable'
+
+export default function CheckDocumentPage() {
+ return (
+
+ 큐픽 서류 확인
+
+
+ )
+}
diff --git a/src/app/(manager)/create-notice/add/page.tsx b/src/app/(manager)/create-notice/add/page.tsx
new file mode 100644
index 0000000..dfbfe7b
--- /dev/null
+++ b/src/app/(manager)/create-notice/add/page.tsx
@@ -0,0 +1,8 @@
+import NoticeAdd from '../../../../components/manager/create-notice/notice-add/NoticeAdd'
+export default function CreateNoticeAddPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/create-notice/detail/[id]/page.tsx b/src/app/(manager)/create-notice/detail/[id]/page.tsx
new file mode 100644
index 0000000..67cc2b2
--- /dev/null
+++ b/src/app/(manager)/create-notice/detail/[id]/page.tsx
@@ -0,0 +1,21 @@
+import NoticeDetail from '@/components/manager/create-notice/notice-detail/NoticeDetail'
+import { getServerNoticeDetail } from '@/lib/manager/notice'
+
+export default async function CreateNoticeDetailPage(params: { params: { id: number } }) {
+ const { id } = await params.params
+ const { data, error } = await getServerNoticeDetail(id)
+ console.log(data)
+ if (error) {
+ return Error: {error}
+ }
+
+ if (!data) {
+ return Notice not found
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/create-notice/layout.tsx b/src/app/(manager)/create-notice/layout.tsx
new file mode 100644
index 0000000..9e26be5
--- /dev/null
+++ b/src/app/(manager)/create-notice/layout.tsx
@@ -0,0 +1,3 @@
+export default function CheckDocLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/create-notice/page.tsx b/src/app/(manager)/create-notice/page.tsx
new file mode 100644
index 0000000..b5ba34c
--- /dev/null
+++ b/src/app/(manager)/create-notice/page.tsx
@@ -0,0 +1,11 @@
+import CreateNoticeHeader from '@/components/manager/create-notice/notice-list/CreateNoticeHeader'
+import CreateNoticeBody from '@/components/manager/create-notice/notice-list/CreateNoticeBody'
+
+export default function CreateNoticePage() {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/app/(manager)/layout.tsx b/src/app/(manager)/layout.tsx
new file mode 100644
index 0000000..112c2b4
--- /dev/null
+++ b/src/app/(manager)/layout.tsx
@@ -0,0 +1,14 @@
+import ManagerHeader from '@/components/manager/common/ManagerHeader'
+import ManagerSidebar from '@/components/manager/common/ManagerSidebar'
+
+export default function ManagerLayout({ children }: { children: React.ReactNode }) {
+ return (
+
+ )
+}
diff --git a/src/app/(manager)/member-management/layout.tsx b/src/app/(manager)/member-management/layout.tsx
new file mode 100644
index 0000000..13053ab
--- /dev/null
+++ b/src/app/(manager)/member-management/layout.tsx
@@ -0,0 +1,3 @@
+export default function MemberManagementLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/member-management/page.tsx b/src/app/(manager)/member-management/page.tsx
new file mode 100644
index 0000000..23a6a20
--- /dev/null
+++ b/src/app/(manager)/member-management/page.tsx
@@ -0,0 +1,9 @@
+import MemberManagementClient from '@/components/manager/member/MemberManagementClient'
+
+export default function MemberManagementPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/page.tsx b/src/app/(manager)/page.tsx
new file mode 100644
index 0000000..0341993
--- /dev/null
+++ b/src/app/(manager)/page.tsx
@@ -0,0 +1,5 @@
+import { redirect } from 'next/navigation'
+
+export default function ManagerPage() {
+ redirect('/attendance')
+}
diff --git a/src/app/(manager)/point/layout.tsx b/src/app/(manager)/point/layout.tsx
new file mode 100644
index 0000000..10b8fd8
--- /dev/null
+++ b/src/app/(manager)/point/layout.tsx
@@ -0,0 +1,3 @@
+export default function PointLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/point/page.tsx b/src/app/(manager)/point/page.tsx
new file mode 100644
index 0000000..9854de7
--- /dev/null
+++ b/src/app/(manager)/point/page.tsx
@@ -0,0 +1,11 @@
+import PointTable from '@/components/manager/point/PointTable'
+import PointHeader from '@/components/manager/point/PointHeader'
+
+export default function PointPage() {
+ return (
+
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/add/layout.tsx b/src/app/(manager)/session-schedule/add/layout.tsx
new file mode 100644
index 0000000..d01dcd9
--- /dev/null
+++ b/src/app/(manager)/session-schedule/add/layout.tsx
@@ -0,0 +1,10 @@
+import SessionHeader from '@/components/manager/session-schedule/session-table/SessionHeader'
+
+export default function SessionAddLayout({ children }: { children: React.ReactNode }) {
+ return (
+ <>
+
+ {children}
+ >
+ )
+}
diff --git a/src/app/(manager)/session-schedule/add/page.tsx b/src/app/(manager)/session-schedule/add/page.tsx
new file mode 100644
index 0000000..90be25c
--- /dev/null
+++ b/src/app/(manager)/session-schedule/add/page.tsx
@@ -0,0 +1,9 @@
+import SessionAdd from '@/components/manager/session-schedule/session-add/SessionAdd'
+
+export default function SessionAddPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/detail-add/[sessionId]/page.tsx b/src/app/(manager)/session-schedule/detail-add/[sessionId]/page.tsx
new file mode 100644
index 0000000..0be3216
--- /dev/null
+++ b/src/app/(manager)/session-schedule/detail-add/[sessionId]/page.tsx
@@ -0,0 +1,9 @@
+import SessionDetailAdd from '@/components/manager/session-schedule/session-detail-add/SessionDetailAdd'
+
+export default function SessionDetailAddWithId() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/detail-add/layout.tsx b/src/app/(manager)/session-schedule/detail-add/layout.tsx
new file mode 100644
index 0000000..791f84d
--- /dev/null
+++ b/src/app/(manager)/session-schedule/detail-add/layout.tsx
@@ -0,0 +1,10 @@
+import WriteHeader from "@/components/manager/session-schedule/add-post/WriteHeader"
+
+export default function SessionDetailAddLayout({ children }: { children: React.ReactNode }) {
+ return (
+ <>
+
+ {children}
+ >
+ )
+}
diff --git a/src/app/(manager)/session-schedule/detail/[sessionId]/edit/page.tsx b/src/app/(manager)/session-schedule/detail/[sessionId]/edit/page.tsx
new file mode 100644
index 0000000..3204576
--- /dev/null
+++ b/src/app/(manager)/session-schedule/detail/[sessionId]/edit/page.tsx
@@ -0,0 +1,38 @@
+import SessionDetailEdit from '@/components/manager/session-schedule/session-detail-edit/SessionDetailEdit'
+import { getSessionDetailServer } from '@/lib/manager/session'
+
+export default async function SessionEditPage({
+ params,
+ searchParams,
+}: {
+ params: Promise<{ sessionId: string }>
+ searchParams: Promise<{ date?: string }>
+}) {
+ const { sessionId } = await params
+ const { date } = await searchParams
+ console.log('SessionEditPage - sessionId (sessionDetailId):', sessionId, 'date:', date)
+
+ const sessionDetailId = Number(sessionId)
+ const result = await getSessionDetailServer(sessionDetailId)
+ console.log('SessionEditPage - API result:', result)
+ const { data: sessionDetail } = result
+
+ if (!sessionDetail) {
+ return (
+
+ Session not found.
+
+ )
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/detail/[sessionId]/page.tsx b/src/app/(manager)/session-schedule/detail/[sessionId]/page.tsx
new file mode 100644
index 0000000..89dbbfa
--- /dev/null
+++ b/src/app/(manager)/session-schedule/detail/[sessionId]/page.tsx
@@ -0,0 +1,44 @@
+import SessionDetail from '@/components/manager/session-schedule/session-detail/SessionDetail'
+import { getSessionDetailServer } from '@/lib/manager/session'
+
+export default async function SessionAddPage({
+ params,
+ searchParams,
+}: {
+ params: Promise<{ sessionId: string }>
+ searchParams: Promise<{ date?: string; sessionId?: string }>
+}) {
+ const { sessionId: sessionDetailIdParam } = await params
+ const { date, sessionId } = await searchParams
+ console.log(
+ 'SessionAddPage - received sessionDetailId:',
+ sessionDetailIdParam,
+ 'sessionId:',
+ sessionId,
+ 'date:',
+ date
+ )
+ const sessionDetailId = Number(sessionDetailIdParam)
+ const result = await getSessionDetailServer(sessionDetailId)
+ console.log('SessionAddPage - API result:', result)
+ const { data: sessionDetail } = result
+ console.log('SessionAddPage - sessionDetail:', sessionDetail)
+ if (!sessionDetail) {
+ return (
+
+ Session not found.
+
+ )
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/detail/layout.tsx b/src/app/(manager)/session-schedule/detail/layout.tsx
new file mode 100644
index 0000000..cbb61c9
--- /dev/null
+++ b/src/app/(manager)/session-schedule/detail/layout.tsx
@@ -0,0 +1,10 @@
+import WriteHeader from '@/components/manager/session-schedule/add-post/WriteHeader'
+
+export default function SessionDetailLayout({ children }: { children: React.ReactNode }) {
+ return (
+ <>
+
+ {children}
+ >
+ )
+}
diff --git a/src/app/(manager)/session-schedule/edit/layout.tsx b/src/app/(manager)/session-schedule/edit/layout.tsx
new file mode 100644
index 0000000..7b071bb
--- /dev/null
+++ b/src/app/(manager)/session-schedule/edit/layout.tsx
@@ -0,0 +1,10 @@
+import SessionHeader from '@/components/manager/session-schedule/session-table/SessionHeader'
+
+export default function SessionEditLayout({ children }: { children: React.ReactNode }) {
+ return (
+ <>
+
+ {children}
+ >
+ )
+}
diff --git a/src/app/(manager)/session-schedule/edit/page.tsx b/src/app/(manager)/session-schedule/edit/page.tsx
new file mode 100644
index 0000000..0f82a84
--- /dev/null
+++ b/src/app/(manager)/session-schedule/edit/page.tsx
@@ -0,0 +1,8 @@
+import SessionEditTable from '@/components/manager/session-schedule/session-edit/SessionEditTable'
+export default function SessionEditPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/session-schedule/layout.tsx b/src/app/(manager)/session-schedule/layout.tsx
new file mode 100644
index 0000000..29fc3d8
--- /dev/null
+++ b/src/app/(manager)/session-schedule/layout.tsx
@@ -0,0 +1,5 @@
+import { SessionEditProvider } from '@/components/manager/session-schedule/session-table/SessionEditContext'
+
+export default function SessionScheduleLayout({ children }: { children: React.ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(manager)/session-schedule/page.tsx b/src/app/(manager)/session-schedule/page.tsx
new file mode 100644
index 0000000..0a3c537
--- /dev/null
+++ b/src/app/(manager)/session-schedule/page.tsx
@@ -0,0 +1,21 @@
+import { redirect } from 'next/navigation'
+import SessionNone from '@/components/manager/session-schedule/SessionNone'
+import { getSessionScheduleServer } from '@/lib/manager/session'
+
+export default async function SessionSchedulePage() {
+ // 저장된 세션이 있는지 확인
+ const result = await getSessionScheduleServer(1, 10)
+ console.log('SessionSchedulePage - session check result:', result)
+
+ // 세션이 있으면 편집 페이지로 리디렉션
+ const hasSession = result.success && result.data && result.data.length > 0
+ if (hasSession) {
+ redirect('/session-schedule/edit')
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(manager)/staff-management/layout.tsx b/src/app/(manager)/staff-management/layout.tsx
new file mode 100644
index 0000000..c53b3e8
--- /dev/null
+++ b/src/app/(manager)/staff-management/layout.tsx
@@ -0,0 +1,3 @@
+export default function StaffManagementLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>
+}
diff --git a/src/app/(manager)/staff-management/page.tsx b/src/app/(manager)/staff-management/page.tsx
new file mode 100644
index 0000000..20f362d
--- /dev/null
+++ b/src/app/(manager)/staff-management/page.tsx
@@ -0,0 +1,17 @@
+'use client'
+import TeamTable from '@/components/manager/staff-management/TeamTable'
+import StaffHeader from '@/components/manager/staff-management/StaffHeader'
+import { useState } from 'react'
+export default function StaffManagementPage() {
+ const [isEditMode, setIsEditMode] = useState(false)
+ const [handleSaveRoles, setHandleSaveRoles] = useState<(() => void) | null>(null)
+
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/alarm/layout.tsx b/src/app/(member)/alarm/layout.tsx
new file mode 100644
index 0000000..c173d11
--- /dev/null
+++ b/src/app/(member)/alarm/layout.tsx
@@ -0,0 +1,5 @@
+import { ReactNode } from 'react'
+
+export default function AlarmLayout({ children }: { children: ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/alarm/page.tsx b/src/app/(member)/alarm/page.tsx
new file mode 100644
index 0000000..8959e72
--- /dev/null
+++ b/src/app/(member)/alarm/page.tsx
@@ -0,0 +1,45 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { PenaltyPointIcon, RewardPointIcon, SessionNoticeBlueIcon } from '@/assets/svgComponents'
+
+export default function AlarmPage() {
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(member)/attendance-check/layout.tsx b/src/app/(member)/attendance-check/layout.tsx
new file mode 100644
index 0000000..8d3ed8a
--- /dev/null
+++ b/src/app/(member)/attendance-check/layout.tsx
@@ -0,0 +1,9 @@
+import { ReactNode } from 'react'
+
+export default function AttendanceCheckLayout({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/src/app/(member)/attendance-check/page.tsx b/src/app/(member)/attendance-check/page.tsx
new file mode 100644
index 0000000..27ecdbf
--- /dev/null
+++ b/src/app/(member)/attendance-check/page.tsx
@@ -0,0 +1,26 @@
+import QRcode from '@/components/member/attendance/QRcode'
+import UserSummaryCard from '@/components/member/attendance/UserSummaryCard'
+
+import { postServerAttendanceToken } from '@/lib/member/server/attendance'
+import MemberHeader from '@/components/member/common/MemberHeader'
+
+export const dynamic = 'force-dynamic'
+
+export default async function AttendanceCheckPage() {
+ const result = await postServerAttendanceToken()
+ return (
+ <>
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/app/(member)/home/layout.tsx b/src/app/(member)/home/layout.tsx
new file mode 100644
index 0000000..2fb90c8
--- /dev/null
+++ b/src/app/(member)/home/layout.tsx
@@ -0,0 +1,13 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { ReactNode } from 'react'
+
+export default function HomeLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+ {/*
*/}
+
+ {children}
+
+ )
+}
diff --git a/src/app/(member)/home/page.tsx b/src/app/(member)/home/page.tsx
new file mode 100644
index 0000000..8911bbf
--- /dev/null
+++ b/src/app/(member)/home/page.tsx
@@ -0,0 +1,39 @@
+import { getProfileSummary } from '@/lib/member/user'
+
+import ProfileCard from '@/components/member/home/ProfileCard'
+import SessionScheduleCard from '@/components/member/home/SessionScheduleCard'
+import AttendanceQRCard from '@/components/member/home/AttendanceQRCard'
+import NoticeCard from '@/components/member/home/NoticeCard'
+import Banner from '@/components/member/home/Banner'
+import { getSessionThisWeek } from '@/lib/member/server/session'
+import DirectLink from '@/components/member/home/DirectLink'
+
+export default async function HomePage() {
+ const [profileSummaryResult, sessionResult] = await Promise.all([getProfileSummary(), getSessionThisWeek()])
+
+ const userData = profileSummaryResult.data
+ const sessionData = sessionResult.data
+
+ return (
+
+ )
+}
diff --git a/src/app/(member)/ku-pick/application/page.tsx b/src/app/(member)/ku-pick/application/page.tsx
new file mode 100644
index 0000000..baaae3d
--- /dev/null
+++ b/src/app/(member)/ku-pick/application/page.tsx
@@ -0,0 +1,33 @@
+import { getKuPickMy } from '@/lib/member/server/ku-pick'
+
+import MemberHeader from '@/components/member/common/MemberHeader'
+import ApplicationImageUploader from '@/components/member/ku-pick/ApplicationImageUploader'
+
+export const dynamic = 'force-dynamic'
+
+export default async function KuPickApplicationPage() {
+ const myKuPickResponseData = await getKuPickMy()
+ const myKuPickData = myKuPickResponseData?.data
+
+ return (
+
+
+
+ {/*
*/}
+
+
+
STEP 1
+
+
신청 사진을 업로드해주세요
+
+
+
+ 각 큐픽 링크로 개별 지원 후,
+ 신청 페이지를 캡처해 업로드해 주세요
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/ku-pick/guide/page.tsx b/src/app/(member)/ku-pick/guide/page.tsx
new file mode 100644
index 0000000..2eb3f3e
--- /dev/null
+++ b/src/app/(member)/ku-pick/guide/page.tsx
@@ -0,0 +1,40 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+
+export default function KuPickGuidePage() {
+ return (
+
+
+
+
+
+
큐픽이란?
+
+ 한 달에 한 번씩 열리는 온라인 세미나 강의로,
+
+ 수강하시면 상점 1점이 부여됩니다!
+
+ 큐픽으로 한 달에 얻을 수 있는 최대 상점은 1점입니다.
+
+
+
+
이달의 큐픽 신청 방법
+
+
1.
+
+ 각 큐픽에 해당하는 사이트 링크를 통해 개별적으로 지원해 주세요. (단체를 쓰라고 하는 항목이 나온다면
+ ‘한국대학생IT경영학회‘를 쓰시면 됩니다.)
+
+
+
+
2.
+
개별 지원 후 신청 페이지 캡처
+
+
+
3.
+
당일에 시청하고 있는 화면을 캡쳐 혹은 사진으로 인증
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/ku-pick/layout.tsx b/src/app/(member)/ku-pick/layout.tsx
new file mode 100644
index 0000000..1a459a4
--- /dev/null
+++ b/src/app/(member)/ku-pick/layout.tsx
@@ -0,0 +1,3 @@
+export default function QPickLayout({ children }: { children: React.ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/ku-pick/page.tsx b/src/app/(member)/ku-pick/page.tsx
new file mode 100644
index 0000000..c2fd2e6
--- /dev/null
+++ b/src/app/(member)/ku-pick/page.tsx
@@ -0,0 +1,65 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import SubmitCard from '@/components/member/ku-pick/SubmitCard'
+import { getKuPickMy } from '@/lib/member/server/ku-pick'
+import { HelpCircleIcon } from '@/assets/svgComponents/member'
+import Link from 'next/link'
+export const dynamic = 'force-dynamic'
+export default async function QPickPage() {
+ const myKuPickResponseData = await getKuPickMy()
+ const myKuPickData = myKuPickResponseData?.data
+
+ return (
+
+
+
+
+ }
+ />
+
+
+
1월 큐픽
+
+ 각 큐픽 링크로 개별 지원 후,
+
+ 신청 페이지를 캡처해 업로드해 주세요
+
+ }
+ />
+
+ 말 일까지 시청 중인 화면을 캡처하거나
+
+ 찍어서 인증해 주세요
+
+ }
+ />
+ {myKuPickData?.viewUrl && myKuPickData.applicationUrl && (
+
+ 큐픽 제출이 완료되었어요
+
+ 이달 말일까지는 이미지 수정이 가능해요
+
+ )}
+
+
+ )
+}
diff --git a/src/app/(member)/ku-pick/view/page.tsx b/src/app/(member)/ku-pick/view/page.tsx
new file mode 100644
index 0000000..9d34be2
--- /dev/null
+++ b/src/app/(member)/ku-pick/view/page.tsx
@@ -0,0 +1,33 @@
+import { getKuPickMy } from '@/lib/member/server/ku-pick'
+
+import MemberHeader from '@/components/member/common/MemberHeader'
+import ViewImageUploader from '@/components/member/ku-pick/ViewImageUploader'
+
+export const dynamic = 'force-dynamic'
+
+export default async function KuPickViewPage() {
+ const myKuPickResponseData = await getKuPickMy()
+ const myKuPickData = myKuPickResponseData?.data
+
+ return (
+
+
+
+
+
+
STEP 2
+
+
시청 인증 사진을 업로드해 주세요
+
+
+
+ 말 일까지 시청 중인 화면을 캡처하거나
+
+ 찍어서 인증해 주세요
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/layout.tsx b/src/app/(member)/layout.tsx
new file mode 100644
index 0000000..b86c4c5
--- /dev/null
+++ b/src/app/(member)/layout.tsx
@@ -0,0 +1,18 @@
+import MobileDebugPanel from '@/components/common/MobileDebugPanel'
+
+export default function MemberLayout({ children }: { children: React.ReactNode }) {
+ return (
+
+ {/* */}
+ {children}
+
+ )
+}
diff --git a/src/app/(member)/my-attendance/layout.tsx b/src/app/(member)/my-attendance/layout.tsx
new file mode 100644
index 0000000..31339a1
--- /dev/null
+++ b/src/app/(member)/my-attendance/layout.tsx
@@ -0,0 +1,15 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { ReactNode } from 'react'
+
+export default function MyAttendanceLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+
+ {/*
*/}
+
+ {children}
+
+
+ )
+}
diff --git a/src/app/(member)/my-attendance/page.tsx b/src/app/(member)/my-attendance/page.tsx
new file mode 100644
index 0000000..d7fddff
--- /dev/null
+++ b/src/app/(member)/my-attendance/page.tsx
@@ -0,0 +1,153 @@
+'use client'
+
+import { useEffect, useRef } from 'react'
+import { useInfiniteQuery } from '@tanstack/react-query'
+
+import { PenaltyPointIcon, RewardPointIcon } from '@/assets/svgComponents'
+import AttendanceItem from '@/components/member/attendance/AttendanceItem'
+import { getPointsHistory } from '@/lib/member/client/attendance'
+
+export default function MyAttendancePage() {
+ const observerTarget = useRef(null)
+
+ const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({
+ queryKey: ['pointsHistory'],
+ queryFn: async ({ pageParam = 1 }) => {
+ const result = await getPointsHistory(pageParam, 20)
+ return result.data
+ },
+ getNextPageParam: (lastPage, allPages) => {
+ if (!lastPage?.data?.records || lastPage.data.records.length < 20) {
+ return undefined
+ }
+ if (lastPage?.isLastPage === true) {
+ return undefined
+ }
+ return allPages.length + 1
+ },
+ initialPageParam: 1,
+ retry: 1,
+ throwOnError: false,
+ staleTime: 0, // 즉시 stale 상태로 변경
+ gcTime: 0, // 가비지 컬렉션 시간 0 (캐시 저장 안 함)
+ })
+
+ useEffect(() => {
+ if (!observerTarget.current) return
+
+ const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage && !error) {
+ fetchNextPage()
+ }
+ },
+ {
+ rootMargin: '100px',
+ }
+ )
+
+ observer.observe(observerTarget.current)
+
+ return () => observer.disconnect()
+ }, [hasNextPage, isFetchingNextPage, fetchNextPage, error])
+
+ const getTotalPointsColor = (totalPoint: number | undefined): string => {
+ if (!totalPoint) return ''
+ if (totalPoint < -5) return 'text-sub-red'
+ return 'text-gray-700'
+ }
+
+ if (isLoading) {
+ return (
+
+ )
+ }
+
+ if (error && (!data || data.pages.length === 0)) {
+ return (
+
+
데이터를 불러오는데 실패했습니다.
+
window.location.reload()}
+ className="rounded-lg bg-blue-500 px-4 py-2 text-white hover:bg-blue-600"
+ >
+ 다시 시도
+
+
+ )
+ }
+
+ const firstPageData = data?.pages[0]?.data
+
+ const allRecords = data?.pages.flatMap((page) => page?.data?.records || []) || []
+
+ return (
+ <>
+
+
+ {firstPageData?.name}님의 현재 상벌점
+
+ {firstPageData?.totalPoints}
+
+
+
+
+
상점
+
{firstPageData?.plusPoints}
+
+
+
+
+
벌점
+
{firstPageData?.minusPoints}
+
+
+
+
+
+ {allRecords.length === 0 ? (
+
+ ) : (
+ allRecords.map((record, index) => (
+
+ ))
+ )}
+
+
+ {isFetchingNextPage && (
+
+ )}
+
+
+ {error && allRecords.length > 0 && (
+
+
추가 데이터를 불러올 수 없습니다
+
fetchNextPage()} className="text-sm text-blue-500 hover:text-blue-600">
+ 다시 시도
+
+
+ )}
+
+ {!hasNextPage && allRecords.length > 0 && !error && (
+
+ )}
+
+
+
+
+ >
+ )
+}
diff --git a/src/app/(member)/notice/[id]/page.tsx b/src/app/(member)/notice/[id]/page.tsx
new file mode 100644
index 0000000..ec73e2a
--- /dev/null
+++ b/src/app/(member)/notice/[id]/page.tsx
@@ -0,0 +1,63 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { getNoticeDetail } from '@/lib/member/server/notice'
+import SessionContent from '@/components/member/session/SessionContent'
+import FileItem from '@/components/member/notice/FileItem'
+import Image from 'next/image'
+import ImageContainer from '@/components/member/notice/ImageContainer'
+
+interface NoticeDetailPageProps {
+ params: Promise<{
+ id: string
+ }>
+}
+
+export default async function NoticeDetail({ params }: NoticeDetailPageProps) {
+ const { id } = await params
+ const response = await getNoticeDetail(Number(id))
+ const noticeData = response.data
+
+ if (!noticeData) {
+ return (
+
+ )
+ }
+
+ return (
+
+
+ {/* 헤더 */}
+
+
+ {/* 헤더 높이 공간 */}
+
+
+
+ {/* 콘텐츠 */}
+
+ {/* 제목 & 날짜 */}
+
+ {noticeData.title}
+ {noticeData.createdAt}
+
+
+ {/* 본문 내용 */}
+
+
+ {/* 파일 */}
+ {noticeData.fileUrls && noticeData.fileUrls.length > 0 && (
+
+ {noticeData.fileUrls.map((file) => (
+
+ ))}
+
+ )}
+
+ {/* 이미지 */}
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/notice/layout.tsx b/src/app/(member)/notice/layout.tsx
new file mode 100644
index 0000000..3d3da8e
--- /dev/null
+++ b/src/app/(member)/notice/layout.tsx
@@ -0,0 +1,5 @@
+import { ReactNode } from 'react'
+
+export default function NoticeLayout({ children }: { children: ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/notice/page.tsx b/src/app/(member)/notice/page.tsx
new file mode 100644
index 0000000..ef49d12
--- /dev/null
+++ b/src/app/(member)/notice/page.tsx
@@ -0,0 +1,32 @@
+import Link from 'next/link'
+import MemberHeader from '@/components/member/common/MemberHeader'
+import NoticeCategories from '@/components/member/notice/NoticeCategories'
+
+import { SearchIcon } from '@/assets/svgComponents/member'
+import { getNoticeCategories } from '@/lib/member/server/notice'
+import NoticeList from '@/components/member/notice/NoticeList'
+
+export default async function NoticePage() {
+ const noticeCategoriesResponse = await getNoticeCategories()
+ const noticeCategories = noticeCategoriesResponse.data
+
+ return (
+
+
+
+
+ }
+ />
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/notice/search/page.tsx b/src/app/(member)/notice/search/page.tsx
new file mode 100644
index 0000000..8441b0a
--- /dev/null
+++ b/src/app/(member)/notice/search/page.tsx
@@ -0,0 +1,131 @@
+'use client'
+
+import { useEffect, useRef, useState } from 'react'
+import { useInfiniteQuery } from '@tanstack/react-query'
+import { getNoticeSearch } from '@/lib/member/client/notice'
+
+import NoticeSearchHeader from '@/components/member/notice/NoticeSearchHeader'
+import NoticeCard from '@/components/member/notice/NoticeCard'
+
+export default function NoticeSearchPage() {
+ const [searchValue, setSearchValue] = useState('')
+
+ const observerTarget = useRef(null)
+
+ const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({
+ queryKey: ['notices', searchValue],
+ queryFn: async ({ pageParam = 1 }) => {
+ console.log('API 요청:', { pageParam, searchValue }) // 디버깅용
+ const result = await getNoticeSearch(pageParam, 20, searchValue)
+ console.log('API 응답:', result)
+ return result.data
+ },
+ getNextPageParam: (lastPage, allPages) => {
+ if (!lastPage?.data || lastPage.data.data.length < 20) {
+ return undefined
+ }
+ if (lastPage?.data.isLastPage === true) {
+ return undefined
+ }
+ return allPages.length + 1
+ },
+ initialPageParam: 1,
+ retry: 1,
+ throwOnError: false,
+ enabled: searchValue.length > 0,
+ staleTime: 0,
+ gcTime: 0,
+ refetchOnWindowFocus: true,
+ })
+
+ useEffect(() => {
+ if (!observerTarget.current) return
+
+ const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage && !error) {
+ fetchNextPage()
+ }
+ },
+ {
+ rootMargin: '100px',
+ }
+ )
+
+ observer.observe(observerTarget.current)
+
+ return () => observer.disconnect()
+ }, [hasNextPage, isFetchingNextPage, fetchNextPage, error])
+
+ if (error && (!data || data.pages.length === 0) && searchValue !== '') {
+ return (
+
+
데이터를 불러오는데 실패했습니다.
+
window.location.reload()}
+ className="rounded-lg bg-blue-500 px-4 py-2 text-white hover:bg-blue-600"
+ >
+ 다시 시도
+
+
+ )
+ }
+
+ const allNoticeData = data?.pages.flatMap((page) => page?.data?.data ?? []) ?? []
+
+ return (
+
+
+
+
+ {/* 검색어 미입력 상태 */}
+ {searchValue === '' ? (
+
+ ) : /* 검색어 입력했는데 결과 없음 */ allNoticeData.length === 0 ? (
+
+
검색 결과가 없어요 띄어쓰기에 유의해 다시 검색해 보세요
+
+ ) : /* 검색 결과 있음 */ (
+ allNoticeData.map((notice) => {
+ return (
+
+
+
+ )
+ })
+ )}
+
+
+ {isFetchingNextPage && (
+
+ )}
+
+
+ {error && allNoticeData.length > 0 && (
+
+
추가 데이터를 불러올 수 없습니다
+
fetchNextPage()} className="text-sm text-blue-500 hover:text-blue-600">
+ 다시 시도
+
+
+ )}
+
+ {searchValue !== '' && !hasNextPage && allNoticeData.length > 0 && !error && (
+
+ )}
+
+
+
+ )
+}
diff --git a/src/app/(member)/reason-for-absence/guide/layout.tsx b/src/app/(member)/reason-for-absence/guide/layout.tsx
new file mode 100644
index 0000000..a961b38
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/guide/layout.tsx
@@ -0,0 +1,12 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { ReactNode } from 'react'
+
+export default function ReasonForAbsenceGuideLayout({ children }: { children: ReactNode }) {
+ return (
+
+ )
+}
diff --git a/src/app/(member)/reason-for-absence/guide/page.tsx b/src/app/(member)/reason-for-absence/guide/page.tsx
new file mode 100644
index 0000000..02c4a85
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/guide/page.tsx
@@ -0,0 +1,63 @@
+import { GuideSection } from '@/types/member/absence'
+
+const ATTENDANCE_GUIDE_SECTIONS: GuideSection[] = [
+ {
+ id: 'completion-condition',
+ title: '큐시즘 수료 가능 조건',
+ description: '기수의 마지막 활동일 기준 상벌점 -5 이하일시 수료 가능',
+ },
+ {
+ id: 'attendance-absence',
+ title: '출석 / 결석',
+ description: '부득이한 불참의 경우, 해당 세션 주의 목요일 23:59분까지 불참 사유서 제출',
+ },
+ {
+ id: 'attendance-standard',
+ title: '출석 인정 기준',
+ description: '세션 시작시에 도착 시 출석 인정\nex) 12시 세션 시작 / 12시까지 도착 시 인정',
+ },
+ {
+ id: 'tardiness-standard',
+ title: '지각 / 조퇴 처리 기준',
+ description:
+ '지각: 세션 시작 후 20분 이내에 도착\n조퇴: 세션 종료 1시간 전 조퇴\n지각 / 조퇴 각각 벌점 -1점으로 처리\n',
+ },
+ {
+ id: 'absence-standard',
+ title: '결석 기준',
+ description:
+ '1. 당일 학교 시험 및 수업 \n증빙 서류 지참 시 벌점 1점 증빙 \n예시: 당일 학교 시험 및 수업 관련 공지\n\n2. 세션 시작 20분 이후 도착\n- 예외 없음 \n- 벌점 2점\n\n3. 사유서 미제출 \n- 예외 없음 \n- 벌점 3점',
+ },
+ {
+ id: 'exception-rules',
+ title: '예외 규정',
+ description:
+ '1. 기업 코딩 테스트 및 취업 활동\n - 증빙 서류 제출 시 인정 결석 처리 \n - 단순 자격증 취득을 위한 응시는 해당되지 않음\n\n증빙 예시 (택 1)\n - 코딩 테스트 날짜 및 시간이 나온 스크린샷\n - 코딩 테스트 완료 스크린샷 (이름을 제외한 개인정보는 가려주세요)\n - 면접 시간 포함된 이메일 스크린샷 (이름을 제외한 개인정보는 가려주세요)\n\n\n2. 질병\n - 증빙 서류 제출 시 인정 결석 처리\n - 증빙 예시: 진단서\n\n3. 4촌 이내의 경조사\n - 출석 인정\n - 지인 경조사는 해당 되지 않음\n\n4. 천재지변, 감염병 등 국가 위기 재난 상황으로 인한 행정 명령',
+ },
+ {
+ id: 'reward-standard',
+ title: '상점 기준 (수료일 전날 부여)',
+ description:
+ '1. 명절 및 연휴 기간 열리는 커리큘럼에 지각 하지 않고 참석한 경우\n - 상점 1점 부여\n\n2. 경영총괄팀이 선별한 외부행사에 참여하는 경우 (큐픽)\n - 상점 1점 부여\n - 인증 예시: 듣고 있는 화면 스크린샷\n\n3. 활동 수기를 작성한 경우 (큐포터즈)\n - 상점 1점 부여\n\n4. 운영진으로 맡은 직무를 끝까지 수행한 경우\n - 상점 1점 부여\n\n5. 해당 기수에 운영되는 스터디에 성실히 임한 경우\n - 상점 1점 부여\n - 스터디 팀장이 스터디 보고서를 모두 제출한 경우\n - 해당 스터디를 진행하는 팀원이 스터디 기간동안 모든 스터디 일정에 출석한 경우\n\n6. TF 팀의 PM / 팀장 / 팀원으로 참여하는 자 \n - 상점 2점 부여',
+ },
+]
+export default function ReasonForAbsenceGuidePage() {
+ return (
+
+ {ATTENDANCE_GUIDE_SECTIONS.map((section, index) => {
+ const isFirst = index === 0
+ return (
+
+ {section.title}
+ {section.description}
+
+ )
+ })}
+
+ )
+}
diff --git a/src/app/(member)/reason-for-absence/layout.tsx b/src/app/(member)/reason-for-absence/layout.tsx
new file mode 100644
index 0000000..ebc0505
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/layout.tsx
@@ -0,0 +1,5 @@
+import { ReactNode } from 'react'
+
+export default function ReasonForAbsenceLayout({ children }: { children: ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/reason-for-absence/page.tsx b/src/app/(member)/reason-for-absence/page.tsx
new file mode 100644
index 0000000..30edf22
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/page.tsx
@@ -0,0 +1,74 @@
+import Link from 'next/link'
+
+import ReasonForAbsenceItem from '@/components/member/reason-for-absence/ReasonForAbsenceItem'
+import MemberHeader from '@/components/member/common/MemberHeader'
+
+import { HelpCircleIcon } from '@/assets/svgComponents/member'
+import { getAbsence } from '@/lib/member/server/reason-for-absence'
+import { SubmitAbsenceType } from '@/types/member/absence'
+
+export default async function ReasonForAbsencePage() {
+ let reasonForAbsenceList: SubmitAbsenceType[] = []
+ let isError = false
+
+ try {
+ const result = await getAbsence()
+ if (result.success && result.data) {
+ reasonForAbsenceList = result.data
+ } else {
+ isError = true
+ }
+ } catch (error) {
+ console.error('불참 사유서 조회 중 에러:', error)
+ isError = true
+ }
+
+ return (
+
+
+
+
+ }
+ />
+ {/* 헤더의 높이만큼 공간 확보 */}
+
+
+
+ {/* 불참사유서 제출 기록 */}
+
+ {isError ? (
+ 데이터를 불러올 수 없습니다.
+ ) : reasonForAbsenceList && reasonForAbsenceList.length > 0 ? (
+
+ {reasonForAbsenceList.map((reasonForAbsence, index) => (
+
+ ))}
+
+ ) : (
+ 제출된 불참 사유서가 없습니다.
+ )}
+
+
+ {/* bottom button */}
+
+
+ )
+}
diff --git a/src/app/(member)/reason-for-absence/submit/layout.tsx b/src/app/(member)/reason-for-absence/submit/layout.tsx
new file mode 100644
index 0000000..de648d1
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/submit/layout.tsx
@@ -0,0 +1,5 @@
+import { ReactNode } from 'react'
+
+export default function ReasonForAbsenceSubmitLayout({ children }: { children: ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/reason-for-absence/submit/page.tsx b/src/app/(member)/reason-for-absence/submit/page.tsx
new file mode 100644
index 0000000..4e53c7f
--- /dev/null
+++ b/src/app/(member)/reason-for-absence/submit/page.tsx
@@ -0,0 +1,65 @@
+import { Suspense } from 'react'
+
+import SessionField from '@/components/member/reason-for-absence/SessionField'
+import AttendanceTypeSelector from '@/components/member/reason-for-absence/AttendanceTypeSelector'
+import ReasonField from '@/components/member/reason-for-absence/ReasonField'
+import ProofDocumentUpload from '@/components/member/reason-for-absence/ProofDocumentUpload'
+import FinalCheckField from '@/components/member/reason-for-absence/FinalCheckField'
+import SubmissionComplete from '@/components/member/reason-for-absence/SubmissionComplete'
+import MemberHeader from '@/components/member/common/MemberHeader'
+import AbsenceHeader from '@/components/member/reason-for-absence/AbsenceHeader'
+
+import { getSessionAbsenceServer } from '@/lib/member/session'
+
+import { AbsenceSessionDataType } from '@/types/member/session'
+import { SearchParams } from '@/types/common'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6'
+
+/**
+ * 'step' 에 따라 올바른 컴포넌트를 반환하는 스위처 컴포넌트
+ * (코드를 깔끔하게 관리하기 위해 분리)
+ */
+function ReasonForAbsenceSubmitStepSwitcher({
+ step,
+ sessionList,
+}: {
+ step: StepType
+ sessionList: AbsenceSessionDataType[] | undefined
+}) {
+ if (step === '1') return
+ if (step === '2') return
+ if (step === '3') return
+ if (step === '4') return
+ if (step === '5') return
+ if (step === '6') return
+
+ // 'step' 값이 유효하지 않을 경우 기본값으로 1단계 표시
+ return
+}
+
+export default async function ReasonForAbsenceSubmitPage({ searchParams }: { searchParams: SearchParams }) {
+ const params = await searchParams
+ const step = (params.step as StepType) || '1' // 기본값
+ const sessionDataResponse = await getSessionAbsenceServer()
+
+ console.log('sessionDataResponse', sessionDataResponse)
+
+ return (
+
+ {/* 2. 'step'에 의존하는 부분을 Suspense로 감싸줌. */}
+ {/* fallback에는 로딩 중에 보여줄 UI (스피너, 스켈레톤 등)를 넣음. */}
+ Loading...}>
+ {step === '6' ? null : (
+ <>
+
+ {/* 헤더의 높이만큼 공간 확보 */}
+
+ >
+ )}
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/session/[id]/page.tsx b/src/app/(member)/session/[id]/page.tsx
new file mode 100644
index 0000000..0393cbb
--- /dev/null
+++ b/src/app/(member)/session/[id]/page.tsx
@@ -0,0 +1,61 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import { getSessionNoticeDetail } from '@/lib/member/server/session'
+import { formatDateTime, formatTimeToHHMM, formatToKoreanDate } from '@/utils/common'
+import SessionContent from '@/components/member/session/SessionContent'
+import ImageContainer from '@/components/member/session/ImageContainer'
+
+interface Props {
+ params: Promise<{
+ id: string
+ }>
+}
+
+export default async function SessionDetailPage({ params }: Props) {
+ const { id } = await params
+ const response = await getSessionNoticeDetail(id)
+ const sessionData = response.data
+
+ return (
+
+
+ {/* 헤더 */}
+
+
+ {/* 헤더 높이 공간 */}
+
+
+ {/* 콘텐츠 */}
+
+ {/* 제목 & 날짜 */}
+
+ {sessionData?.title}
+
+ {sessionData?.updatedAt ? formatDateTime(sessionData.updatedAt) : formatDateTime(sessionData?.createdAt)}
+
+
+
+ {/* 장소 & 일시 */}
+
+
+
장소
+
{sessionData?.place}
+
+
+
일시
+
+ {formatToKoreanDate(sessionData?.startDate)} {formatTimeToHHMM(sessionData?.startTime)} -{' '}
+ {formatTimeToHHMM(sessionData?.endTime)}
+
+
+
+
+ {/* 본문 내용 */}
+
+
+ {/* 이미지 */}
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/session/page.tsx b/src/app/(member)/session/page.tsx
new file mode 100644
index 0000000..90c61ae
--- /dev/null
+++ b/src/app/(member)/session/page.tsx
@@ -0,0 +1,18 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import SessionList from '@/components/member/session/SessionList'
+import { getSession } from '@/lib/member/server/session'
+export const dynamic = 'force-dynamic' // 👈 이 한 줄 추가
+export default async function SessionDetailPage() {
+ const sessionResponseResult = await getSession()
+ const sessionList = sessionResponseResult.data
+
+ return (
+
+ )
+}
diff --git a/src/app/(member)/setting/layout.tsx b/src/app/(member)/setting/layout.tsx
new file mode 100644
index 0000000..412e140
--- /dev/null
+++ b/src/app/(member)/setting/layout.tsx
@@ -0,0 +1,5 @@
+// 👈 이 한 줄 추가 - 전체 앱을 동적으로 렌더링
+export const dynamic = 'force-dynamic'
+export default function SettingLayout({ children }: { children: React.ReactNode }) {
+ return {children}
+}
diff --git a/src/app/(member)/setting/page.tsx b/src/app/(member)/setting/page.tsx
new file mode 100644
index 0000000..a1841ba
--- /dev/null
+++ b/src/app/(member)/setting/page.tsx
@@ -0,0 +1,29 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import EtcContainer from '@/components/member/setting/EtcContainer'
+import AccountSettingContainer from '@/components/member/setting/AccountSettingContainer'
+import TermsOfServiceContainer from '@/components/member/setting/TermsOfServiceContainer'
+import ProfileContainer from '@/components/member/setting/ProfileContainer'
+import { getProfileSummary } from '@/lib/member/user'
+import FeedbackBanner from '@/components/member/setting/FeedbackBanner'
+
+export default async function SettingPage() {
+ const result = await getProfileSummary()
+ const userData = result.data
+ const FEEDBACK_URL = 'http://pf.kakao.com/_uxfHxkn/chat'
+
+ return (
+
+
+
+ )
+}
diff --git a/src/app/(member)/setting/people/page.tsx b/src/app/(member)/setting/people/page.tsx
new file mode 100644
index 0000000..99b317b
--- /dev/null
+++ b/src/app/(member)/setting/people/page.tsx
@@ -0,0 +1,108 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+import Image from 'next/image'
+
+export default function People() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
한인우 / lnwoo
+
Plan / PM
+
PM,이 팀 전원을 소유한 자
+
+
+
+
+
+
+
+
이현진 / Hyunjin
+
Plan
+
빤히...
+
+
+
+
+
+
+
+
+
+
+
강주언 / Jueon
+
Design
+
별일 없이 산다
+
+
+
+
+
+
+
+
박소정 / Sojeong
+
Design
+
디자이너 (였던 것)
+
+
+
+
+
+
+
+
+
+
+
황유림 / yulim
+
Frontend
+
일에 미친자
+
+
+
+
+
+
+
+
진채정 / Chaejeong
+
Frontend
+
실질적 막내..그냥 귀여워
+
+
+
+
+
+
+
+
+
+
+
김민지 / Minji
+
Backend
+
그냥 백엔드 개발자
+
+
+
+
+
+
+
+
김영록 / Yeongrok
+
Backend
+
+ Genius 하고 Fancy 한{' '}
+
+ 백엔드 개발자 김영록입니다.
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/setting/privacy-policy/page.tsx b/src/app/(member)/setting/privacy-policy/page.tsx
new file mode 100644
index 0000000..adaafc8
--- /dev/null
+++ b/src/app/(member)/setting/privacy-policy/page.tsx
@@ -0,0 +1,349 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+
+export default function PrivacyPolicy() {
+ return (
+
+
+
+
+
+
+ 큐시즘 앱(큐첵) 개인정보처리방침
+
+ 시행일자: 2025.10.30
+ 한국대학생IT경영학회 KUSITMS(이하 “동아리”, “큐시즘”)는 「개인정보 보호법」 등 관련 법령과 큐시즘
+ 정관(특히 “회원과 관련된 모든 정보를 동의 없이 유출하지 않는다”는 원칙)을 준수하며, 회원의 개인정보를
+ 안전하게 보호하기 위하여 다음과 같이 개인정보처리방침을 수립·공개합니다. 이 방침은 큐시즘이 운영하는
+ 모바일 애플리케이션 “큐시즘 앱(큐첵)” 및 이와 연동되는 관리자/운영 페이지에 공통 적용됩니다.
+
+
+
+
+ 제1조(처리하는 개인정보의 항목)
+
+ 동아리는 아래의 개인정보를 처리할 수 있습니다
+
+
+ 필수 수집 항목
+
+
+ 소셜로그인 식별값(카카오/애플에서 제공하는 고유 ID 또는 토큰)
+
+ 이름
+ 학교, 학과(전공)
+ 휴대전화번호
+
+ 계정 권한 정보(학회원 / 운영진 [경영총괄팀(이하 경총) / 교육기획팀 / 대외홍보팀 / 학부학])
+
+
+ 출석·상벌점 이력(세션명, 출결 상태, 부여 일시, 부여 사유)
+
+ 가입 승인 여부 및 승인 일시
+ 프로필 이미지
+
+
+ 선택 수집 항목
+
+
+
+ {' '}
+ 서비스 이용 과정에서 자동으로 생성·수집될 수 있는 정보
+
+
+ 앱 이용 일시 및 접속 로그
+ 공지/세션 알림 수신 여부, 공지 열람 여부
+ 기기 정보(기기식별자, OS 버전, 앱 버전 등)
+ QR 출석 시점, 출석 대상 세션 식별 정보
+
+
+ 증빙 제출 시 수집될 수 있는 정보
+
+ 불참·지각 사유서에 포함된 세션명, 일시, 사유
+ 증빙 파일
+
+
+ ※ 동아리는 원칙적으로 민감정보(건강, 정치성향, 범죄경력 등)를 요구하지 않습니다. 다만 회원이 불참사유서에
+ 스스로 기재하여 제출하는 경우에는 해당 사유 확인 목적으로만 열람합니다.
+
+
+
+
+ 제2조(개인정보의 수집 방법)
+
+ 동아리는 다음의 방법으로 개인정보를 수집합니다.
+
+
+
+ 회원이 앱의 회원가입/로그인/프로필 화면에 직접 입력하는 경우
+
+ 카카오·애플 소셜로그인 연동을 통해 제공되는 정보
+ 세션 출석(QR) 이용 시 자동 수집
+
+ 큐픽·큐포터즈·TF 활동 인증자료, 불참사유서, 증빙 서류를 회원이 앱에 업로드하는 경우
+
+
+ 서비스 이용 과정에서 생성되는 로그, 접속기록, 알림수신 기록 등 자동수집장치에 의한 수집
+
+
+ 경총이 관리 목적(출석·상벌점 부여, TF 인원 등록)으로 관리자 화면에 직접 입력하는 경우
+
+
+
+
+
+
+ 제3조(개인정보의 처리 목적)
+
+ 동아리는 아래의 목적을 위하여 개인정보를 처리하며, 목적이 변경되는 경우에는 앱 공지를 통해 사전
+ 안내합니다.
+
+
+ 회원 식별 및 가입 승인
+
+ 큐시즘 학회원 여부 확인
+ 중복 가입 및 중도 탈퇴 후 재가입 제한 여부 확인
+
+
+ 출석 및 상벌점 관리
+
+ 세션별 출결 확인
+
+ 사유 있는 결석과 무단결석 구분(정관 제3장 제7조 기준)
+
+ 지각·조퇴에 따른 벌점 부여
+
+ 상점 부여(큐포터즈, TF, 활동수기, 명절·연휴 세션 참석 등) 및 누적 벌점 감면
+
+
+
+ 활동·인증자료 관리
+
+ 큐픽, 큐포터즈, TF 등 동아리 내 활동 증빙
+ 활동량에 따른 상점 부여, 기록 보존
+
+
+ 세션·공지 제공 및 알림 발송
+
+ 세션 일정, 장소, 세션 정보 안내
+ 공지 미열람자 알림, 벌점 부여 안내
+ 앱 주요 기능 변경 사전 안내
+
+
+ 서비스 품질 개선 및 통계
+
+ 부정 이용(대리 출석, 허위 인증) 모니터링
+
+
+
+
+
+
+ 제4조(개인정보의 보유 및 이용기간)
+
+
+ 기본 원칙
+
+ 개인정보는 처리 목적이 달성되면 파기합니다.
+
+
+ 기수 활동 정보(출석·상벌점·증빙자료)
+
+ 보관 기간: 해당 기수 활동 종료 후 최대 2년
+
+ 보관 사유: 수료 여부 확인, 상벌점 이의 제기 처리, 차기 모집 시 재가입 제한 확인
+
+
+
+ 분쟁·민원 처리 자료
+
+
+ 회원탈퇴 시
+
+
+ 앱 이용을 위해 저장된 프로필, 알림 기록 등은 삭제되나, 동아리 운영상 반드시 남겨야 하는 최소
+ 정보(해당 기수 활동 여부, 상점 부여 사실, 징계·제한 이력, 블랙리스트 여부)는 별도 분리 보관할 수
+ 있습니다.
+
+
+
+
+
+
+
+ 제5조(개인정보의 제3자 제공)
+
+
+ 동아리는 원칙적으로 회원의 개인정보를 외부에 제공하지 않습니다
+ 다만 다음의 경우에는 예외로 합니다.
+
+
+ 회원이 사전에 명시적으로 동의한 경우
+
+ 법령에 근거가 있거나 수사기관이 적법한 절차에 따라 요청한 경우
+
+
+ 동아리 운영을 위해 불가피하게 상위 기관(학교, 연합동아리 협력조직, 지도교수 등)에 최소한의 정보
+ 제출이 필요한 경우
+
+
+ 전시회·공모전·대회 등 회원이 직접 신청한 외부 활동에 참가하기 위해 명단을 제출해야 하는 경우
+
+
+ 위 경우에도 동아리는 목적 달성을 위한 최소한의 항목만을 제공합니다.
+
+
+
+
+
+ 제6조(정보주체의 권리·의무 및 행사 방법)
+
+
+
+ {' '}
+ 회원은 언제든지 앱 내 설정에서 자신의 프로필 이미지를 조회·수정할 수 있습니다.
+
+
+ {' '}
+ 회원은 언제든지 현 기수 운영진에게 자신의 개인정보를 수정요청할 수 있습니다.
+
+
+ {' '}
+ 회원은 앱 내 회원탈퇴 기능 또는 운영진 연락을 통해 개인정보 삭제를 요청할 수 있습니다.
+
+
+ {' '}
+ 운영진/경총이 부여한 출석·상벌점 내역에 이의가 있는 경우, 이메일로 정정을 요청할 수 있습니다. 다만
+ 동아리 회칙·정관에서 정한 출석/벌점 기준에 해당하는 경우에는 수정이 제한될 수 있습니다.
+
+
+
+
+
+
+ 제7조(개인정보의 파기 절차 및 방법)
+
+
+ 파기 절차
+
+
+ 보유기간이 경과하거나 처리 목적이 달성된 개인정보는 별도 DB로 옮겨지거나 즉시 파기합니다.
+
+
+ 별도 DB로 옮겨진 정보는 법령 또는 정관상 보존 목적 이외에는 사용하지 않습니다.
+
+
+
+ 파기 방법
+
+
+ 전자적 파일: 복구·재생이 불가능한 기술적 방법으로 영구 삭제
+
+
+
+
+
+
+
+ 제8조(개인정보의 안전성 확보 조치)
+
+
동아리는 개인정보의 안전한 처리를 위하여 다음과 같은 조치를 실시합니다.
+
+ 인증수단 보호: 비밀번호, 토큰, 소셜로그인 정보는 안전한 방식으로 저장
+ 수정기록 보관: 경총이 출석/벌점 정보를 열람·수정한 경우 그 내역을 기록
+ 암호화 통신: 개인정보 전송 시 HTTPS 등 암호화 프로토콜 적용
+ 백업 및 복구: 장애 발생에 대비한 주기적 백업
+
+
+
+
+
+ 제9조(카카오/애플 외부 로그인 서비스와의 관계)
+
+
동아리는 개인정보의 안전한 처리를 위하여 다음과 같은 조치를 실시합니다.
+
+
+ 회원이 카카오, 애플 로그인을 사용하는 경우, 해당 플랫폼이 직접 수집하는 정보는 각 플랫폼의
+ 개인정보처리방침이 적용되며, 동아리는 그 수집범위를 통제하지 않습니다.
+
+
+ 동아리는 외부로그인을 통해 제공되는 최소한의 정보(식별자, 이름, 이메일 등)만 회원 식별 및 서비스
+ 가입/승인 목적으로 이용합니다.
+
+
+ 회원이 소셜계정을 삭제하거나 연결을 해제하는 경우, 앱 일부 기능 이용이 제한될 수 있습니다.
+
+
+
+
+
+
+ 제10조(개인정보 자동수집 장치의 설치·운영 및 거부)
+
+
+
+ 동아리는 공지 미열람 안내, 세션 리마인드, 앱 사용성 개선을 위해 단말기 식별값, 푸시 토큰 등을 자동으로
+ 수집할 수 있습니다.
+
+
+ 회원은 단말기 설정에서 알림 수신을 거부할 수 있으나, 이 경우 일부 서비스(중요 공지, 출석 리마인드)
+ 이용이 제한될 수 있습니다.
+
+
+
+
+
+
+ 제11조(개인정보 보호책임자)
+
+
+ 동아리는 개인정보 관련 업무를 총괄하여 책임지고, 개인정보 침해사고 및 민원 처리를 위하여 아래와 같이
+ 개인정보 보호책임자를 지정합니다.
+
+
+
+ 개인정보 보호책임자: 한인우
+ 직책: 큐첵 PM
+ 이메일: haninwoo0628@naver.com
+ 연락처: 010-7384-8420
+
+
※ 직책이 변경되는 경우, 개인정보 보호책임자를 지정하고 앱 공지를 통해 알립니다.
+
+
+
+
+ 제12조(권익침해 구제방법)
+
+
회원은 아래 기관을 통해 개인정보 침해에 대한 상담 및 피해구제를 요청할 수 있습니다.
+
+
+ 개인정보침해신고센터 (국번없이 118)
+ 개인정보분쟁조정위원회 (1833-6972)
+ 대검찰청 사이버수사과
+ 경찰청 사이버범죄수사단
+
+
+
+
+
+ 제13조(개인정보처리방침의 변경)
+
+
+
+ 이 개인정보처리방침은 법령, 서비스, 정관 변경에 따라 수정될 수 있습니다.
+
+
+ 중요한 내용이 변경되는 경우, 서비스 내 공지사항 또는 팝업을 통해 최소 7일 전 사전 고지합니다.
+
+ 변경된 방침은 앱에 게시된 날로부터 효력을 가집니다.
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/setting/service-term/page.tsx b/src/app/(member)/setting/service-term/page.tsx
new file mode 100644
index 0000000..4be1352
--- /dev/null
+++ b/src/app/(member)/setting/service-term/page.tsx
@@ -0,0 +1,432 @@
+import MemberHeader from '@/components/member/common/MemberHeader'
+
+export default function PrivacyPolicy() {
+ return (
+
+
+
+
+
+
+ 큐시즘 앱(큐첵) 서비스 이용약관
+
+ 시행일자: 2025.10.30
+ 본 약관은 큐시즘 동아리(이하 “동아리”)가 활동 관리를 위해 사용하는 모바일 애플리케이션 “큐첵”을
+ 큐피드 팀(이하 “운영팀”)이 개발·운영함에 따라, 서비스를 실제로 사용하는 큐시즘 소속 학회원 및
+ 운영진·경영총괄(이하 통칭 “회원”)과 운영팀, 그리고 활동 기준을 정하는 동아리 사이의 권리·의무 및 이용
+ 절차를 규정하는 것을 목적으로 한다.
+
+
+
+
+ 제1조(목적)
+
+ 이 약관은 운영팀이 제공하는 “큐첵” 서비스를 회원이 이용함에 있어, 서비스 이용조건과 절차, 운영팀과 회원의
+ 권리·의무, 그리고 동아리가 정한 출석·상벌점 규정을 앱에 반영하는 방식 등 기타 필요한 사항을 정함을
+ 목적으로 한다.
+
+
+
+
+ 제2조(약관의 효력 및 변경)
+
+
+
+ 본 약관은 서비스 화면에 게시하거나 기타 방법으로 회원에게 공지함으로써 효력이 발생한다.
+
+
+ 약관의 변경 권한은 운영팀에 있으며, 운영팀은 동아리의 운영방침 변경 요청을 반영하여 약관을 수정할 수
+ 있다.
+
+
+ 변경 내용은 서비스 내 공지사항에 게시하며, 필요한 경우 동아리에도 통지할 수 있다.
+
+
+ 회원은 변경된 약관에 동의하지 않을 경우 탈퇴(이용계약 해지)를 할 수 있으며, 변경 이후에도 서비스를
+ 계속 이용하는 경우 변경된 약관에 동의한 것으로 본다.
+
+
+
+
+
+
+ 제3조(이용계약의 성립)
+
+
+
+ 회원이 카카오 또는 애플 소셜로그인으로 로그인하고 본 약관에 동의한 때에 이용계약이 성립한다.
+
+
+ 서비스는 큐시즘 소속자를 전제로 하므로, 학회원 여부를 확인하는 가입 승인 절차를 둔다. 이 승인 자체는
+ 원칙적으로 동아리/경총의 권한이고, 운영팀은 승인 기능을 기술적으로 제공하는 역할을 한다.
+
+
+ 허위정보 기재, 타인의 명의 도용, 큐시즘 비소속자, 가입 목적이 불분명한 경우 동아리는 승인을 보류하거나
+ 거부할 수 있다.
+
+
+ 운영팀은 서비스 안전을 위해 특정 계정의 이용을 제한할 수 있으나, 회원 자격 자체의 박탈 여부는 동아리
+ 규정을 따른다.
+
+
+
+
+
+
+ 제4조(계정 및 로그인)
+
+
+
+ 서비스는 카카오 또는 애플 계정을 통한 소셜로그인만을 지원하며, 지원 범위는 운영팀의 정책 및 해당
+ 플랫폼의 제공 범위에 따라 달라질 수 있다.
+
+
+ 회원은 자신의 계정 정보를 선량한 관리자의 주의 의무로 관리해야 하며, 제3자에게 대여·양도할 수 없다.
+
+
+ 계정 도용, 분실, 무단 로그인 등이 발생한 경우 회원은 즉시 운영팀 또는 동아리에 알려야 하고, 운영팀은
+ 필요 시 계정 이용을 일시 제한할 수 있다.
+
+
+
+
+
+
+ 제5조(권한 및 역할)
+
+
+ 서비스는 다음과 같은 기본 권한 체계를 둘 수 있다.
+
+
+ 학회원: 상벌점 조회, 세션 정보 열람, 공지 확인, 불참사유서 제출, 큐픽 인증자료 제출, 알림 수신, 세션
+ 출석체크
+
+
+ 운영진(경총/학부학): 상벌점 조정, 회원가입 승인/거부, 공지 미조회자 조회 및 일괄 알림
+
+
+ 운영팀(큐피드): 장애 복구, 데이터 정합성 점검, 계정 잠금 해제 등 기술적 최고 권한만을 가지며,
+ 점수·출석의 실제 내용 결정에는 관여하지 않는다.
+
+
+
+ 권한의 구체적인 범위와 메뉴 노출은 동아리의 요청과 운영팀의 기술적 정책에 따라 변경될 수 있다.
+
+ 회원은 부여받지 않은 권한을 임의로 사용하거나 우회해서는 안 된다.
+
+
+
+
+
+ 제6조(정보주체의 권리·의무 및 행사 방법)
+
+
서비스는 동아리의 활동을 전산화하기 위해 다음 각 호의 기능을 포함할 수 있다.
+
+ 출석 및 상벌점 관리
+
+ 세션별 출석체크
+ 세션별·활동유형별 상점 벌점 내역 보기
+ 지각/조퇴/결석(사유서 제출/미제출) 코드에 따른 자동 점수화
+ 특정 시점 일괄 처리 내역 제공
+ 단, 점수 기준은 동아리가 정하고 운영팀은 이를 시스템에 반영 한다.
+
+
+ 불참사유서 신청
+
+
+ 세션 일시, 불참유형(불참/지각/조퇴), 지각·조퇴 시간, 사유, 증빙서류 업로드
+
+ 운영진의 승인 여부 표시
+
+
+ 큐픽/큐포터즈 활동 증빙
+
+ 인증샷 업로드
+ 승인 시 상점 자동 또는 수동 부여(부여 기준은 동아리 규정)
+
+
+ 세션 정보 확인
+
+ 세션명, 날짜·시간, 장소, 설명, 이미지 열람
+ 전체 세션 일정 달력/리스트 보기
+
+
+ 공지사항/세션 공지
+
+ 카테고리 구분, 마크다운 형식 지원
+ 공지 미조회자 확인 및 일괄 푸시알림
+ 예약 게시 기능
+
+
+ 알림
+
+ 회원 승인/ 공지 업로드/수정, 출결·상벌점 변동, 세션 전 리마인드
+
+
+ 광고/배너
+
+ 동아리 내 행사·프로젝트 홍보용 배너 노출
+ 학회원 광고형 배너 노출
+ 노출 여부·위치는 운영팀 정책과 동아리 요청을 함께 고려해 결정
+
+
+ 회원정보/권한 관리
+
+ 이름, 학교, 학과, 파트, 연락처 등 회원 기본정보 조회
+ 권한(학회원/운영진/경총) 부여 및 회수
+
+
+
+
+
+
+ 제7조(상벌점 부여 기준)
+
+
+
+ 앱에 표시되는 상벌점은 동아리가 정한 규정에 따라 부여·차감되며, 운영팀은 이를 기록·표시하는 도구일 뿐
+ 점수의 의미나 효력을 스스로 정하지 않는다.
+
+
+ 상벌점의 최종 효력과 해석은 동아리에 귀속되며, 앱 화면의 수치와 동아리 내부 최종 집계가 일시적으로
+ 다를 수 있다.
+
+
+
+
+
+
+ 제8조(QR 출석)
+
+
+
+ 서비스는 기기 카메라를 이용해 세션 출석을 확인할 수 있도록 운영팀이 기능을 제공한다.
+
+ 회원은 타인의 QR을 캡처·공유하여 대리출석을 하거나 조작해서는 안 된다.
+
+ 위반이 적발될 경우 제재의 수준과 방식은 동아리 규정을 따르며, 운영팀은 동아리의 요청에 따라 해당
+ 출석을 무효 처리할 수 있다.
+
+
+
+
+
+
+ 제9조(게시물의 관리)
+
+
+
+ 회원이 서비스에 업로드한 사진, 글, 인증샷, 불참사유서의 책임은 게시자 본인에게 있다.
+
+
+ 운영팀은 다음 각 호에 해당하는 경우 동아리의 요청 또는 명백한 위반 정황이 있는 경우에 한해 사전 통지
+ 없이 게시물을 숨김·삭제할 수 있다.
+
+
+ 타인의 개인정보가 무단 포함된 경우
+ 허위 사실, 비방, 모욕, 저작권 침해가 의심되는 경우
+ 동아리 목적과 명백히 무관한 광고/홍보성 내용인 경우
+ 서비스 운영을 심각하게 방해하는 경우
+
+
+
+
+
+
+ 제10조(저작권 등)
+
+
+
+ 서비스 화면, 디자인, 프로그램, 기본 배너, 공지 등의 저작권 및 지식재산권은 운영팀(큐피드) 또는 정당한
+ 권리자에게 있다.
+
+
+ 회원이 서비스에 업로드한 콘텐츠에 대해서는 운영팀과 동아리가 서비스 운영, 기록 보존, 활동 홍보를 위해
+ 무상으로 사용할 수 있는 이용권을 갖는다.
+
+
+ 회원은 운영팀 또는 동아리의 사전 허락 없이 앱 내 자료를 무단 복제, 배포, 2차 가공하여서는 안 된다.
+
+
+
+
+
+
+ 제11조(개인정보 보호)
+
+
+
+ 운영팀은 회원가입 승인, 출석 및 상벌점 관리, 공지 발송, 세션 안내, 권한 부여 등 동아리가 실제로 학회를
+ 운영하는 데 필요한 최소한의 개인정보를 수집·이용한다.
+
+
+ 운영팀이 수집한 개인정보는 동아리(큐시즘)에게 제공·열람될 수 있으며, 이는 학회 운영·출석 확인·상벌점
+ 부여·활동 증빙 확인 목적에 한정된다.
+
+
+ 개인정보의 수집·이용, 보관, 파기는 별도의 개인정보처리방침에서 정하며, 회원은 이를 열람할 수 있다.
+
+
+ 운영팀과 동아리는 회원의 동의 없이 목적 외로 개인정보를 이용하거나 제3자에게 제공하지 않는다. 다만
+ 법령에 근거한 경우는 예외로 한다.
+
+
+
+
+
+
+ 제12조(알림)
+
+
+
+ 서비스는 공지 미조회자, 출결 변동, 세션 전 리마인드 등 운영상 필요한 알림을 앱 푸시로 보낼 수 있다.
+
+
+ 알림의 종류·시점은 동아리의 요청과 운영팀의 기술적 정책에 따라 달라질 수 있다.
+
+
+ 회원이 알림을 차단하는 경우 일부 공지나 출결 변동을 제때 확인하지 못할 수 있으며, 이로 인한 불이익은
+ 회원에게 귀속된다.
+
+
+
+
+
+
+ 제13조(서비스의 변경 및 중단)
+
+
+
+ 운영팀은 운영상·기술상의 필요에 따라 서비스의 전부 또는 일부를 수정·변경할 수 있다.
+
+
+ 서버 점검, 보안 점검, 스토어 정책 변경, 기타 불가피한 사유가 있는 경우 서비스 제공을 일시 중단할 수
+ 있으며, 가능한 경우 사전에 공지한다.
+
+
+ 운영팀이 무상으로 제공하는 서비스의 중단·변경에 대해서는 별도의 보상을 하지 않는다.
+
+
+
+
+
+
+ 제14조(회원 탈퇴)
+
+
+
+ 회원은 앱 내 “회원탈퇴” 메뉴를 통해 언제든지 이용계약을 해지할 수 있다.
+
+
+ 탈퇴 시 개인의 출석 기록, 상벌점 이력, 제출된 불참사유서, 큐픽/큐포터즈 인증자료 등 서비스 내 활동
+ 이력은 복구가 불가능할 수 있다.
+
+
+
+ 다만 동아리가 학기·기수 정산, 상벌점 이의신청 처리 등을 위해 보관해야 하는 최소 기록은 동아리 측에
+ 별도로 남을 수 있다. 이 보관은 동아리 규정과 개인정보처리방침을 따른다.
+
+
+ 탈퇴 후에는 동일 계정으로 과거 이력을 그대로 이어서 조회할 수 없다.
+
+
+
+
+
+ 제15조(운영진의 의무)
+
+
+ 운영진은 회원의 출석 및 상벌점 정보를 임의로 조작하지 않아야 한다.
+
+ 운영진은 자신에게 부여된 권한 범위 내에서만 정보를 열람·처리해야 하며, 개인적 목적으로 저장·배포해서는
+ 안 된다.
+
+
+ 권한 오남용이 확인될 경우 동아리는 해당 계정의 권한을 회수하거나 서비스 이용을 제한하도록 운영팀에
+ 요청할 수 있고, 운영팀은 이를 기술적으로 조치한다.
+
+
+
+
+
+
+ 제16조(회원의 의무)
+
+
+
+ 회원은 본 약관 및 서비스 내 안내사항, 그리고 동아리의 활동 규정을 준수해야 한다.
+
+ 회원은 다음 각 호의 행위를 해서는 안 된다.
+
+ 타인의 계정 도용, QR 대리 출석
+ 허위 정보 등록, 증빙자료 위·변조
+ 서비스의 정상적 운영을 방해하는 행위
+ 동아리 또는 운영팀의 명예를 훼손하는 행위
+
+
+ 위 금지행위를 한 경우 동아리는 경고, 기능 제한, 점수 회수, 탈퇴 조치 등 동아리 규정에 따른 제재를 할
+ 수 있으며, 운영팀은 동아리의 요청에 따라 해당 계정의 서비스 이용을 제한할 수 있다.
+
+
+
+
+
+
+ 제17조(면책)
+
+
+
+ 운영팀은 천재지변, 시스템 장애, 통신사 사정 등 불가항력적인 사유로 서비스를 제공할 수 없는 경우 그에
+ 대한 책임을 지지 않는다.
+
+
+ 서비스에 표시되는 출석/상벌점이 실제 동아리 최종 집계와 일시적으로 다를 수 있으며, 최종 효력은 동아리
+ 내부 규정과 경총의 최종 확인값에 따른다. 운영팀은 이 불일치에 대해 손해배상 책임을 지지 않는다.
+
+
+ 운영팀은 회원 간 또는 회원과 제3자 간에 발생한 분쟁에 직접 개입하지 않을 수 있으며, 이로 인한 손해에
+ 대해 책임을 지지 않을 수 있다.
+
+
+
+
+
+
+ 제18조(손해배상)
+
+
+
+ 회원이 본 약관을 위반하여 운영팀 또는 동아리에 손해를 입힌 경우 회원은 그 손해를 배상해야 한다.
+
+
+ 운영팀이 회원에게 서비스를 무상으로 제공하는 한, 서비스 자체의 단순 오류·지연으로 인한 손해에 대해
+ 별도의 손해배상은 하지 않는다.
+
+
+ 다만 동아리가 운영팀과 별도 계약을 통해 유상 기능을 이용하는 경우에는 그 계약에서 정한 바를 따른다.
+
+
+
+
+
+
+ 제19조(준거법 및 관할)
+
+
+ 본 약관은 대한민국 법령을 따른다.
+
+ 서비스 이용과 관련하여 운영팀(큐피드 팀)과 회원 사이에 분쟁이 발생한 경우 운영팀의 소재지를 관할하는
+ 법원을 제1심 관할법원으로 한다.
+
+
+ 동아리의 활동규정 해석과 관련된 이의제기는 우선 동아리내부 절차를 따르며, 서비스 화면과 동아리 내부
+ 규정이 충돌할 경우 동아리 규정이 우선한다.
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(member)/setting/withdraw/page.tsx b/src/app/(member)/setting/withdraw/page.tsx
new file mode 100644
index 0000000..d1cb69e
--- /dev/null
+++ b/src/app/(member)/setting/withdraw/page.tsx
@@ -0,0 +1,64 @@
+'use client'
+
+import { useState } from 'react'
+import { useRouter } from 'next/navigation'
+
+import MemberHeader from '@/components/member/common/MemberHeader'
+import WithDrawModal from '@/components/member/modal/WithDrawModal'
+
+import { handleWithDrawAction } from '@/lib/member/actions/auth'
+
+export default function WithDrawPage() {
+ const [isWithDrawModalOpen, setIsWithDrawModalOpen] = useState(false)
+ const router = useRouter()
+
+ const onWithdrawClick = async () => {
+ try {
+ await handleWithDrawAction()
+ setIsWithDrawModalOpen(false)
+ } catch (error) {
+ console.error('탈퇴 중 오류:', error)
+ }
+ }
+
+ return (
+
+ {isWithDrawModalOpen && (
+
+ )}
+
+
+
+ 탈퇴 전 꼭 확인해 주세요
+
+
+ 탈퇴 시 앱 내 활동 기록 및 저장된 정보가 삭제되며, 동일 계정으로 재가입 시 일부 데이터는 복구되지 않을 수
+ 있어요
+
+ 학회 정관에 따라 필요한 정보는 일정 기간 보관 후 파기돼요
+
+ 탈퇴가 원활하지 않거나 별도 확인이 필요한 경우, 운영진(학회 이메일)으로 문의해 주세요
+
+
+
+
+ {
+ router.back()
+ }}
+ className="body-lg-semibold h-[48px] w-full rounded-[14px] bg-gray-100 text-gray-600"
+ >
+ 취소
+
+ {
+ setIsWithDrawModalOpen(true)
+ }}
+ className="bg-sub-red body-lg-semibold h-[48px] w-full rounded-[14px] text-white"
+ >
+ 탈퇴하기
+
+
+
+ )
+}
diff --git a/src/app/api/absence/manage/[sessionId]/route.ts b/src/app/api/absence/manage/[sessionId]/route.ts
new file mode 100644
index 0000000..a85092b
--- /dev/null
+++ b/src/app/api/absence/manage/[sessionId]/route.ts
@@ -0,0 +1,27 @@
+import { apiCallServer } from '@/lib/api.server'
+import { AbsenceReportItem } from '@/types/manager/attendance/type'
+
+export async function GET({ params }: { params: { sessionId: string } }) {
+ try {
+ const { sessionId } = params
+
+ if (!sessionId) {
+ return Response.json({ error: 'Session ID is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/absence/manage/${sessionId}`, {
+ method: 'GET',
+ })
+
+ if (error) {
+ console.error('❌ API Route - Backend error:', error)
+ return Response.json({ error }, { status: 400 })
+ }
+
+ console.log('✅ API Route - Successfully fetched data:', data)
+ return Response.json(data)
+ } catch (error) {
+ console.error('❌ API Route - Internal error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/absence/manage/route.ts b/src/app/api/absence/manage/route.ts
new file mode 100644
index 0000000..52d8de4
--- /dev/null
+++ b/src/app/api/absence/manage/route.ts
@@ -0,0 +1,68 @@
+import { apiCallServer } from '@/lib/api.server'
+import { AbsencePenaltyRequest } from '@/types/manager/attendance/type'
+
+export async function GET(request: Request) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const sessionId = searchParams.get('sessionId')
+
+ if (!sessionId) {
+ return Response.json({ error: 'Session ID is required as query parameter' }, { status: 400 })
+ }
+
+ console.log('🔍 API Route (manage) - Fetching absence data for sessionId:', sessionId)
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(`/v1/absence/manage/${sessionId}`, {
+ method: 'GET',
+ })
+
+ if (error) {
+ console.error('❌ API Route (manage) - Backend error:', error)
+ return Response.json({ error }, { status: 400 })
+ }
+
+ console.log('✅ API Route (manage) - Successfully fetched data:', data)
+ return Response.json(data)
+ } catch (error) {
+ console.error('❌ API Route (manage) - Internal error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+// 불참사유서 벌점 매기기
+export async function PATCH(request: Request) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const absenceReportId = searchParams.get('absenceReportId')
+
+ if (!absenceReportId) {
+ return Response.json({ error: 'Absence Report ID is required as query parameter' }, { status: 400 })
+ }
+
+ const body: AbsencePenaltyRequest = await request.json()
+
+ if (!body.approvedType) {
+ return Response.json({ error: 'Approved type is required' }, { status: 400 })
+ }
+
+ console.log('🔍 API Route - Setting penalty for absenceReportId:', absenceReportId, 'type:', body.approvedType)
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(`/v1/absence/manage/${absenceReportId}`, {
+ method: 'PATCH',
+ body: JSON.stringify(body),
+ })
+
+ if (error) {
+ console.error('❌ API Route - Backend error:', error)
+ return Response.json({ error }, { status: 400 })
+ }
+
+ console.log('✅ API Route - Successfully set penalty:', data)
+ return Response.json(data)
+ } catch (error) {
+ console.error('❌ API Route - Internal error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/absence/route.ts b/src/app/api/absence/route.ts
new file mode 100644
index 0000000..26a741f
--- /dev/null
+++ b/src/app/api/absence/route.ts
@@ -0,0 +1,32 @@
+/**
+ * POST /api/absence
+ *
+ * 클라이언트에서 호출하는 API 라우트
+ * 서버에서 백엔드 API를 호출
+ */
+import { apiCallServer } from '@/lib/api.server'
+import { AbsenceDataType } from '@/types/member/absence'
+
+export async function POST(request: Request) {
+ try {
+ const absenceData: AbsenceDataType = await request.json()
+
+ if (!absenceData) {
+ return Response.json({ error: 'Sign up data is required' }, { status: 400 })
+ }
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer('/v1/absence', {
+ method: 'POST',
+ body: JSON.stringify(absenceData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/attendance/availability/route.ts b/src/app/api/attendance/availability/route.ts
new file mode 100644
index 0000000..ee4e13e
--- /dev/null
+++ b/src/app/api/attendance/availability/route.ts
@@ -0,0 +1,18 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET() {
+ try {
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer('/v1/attendance/availability', {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/attendance/manage/scan/route.ts b/src/app/api/attendance/manage/scan/route.ts
new file mode 100644
index 0000000..157dc43
--- /dev/null
+++ b/src/app/api/attendance/manage/scan/route.ts
@@ -0,0 +1,23 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST(request: Request) {
+ try {
+ const body = await request.json()
+ const { token } = body
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer('/v1/attendance/manage/scan', {
+ method: 'POST',
+ body: JSON.stringify({ token }),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/attendance/manage/weekly-summary/route.ts b/src/app/api/attendance/manage/weekly-summary/route.ts
new file mode 100644
index 0000000..5087f33
--- /dev/null
+++ b/src/app/api/attendance/manage/weekly-summary/route.ts
@@ -0,0 +1,18 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET() {
+ try {
+ const { data, error } = await apiCallServer('/v1/attendance/manage/weekly-summary', {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/attendance/token/route.ts b/src/app/api/attendance/token/route.ts
new file mode 100644
index 0000000..be6c0f9
--- /dev/null
+++ b/src/app/api/attendance/token/route.ts
@@ -0,0 +1,18 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST() {
+ try {
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer('/v1/attendance/token', {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/auth/cookies/route.ts b/src/app/api/auth/cookies/route.ts
new file mode 100644
index 0000000..205f098
--- /dev/null
+++ b/src/app/api/auth/cookies/route.ts
@@ -0,0 +1,65 @@
+// app/api/auth/cookies/profile-image.ts
+import { cookies } from 'next/headers'
+import { NextRequest, NextResponse } from 'next/server'
+
+const cookieOptions = {
+ httpOnly: true,
+ secure: process.env.NODE_ENV === 'production',
+ sameSite: 'lax' as const,
+ path: '/',
+}
+
+/**
+ * POST /api/auth/cookies - 쿠키 설정
+ */
+export async function POST(request: NextRequest) {
+ try {
+ const body = await request.json()
+ const { accessToken, refreshToken, status, role } = body
+
+ const cookieStore = await cookies()
+
+ if (accessToken) {
+ cookieStore.set('accessToken', accessToken, cookieOptions)
+ }
+
+ if (refreshToken) {
+ cookieStore.set('refreshToken', refreshToken, {
+ ...cookieOptions,
+ maxAge: 60 * 60 * 24 * 7,
+ })
+ }
+
+ if (status) {
+ cookieStore.set('status', status, cookieOptions)
+ }
+
+ if (role) {
+ cookieStore.set('role', role, cookieOptions)
+ }
+
+ return NextResponse.json({ success: true })
+ } catch (error) {
+ console.error('Error setting cookies:', error)
+ return NextResponse.json({ success: false, error: String(error) }, { status: 500 })
+ }
+}
+
+/**
+ * DELETE /api/auth/cookies - 쿠키 삭제
+ */
+export async function DELETE() {
+ try {
+ const cookieStore = await cookies()
+
+ cookieStore.delete('accessToken')
+ cookieStore.delete('refreshToken')
+ cookieStore.delete('status')
+ cookieStore.delete('role')
+
+ return NextResponse.json({ success: true })
+ } catch (error) {
+ console.error('Error clearing cookies:', error)
+ return NextResponse.json({ success: false, error: String(error) }, { status: 500 })
+ }
+}
diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts
new file mode 100644
index 0000000..440f4dc
--- /dev/null
+++ b/src/app/api/auth/logout/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const refreshToken = url.searchParams.get('refreshToken')
+ console.log('refreshToken', refreshToken)
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/auth/logout?X-Refresh-Token=${refreshToken}`
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/auth/withdraw/route.ts b/src/app/api/auth/withdraw/route.ts
new file mode 100644
index 0000000..440f4dc
--- /dev/null
+++ b/src/app/api/auth/withdraw/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const refreshToken = url.searchParams.get('refreshToken')
+ console.log('refreshToken', refreshToken)
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/auth/logout?X-Refresh-Token=${refreshToken}`
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/kupick/application/route.ts b/src/app/api/kupick/application/route.ts
new file mode 100644
index 0000000..deef230
--- /dev/null
+++ b/src/app/api/kupick/application/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const fileName = url.searchParams.get('fileName')
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/kupick/application?fileName=${fileName}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/kupick/manage/approval/route.ts b/src/app/api/kupick/manage/approval/route.ts
new file mode 100644
index 0000000..c96dcc5
--- /dev/null
+++ b/src/app/api/kupick/manage/approval/route.ts
@@ -0,0 +1,28 @@
+import { apiCallServer } from '@/lib/api.server'
+import { NextRequest } from 'next/server'
+
+export async function POST(request: NextRequest) {
+ const kupickId = request.nextUrl.searchParams.get('kupickId')
+ const approvalString = request.nextUrl.searchParams.get('approval')
+
+ if (!kupickId || approvalString === null) {
+ return Response.json({ error: 'kupickId와 approval 파라미터가 필요합니다.' }, { status: 400 })
+ }
+
+ const approval = approvalString.toLowerCase() === 'true'
+ const backendUrl = `/v1/kupick/manage/approval?kupickId=${kupickId}&approval=${approval}`
+
+ try {
+ const { data, error } = await apiCallServer(backendUrl, {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error: error || error || 'API 호출 실패' }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/kupick/manage/update/route.ts b/src/app/api/kupick/manage/update/route.ts
new file mode 100644
index 0000000..de833ae
--- /dev/null
+++ b/src/app/api/kupick/manage/update/route.ts
@@ -0,0 +1,30 @@
+import { NextRequest, NextResponse } from 'next/server'
+import { apiFetchServer } from '@/lib/api.server'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const year = searchParams.get('year')
+ const month = searchParams.get('month')
+
+ if (!year || !month) {
+ return NextResponse.json({ error: 'Year and month parameters are required' }, { status: 400 })
+ }
+
+ const endpoint = `/v1/kupick/manage/update?year=${year}&month=${month}`
+ const response = await apiFetchServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (!response.ok) {
+ const errorData = await response.text()
+ return NextResponse.json({ error: errorData || `HTTP Error: ${response.status}` }, { status: response.status })
+ }
+
+ const data = await response.json()
+ return NextResponse.json(data.result || data)
+ } catch (error) {
+ console.error('Failed to fetch kupick records:', error)
+ return NextResponse.json({ error: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/kupick/my/route.ts b/src/app/api/kupick/my/route.ts
new file mode 100644
index 0000000..33b903e
--- /dev/null
+++ b/src/app/api/kupick/my/route.ts
@@ -0,0 +1,20 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET() {
+ try {
+ const endpoint = `/v1/kupick/my`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/kupick/view/route.ts b/src/app/api/kupick/view/route.ts
new file mode 100644
index 0000000..a39db9a
--- /dev/null
+++ b/src/app/api/kupick/view/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function POST(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const fileName = url.searchParams.get('fileName')
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/kupick/view?fileName=${fileName}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'POST',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/executive/roles/route.ts b/src/app/api/members/executive/roles/route.ts
new file mode 100644
index 0000000..a552a80
--- /dev/null
+++ b/src/app/api/members/executive/roles/route.ts
@@ -0,0 +1,21 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const staffData = await request.json()
+
+ const { data, error } = await apiCallServer(`/v1/members/executive/roles`, {
+ method: 'PATCH',
+ body: JSON.stringify(staffData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/members/executive/staff/route.ts b/src/app/api/members/executive/staff/route.ts
new file mode 100644
index 0000000..e0ba9ab
--- /dev/null
+++ b/src/app/api/members/executive/staff/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const staffData = await request.json()
+
+ if (!staffData) {
+ return Response.json({ error: 'Staff data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/members/executive/staff`, {
+ method: 'PATCH',
+ body: JSON.stringify(staffData)
+ })
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/members/onboarding/route.ts b/src/app/api/members/onboarding/route.ts
new file mode 100644
index 0000000..54743ec
--- /dev/null
+++ b/src/app/api/members/onboarding/route.ts
@@ -0,0 +1,32 @@
+/**
+ * POST /api/members/onboarding
+ *
+ * 클라이언트에서 호출하는 API 라우트
+ * 서버에서 백엔드 API를 호출
+ */
+import { apiCallServer } from '@/lib/api.server'
+import { SignUpDataType } from '@/types/sign-up'
+
+export async function POST(request: Request) {
+ try {
+ const signUpData: SignUpDataType = await request.json()
+
+ if (!signUpData) {
+ return Response.json({ error: 'Sign up data is required' }, { status: 400 })
+ }
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer('/v1/members/onboarding', {
+ method: 'POST',
+ body: JSON.stringify(signUpData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/profile/image/url/route.ts b/src/app/api/members/profile/image/url/route.ts
new file mode 100644
index 0000000..693b5ac
--- /dev/null
+++ b/src/app/api/members/profile/image/url/route.ts
@@ -0,0 +1,24 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const fileName = url.searchParams.get('fileName')
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/members/profile/image/url?fileName=${fileName}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/profile/summary/route.ts b/src/app/api/members/profile/summary/route.ts
new file mode 100644
index 0000000..3a26289
--- /dev/null
+++ b/src/app/api/members/profile/summary/route.ts
@@ -0,0 +1,20 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET() {
+ try {
+ const endpoint = `/v1/members/profile/summary`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/staff/[memberId]/profile/route.ts b/src/app/api/members/staff/[memberId]/profile/route.ts
new file mode 100644
index 0000000..4d8f735
--- /dev/null
+++ b/src/app/api/members/staff/[memberId]/profile/route.ts
@@ -0,0 +1,30 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request, { params }: { params: { memberId: string } }) {
+ try {
+ const profileData = await request.json()
+ const memberId = params.memberId
+
+ if (!memberId) {
+ return Response.json({ error: 'Member ID is required' }, { status: 400 })
+ }
+
+ if (!profileData) {
+ return Response.json({ error: 'Profile data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/members/staff/${memberId}/profile`, {
+ method: 'PATCH',
+ body: JSON.stringify(profileData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/staff/approvals/route.ts b/src/app/api/members/staff/approvals/route.ts
new file mode 100644
index 0000000..9365d2f
--- /dev/null
+++ b/src/app/api/members/staff/approvals/route.ts
@@ -0,0 +1,25 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const approvalData = await request.json()
+
+ if (!approvalData || !Array.isArray(approvalData) || approvalData.length === 0) {
+ return Response.json({ error: 'Approval data array is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/members/staff/approvals`, {
+ method: 'PATCH',
+ body: JSON.stringify(approvalData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/members/staff/approved/route.ts b/src/app/api/members/staff/approved/route.ts
new file mode 100644
index 0000000..87a0410
--- /dev/null
+++ b/src/app/api/members/staff/approved/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ const url = new URL(request.url)
+ const page = url.searchParams.get('page')
+ const size = url.searchParams.get('size')
+ const isStaff = url.searchParams.get('isStaff')
+ let endpoint = `/v1/members/staff/approved?page=${page}&size=${size}`
+ if (isStaff !== null) {
+ endpoint += `&isStaff=${isStaff}`
+ }
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/members/staff/requests/route.ts b/src/app/api/members/staff/requests/route.ts
new file mode 100644
index 0000000..211c24c
--- /dev/null
+++ b/src/app/api/members/staff/requests/route.ts
@@ -0,0 +1,22 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ const url = new URL(request.url)
+ const page = url.searchParams.get('page')
+ const size = url.searchParams.get('size')
+ const endpoint = `/v1/members/staff/requests?page=${page}&size=${size}`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/[id]/route.ts b/src/app/api/notice/[id]/route.ts
new file mode 100644
index 0000000..a417299
--- /dev/null
+++ b/src/app/api/notice/[id]/route.ts
@@ -0,0 +1,23 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request, { params }: { params: { id: string } }) {
+ try {
+ const noticeId = params.id
+
+ if (!noticeId) {
+ return Response.json({ error: 'Notice ID is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/notice/${noticeId}`, {
+ method: 'GET',
+ })
+ console.log(noticeId, data, error)
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/categories/[categoryId]/route.ts b/src/app/api/notice/categories/[categoryId]/route.ts
new file mode 100644
index 0000000..6b3ddf0
--- /dev/null
+++ b/src/app/api/notice/categories/[categoryId]/route.ts
@@ -0,0 +1,46 @@
+import { apiCallServer } from '@/lib/api.server'
+
+//카테고리 수정
+export async function PUT(request: Request, { params }: { params: { categoryId: string } }) {
+ try {
+ const { name, color } = await request.json()
+ const categoryId = params.categoryId
+
+ const endpoint = `/v1/notice/categories/${categoryId}`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'PUT',
+ body: JSON.stringify({ name, color }),
+ headers: { 'Content-Type': 'application/json' },
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+//카테고리 삭제
+export async function DELETE(request: Request, { params }: { params: { categoryId: string } }) {
+ try {
+ const categoryId = params.categoryId
+
+ const endpoint = `/v1/notice/categories/${categoryId}`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'DELETE',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/categories/colors/available/route.ts b/src/app/api/notice/categories/colors/available/route.ts
new file mode 100644
index 0000000..03e8f3d
--- /dev/null
+++ b/src/app/api/notice/categories/colors/available/route.ts
@@ -0,0 +1,20 @@
+import { apiCallServer } from '@/lib/api.server'
+
+//사용 가능한 카테고리 색상 조회
+export async function GET() {
+ try {
+ const endpoint = `/v1/notice/categories/colors/available`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/categories/route.ts b/src/app/api/notice/categories/route.ts
new file mode 100644
index 0000000..28622cb
--- /dev/null
+++ b/src/app/api/notice/categories/route.ts
@@ -0,0 +1,43 @@
+import { apiCallServer } from '@/lib/api.server'
+
+//카테고리 조회
+export async function GET() {
+ try {
+ const endpoint = `/v1/notice/categories`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+//카테고리 등록 보내는건 name, color
+export async function POST(request: Request) {
+ try {
+ const { name, color } = await request.json()
+
+ const endpoint = `/v1/notice/categories`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'POST',
+ body: JSON.stringify({ name, color }),
+ headers: { 'Content-Type': 'application/json' },
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/files/route.ts b/src/app/api/notice/files/route.ts
new file mode 100644
index 0000000..0f159b2
--- /dev/null
+++ b/src/app/api/notice/files/route.ts
@@ -0,0 +1,33 @@
+import { apiCallServer } from '@/lib/api.server'
+
+//공지 등록
+export async function POST(request: Request) {
+ try {
+ // 쿼리 파라미터 추출
+ const { searchParams } = new URL(request.url)
+ const filename = searchParams.get('filename')
+ const fileType = searchParams.get('fileType')
+ const fileSize = searchParams.get('fileSize')
+
+ if (!filename || !fileType || !fileSize) {
+ return Response.json({ error: 'filename, fileType, fileSize are required' }, { status: 400 })
+ }
+
+ // presigned url 발급 API 호출
+ const url = `/v1/notice/manage/files?filename=${encodeURIComponent(filename)}&fileType=${encodeURIComponent(fileType)}&fileSize=${encodeURIComponent(fileSize)}`
+ const { data, error } = await apiCallServer(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/manage/[id]/route.ts b/src/app/api/notice/manage/[id]/route.ts
new file mode 100644
index 0000000..fc349da
--- /dev/null
+++ b/src/app/api/notice/manage/[id]/route.ts
@@ -0,0 +1,54 @@
+import { apiCallServer } from '@/lib/api.server'
+import { NoticeManageRequest } from '@/types/manager/notice/type'
+
+//공지 수정
+export async function PUT(request: Request, { params }: { params: { id: string } }) {
+ try {
+ const noticeData: NoticeManageRequest = await request.json()
+ const noticeId = params.id
+
+ if (!noticeId) {
+ return Response.json({ error: 'Notice ID is required' }, { status: 400 })
+ }
+
+ if (!noticeData) {
+ return Response.json({ error: 'Notice data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/notice/manage/${noticeId}`, {
+ method: 'PUT',
+ body: JSON.stringify(noticeData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+//공지 삭제
+export async function DELETE(request: Request, { params }: { params: { id: string } }) {
+ try {
+ const noticeId = params.id
+
+ if (!noticeId) {
+ return Response.json({ error: 'Notice ID is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/notice/manage/${noticeId}`, {
+ method: 'DELETE',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/manage/route.ts b/src/app/api/notice/manage/route.ts
new file mode 100644
index 0000000..6bdda5a
--- /dev/null
+++ b/src/app/api/notice/manage/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+import { NoticeManageRequest } from '@/types/manager/notice/type'
+
+//공지 등록
+export async function POST(request: Request) {
+ try {
+ const sessionData: NoticeManageRequest = await request.json()
+
+ if (!sessionData) {
+ return Response.json({ error: 'Sign up data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/notice/manage', {
+ method: 'POST',
+ body: JSON.stringify(sessionData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/route.ts b/src/app/api/notice/route.ts
new file mode 100644
index 0000000..8e8eb0f
--- /dev/null
+++ b/src/app/api/notice/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const page = url.searchParams.get('page')
+ const size = url.searchParams.get('size')
+ const categoryId = url.searchParams.get('categoryId')
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/notice?page=${page}&size=${size}${categoryId && categoryId !== '0' ? `&categoryId=${categoryId}` : ''}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/notice/search/route.ts b/src/app/api/notice/search/route.ts
new file mode 100644
index 0000000..726d218
--- /dev/null
+++ b/src/app/api/notice/search/route.ts
@@ -0,0 +1,23 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ const url = new URL(request.url)
+ const page = url.searchParams.get('page')
+ const size = url.searchParams.get('size')
+ const keyword = url.searchParams.get('keyword')
+ const endpoint = `/v1/notice/search?page=${page}&size=${size}&keyword=${keyword}`
+
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/history/route.ts b/src/app/api/points/history/route.ts
new file mode 100644
index 0000000..9319f3d
--- /dev/null
+++ b/src/app/api/points/history/route.ts
@@ -0,0 +1,33 @@
+/**
+ * POST /api/members/onboarding
+ *
+ * 클라이언트에서 호출하는 API 라우트
+ * 서버에서 백엔드 API를 호출
+ */
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const page = url.searchParams.get('page')
+ const size = url.searchParams.get('size')
+ console.log('page', page)
+ console.log('size', size)
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/points/history?page=${page}&size=${size}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/is-staff/route.ts b/src/app/api/points/manage/is-staff/route.ts
new file mode 100644
index 0000000..f54b192
--- /dev/null
+++ b/src/app/api/points/manage/is-staff/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const body = await request.json()
+ const { memberId, yearMonth } = body
+
+ if (!memberId || !yearMonth) {
+ return Response.json({ error: 'memberId and yearMonth are required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/points/manage/is-staff', {
+ method: 'PATCH',
+ body: JSON.stringify({ memberId, yearMonth }),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/is-tf/route.ts b/src/app/api/points/manage/is-tf/route.ts
new file mode 100644
index 0000000..def3ba6
--- /dev/null
+++ b/src/app/api/points/manage/is-tf/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const body = await request.json()
+ const { memberId, yearMonth } = body
+
+ if (!memberId || !yearMonth) {
+ return Response.json({ error: 'memberId and yearMonth are required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/points/manage/is-tf', {
+ method: 'PATCH',
+ body: JSON.stringify({ memberId, yearMonth }),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/kupick/route.ts b/src/app/api/points/manage/kupick/route.ts
new file mode 100644
index 0000000..5b92a33
--- /dev/null
+++ b/src/app/api/points/manage/kupick/route.ts
@@ -0,0 +1,30 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const body = await request.json()
+ const { memberId, yearMonth } = body
+
+ if (!memberId) {
+ return Response.json({ error: 'memberId is required' }, { status: 400 })
+ }
+
+ if (!yearMonth) {
+ return Response.json({ error: 'yearMonth is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/points/manage/kupick', {
+ method: 'PATCH',
+ body: JSON.stringify({ memberId, yearMonth }),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/kupporters/route.ts b/src/app/api/points/manage/kupporters/route.ts
new file mode 100644
index 0000000..20e80e1
--- /dev/null
+++ b/src/app/api/points/manage/kupporters/route.ts
@@ -0,0 +1,27 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const body = await request.json()
+ const { memberId } = body
+
+ if (!memberId) {
+ return Response.json({ error: 'memberId is required' }, { status: 400 })
+ }
+
+ // forward the full payload to the internal API (backend expects kuportersPoints)
+ const { data, error } = await apiCallServer('/v1/points/manage/kupporters', {
+ method: 'PATCH',
+ body: JSON.stringify(body),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/memo/route.ts b/src/app/api/points/manage/memo/route.ts
new file mode 100644
index 0000000..08a5383
--- /dev/null
+++ b/src/app/api/points/manage/memo/route.ts
@@ -0,0 +1,27 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request) {
+ try {
+ const body = await request.json()
+ const { memberId } = body
+
+ if (!memberId) {
+ return Response.json({ error: 'memberId is required' }, { status: 400 })
+ }
+
+ // forward full payload (includes memo) to internal API
+ const { data, error } = await apiCallServer('/v1/points/manage/memo', {
+ method: 'PATCH',
+ body: JSON.stringify(body),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/monthly/route.ts b/src/app/api/points/manage/monthly/route.ts
new file mode 100644
index 0000000..57928c6
--- /dev/null
+++ b/src/app/api/points/manage/monthly/route.ts
@@ -0,0 +1,44 @@
+import { apiCallServer } from '@/lib/api.server'
+import { NextRequest } from 'next/server'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const month = searchParams.get('month') || '11'
+ const page = searchParams.get('page') || '1'
+ const size = searchParams.get('size') || '10'
+
+ const { data, error } = await apiCallServer(`/v1/points/manage/monthly?month=${month}&page=${page}&size=${size}`, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+export async function PATCH(request: NextRequest) {
+ try {
+ const body = await request.json()
+
+ const { data, error } = await apiCallServer('/v1/points/manage/monthly', {
+ method: 'PATCH',
+ body: JSON.stringify(body),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/points/manage/overview/route.ts b/src/app/api/points/manage/overview/route.ts
new file mode 100644
index 0000000..8067860
--- /dev/null
+++ b/src/app/api/points/manage/overview/route.ts
@@ -0,0 +1,23 @@
+import { apiCallServer } from '@/lib/api.server'
+import { NextRequest } from 'next/server'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const page = searchParams.get('page') || '1'
+ const size = searchParams.get('size') || '80'
+
+ const { data, error } = await apiCallServer(`/v1/points/manage/overview?page=${page}&size=${size}`, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/s3/postUrl/route.ts b/src/app/api/s3/postUrl/route.ts
new file mode 100644
index 0000000..f585667
--- /dev/null
+++ b/src/app/api/s3/postUrl/route.ts
@@ -0,0 +1,33 @@
+/**
+ * POST /api/members/onboarding
+ *
+ * 클라이언트에서 호출하는 API 라우트
+ * 서버에서 백엔드 API를 호출
+ */
+import { apiCallServer } from '@/lib/api.server'
+
+export async function GET(request: Request) {
+ try {
+ // URL에서 쿼리 파라미터 추출
+ const url = new URL(request.url)
+ const folderName = url.searchParams.get('folderName')
+ const fileName = url.searchParams.get('fileName')
+ console.log('fileName', fileName)
+ console.log('url', url)
+ // 쿼리 파라미터로 백엔드 API URL 구성
+ const endpoint = `/v1/s3/postUrl?folderName=${folderName}&fileName=${fileName}`
+
+ // 서버에서 백엔드 API 호출
+ const { data, error } = await apiCallServer(endpoint, {
+ method: 'GET',
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/session/staff/[id]/route.ts b/src/app/api/session/staff/[id]/route.ts
new file mode 100644
index 0000000..a79cd74
--- /dev/null
+++ b/src/app/api/session/staff/[id]/route.ts
@@ -0,0 +1,30 @@
+import { apiCallServer } from '@/lib/api.server'
+
+export async function PATCH(request: Request, { params }: { params: { id: string } }) {
+ try {
+ const sessionData = await request.json()
+ const sessionId = params.id
+
+ if (!sessionId) {
+ return Response.json({ error: 'Session ID is required' }, { status: 400 })
+ }
+
+ if (!sessionData) {
+ return Response.json({ error: 'Session data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer(`/v1/session/staff/${sessionId}`, {
+ method: 'PATCH',
+ body: JSON.stringify(sessionData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/session/staff/detail/image/route.ts b/src/app/api/session/staff/detail/image/route.ts
new file mode 100644
index 0000000..694376a
--- /dev/null
+++ b/src/app/api/session/staff/detail/image/route.ts
@@ -0,0 +1,51 @@
+import { apiCallServer } from '@/lib/api.server'
+import { SessionDetailImageRequest, SessionDetailImageResponse } from '@/types/manager/session/type'
+
+//세션 상세정보 이미지 업로드
+export async function POST(request: Request) {
+ try {
+ const uploadData: SessionDetailImageRequest = await request.json()
+
+ if (!uploadData || !uploadData.sessionDetailId || !uploadData.imageFileName?.length) {
+ return Response.json({ error: 'Session detail ID and image file names are required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/session/staff/detail/image', {
+ method: 'POST',
+ body: JSON.stringify(uploadData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+//세션 상세정보 이미지 삭제
+export async function DELETE(request: Request) {
+ try {
+ const deleteData: { sessionImageId: number } = await request.json()
+
+ if (!deleteData || !deleteData.sessionImageId) {
+ return Response.json({ error: 'Session image ID is required' }, { status: 400 })
+ }
+
+ const endpoint = '/v1/session/staff/detail/image'
+ const { data, error } = await apiCallServer<{ success: boolean }>(endpoint, {
+ method: 'DELETE',
+ body: JSON.stringify(deleteData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/session/staff/detail/route.ts b/src/app/api/session/staff/detail/route.ts
new file mode 100644
index 0000000..99455cb
--- /dev/null
+++ b/src/app/api/session/staff/detail/route.ts
@@ -0,0 +1,26 @@
+import { apiCallServer } from '@/lib/api.server'
+import { SessionDetailRequest } from '@/types/manager/session/type'
+
+//세션 상세 정보 upsert
+export async function POST(request: Request) {
+ try {
+ const sessionData: SessionDetailRequest = await request.json()
+
+ if (!sessionData) {
+ return Response.json({ error: 'Sign up data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/session/staff/detail', {
+ method: 'POST',
+ body: JSON.stringify(sessionData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/api/session/staff/route.ts b/src/app/api/session/staff/route.ts
new file mode 100644
index 0000000..87a9e5c
--- /dev/null
+++ b/src/app/api/session/staff/route.ts
@@ -0,0 +1,53 @@
+import { apiCallServer } from '@/lib/api.server'
+import { SessionScheduleRequest, SessionScheduleResponse } from '@/types/manager/session/type'
+
+//세션 일정 저장
+export async function POST(request: Request) {
+ try {
+ const sessionData: SessionScheduleRequest = await request.json()
+
+ if (!sessionData) {
+ return Response.json({ error: 'Sign up data is required' }, { status: 400 })
+ }
+
+ const { data, error } = await apiCallServer('/v1/session/staff', {
+ method: 'POST',
+ body: JSON.stringify(sessionData),
+ })
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
+
+//세션 정보 불러오기
+export async function GET(request: Request) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const page = searchParams.get('page') || '1'
+ const size = searchParams.get('size') || '10'
+
+ console.log('API route - received page:', page, 'size:', size)
+
+ const { data, error } = await apiCallServer(
+ `/v1/session/staff?page=${page}&size=${size}`,
+ {
+ method: 'GET',
+ }
+ )
+
+ if (error) {
+ return Response.json({ error }, { status: 400 })
+ }
+
+ return Response.json({ success: true, data })
+ } catch (error) {
+ console.error('Server error:', error)
+ return Response.json({ error: error instanceof Error ? error.message : 'Internal server error' }, { status: 500 })
+ }
+}
diff --git a/src/app/auth/[platform]/callback/route.ts b/src/app/auth/[platform]/callback/route.ts
new file mode 100644
index 0000000..5a61bcd
--- /dev/null
+++ b/src/app/auth/[platform]/callback/route.ts
@@ -0,0 +1,108 @@
+import { NextRequest, NextResponse } from 'next/server'
+import { cookies } from 'next/headers'
+import { postAuthKaKao, postAuthApple } from '@/lib/auth'
+
+type Props = { params: Promise<{ platform: string }> }
+
+/**
+ * 1. 공통 인증 처리 함수
+ * API 결과값을 받아 쿠키를 굽고 최종 페이지로 리다이렉트합니다.
+ */
+async function processAuth(result: any, baseUrl: string) {
+ // 리다이렉트 시 303 상태 코드를 명시하여 POST -> GET으로 전환
+ const redirect = (path: string) =>
+ NextResponse.redirect(new URL(path, baseUrl), { status: 303 });
+
+ if (!result.success) {
+ console.error('Authentication failed:', result.error);
+ return redirect(`/login?error=${encodeURIComponent(result.error || 'auth_failed')}`);
+ }
+
+ const { status, role, accessToken, refreshToken, hasInfo } = result;
+ const cookieStore = await cookies();
+
+ const cookieOptions = {
+ maxAge: 7 * 24 * 60 * 60,
+ secure: process.env.NODE_ENV === 'production',
+ sameSite: 'lax' as const,
+ path: '/',
+ };
+
+ // 1. 필수 인증 토큰/권한 쿠키 설정
+ if (accessToken) cookieStore.set('accessToken', accessToken, { ...cookieOptions, httpOnly: true });
+ if (refreshToken) cookieStore.set('refreshToken', refreshToken, { ...cookieOptions, httpOnly: true });
+ if (role) cookieStore.set('role', role, cookieOptions);
+
+ // 2. 미들웨어에서 사용하는 status와 hasInfo 쿠키를 반드시 구워줘야 합니다.
+ if (status) cookieStore.set('status', status, cookieOptions);
+ if (hasInfo !== undefined) cookieStore.set('hasInfo', String(hasInfo), cookieOptions);
+
+ // 3. 리다이렉트 로직
+ if (status === 'PENDING') {
+ return redirect(hasInfo ? '/sign-up?step=7' : '/sign-up');
+ }
+
+ if (status === 'APPROVED') {
+ const mainRoles = ['USER', 'MANAGEMENT', 'STAFF', 'EXECUTIVE'];
+ if (mainRoles.includes(role)) return redirect('/home');
+ if (role === 'GUEST') return redirect('/sign-up');
+ }
+
+ return redirect('/login?error=unexpected_status');
+}
+
+/**
+ * 2. GET 핸들러 (카카오 등 쿼리 파라미터 방식)
+ */
+export async function GET(request: NextRequest, { params }: Props) {
+ const { platform } = await params
+ const { searchParams } = new URL(request.url)
+ const baseUrl = request.nextUrl.origin
+ const env = baseUrl === 'http://localhost:3000' ? 'LOCAL' : 'DEV'
+
+ try {
+ if (platform === 'kakao') {
+ const code = searchParams.get('code')
+ const error = searchParams.get('error')
+ if (error || !code) throw new Error(error || 'no_code')
+
+ const result = await postAuthKaKao(code, env)
+ return await processAuth(result, baseUrl)
+ }
+
+ return NextResponse.redirect(new URL('/login?error=invalid_platform', baseUrl))
+ } catch (error: any) {
+ return NextResponse.redirect(new URL(`/login?error=${encodeURIComponent(error.message)}`, baseUrl))
+ }
+}
+
+/**
+ * 3. POST 핸들러 (애플 등 Form Data 방식)
+ */
+// ... 기존 import 동일
+export async function POST(request: NextRequest, { params }: Props) {
+ const { platform } = await params;
+ const baseUrl = request.nextUrl.origin;
+
+ try {
+ if (platform === 'apple') {
+ const formData = await request.formData();
+ const code = formData.get('code') as string;
+
+ if (!code) throw new Error('no_code');
+
+ // 백엔드 호출
+ const result = await postAuthApple(code);
+
+ // 성공/실패 여부에 상관없이 processAuth에서 303 리다이렉트 처리
+ return await processAuth(result, baseUrl);
+ }
+ } catch (error: any) {
+ console.error('Apple POST Handler Error:', error);
+ // 에러 발생 시에도 303으로 리다이렉트하여 405 방지
+ return NextResponse.redirect(
+ new URL(`/login?error=${encodeURIComponent(error.message)}`, baseUrl),
+ 303
+ );
+ }
+}
diff --git a/src/app/error.tsx b/src/app/error.tsx
new file mode 100644
index 0000000..1ddc397
--- /dev/null
+++ b/src/app/error.tsx
@@ -0,0 +1,40 @@
+'use client'
+
+import { useEffect } from 'react'
+import { DangerIcon, RefreshCwIcon } from '@/assets/svgComponents/member'
+
+interface ErrorPageProps {
+ error: Error & { digest?: string }
+ reset: () => void // 페이지를 다시 렌더링하는 함수
+}
+
+export default function Error({ error, reset }: ErrorPageProps) {
+ useEffect(() => {
+ // 에러 리포팅 서비스(Sentry 등)에 에러를 기록할 수 있습니다.
+ console.error(error)
+ }, [error])
+
+ return (
+
+
+
+
문제가 발생했어요!
+
+ 예상치 못한 오류가 발생했습니다.
+ 다시 시도해 주세요.
+
+
+
+
reset()
+ }
+ className="caption-sm-semibold flex gap-x-2 rounded-full border border-gray-300 px-3 py-2 text-gray-400"
+ >
+
+ 다시 시도
+
+
+ )
+}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
new file mode 100644
index 0000000..07a43a8
Binary files /dev/null and b/src/app/favicon.ico differ
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..a0e62d0
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,759 @@
+@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css');
+
+@import 'tailwindcss';
+
+@import "tw-animate-css";
+
+@custom-variant dark (&:is(.dark *));
+
+@font-face {
+ font-family: 'Pretendard Variable';
+ /* Using 'truetype-variations' or 'truetype' is often better */
+ src: url('/fonts/PretendardVariable.ttf') format('truetype-variations'),
+ url('/fonts/PretendardVariable.ttf') format('truetype');
+ font-weight: 100 900;
+ font-display: swap;
+}
+
+@theme {
+ --breakpoint-*: initial;
+ --breakpoint-desktop: 1440px;
+ --breakpoint-laptop: 1024px;
+ --breakpoint-tablet: 768px;
+ --breakpoint-ios: 375px;
+ --breakpoint-android: 360px;
+}
+
+:root {
+ --safe-area-inset-bottom: max(0px, env(safe-area-inset-bottom));
+ --safe-area-inset-top: max(0px, env(safe-area-inset-top));
+ --safe-area-inset-left: max(0px, env(safe-area-inset-left));
+ --safe-area-inset-right: max(0px, env(safe-area-inset-right));
+}
+.scrollbar-hide {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+.scrollbar-hide::-webkit-scrollbar {
+ display: none; /* Chrome, Safari, Opera */
+}
+
+/* tailwindCSS에서 해당 color들을 사용할 수 있도록 변경 */
+/* :root에 선언된 애들을 사용하고 있어서 그대로 뒀습니다. 아래와 같이 @theme에 선언해주면 tailwindcss처럼 사용할 수 있어서 @theme도 만들었습니다. */
+@theme {
+ --color-primary-50: #EEF2FF;
+ --color-primary-100: #D4DFFF;
+ --color-primary-200: #B4C7FF;
+ --color-primary-300: #94AEFF;
+ --color-primary-400: #5F86FF;
+ --color-primary-500: #326BFF;
+ --color-primary-600: #2655E6;
+ --color-primary-700: #224BCC;
+ --color-primary-800: #1538A1;
+ --color-primary-900: #0C2369;
+
+ --color-gray-50: #FCFDFF;
+ --color-gray-100: #F2F2F9;
+ --color-gray-200: #D7D7E3;
+ --color-gray-300: #C4C6D3;
+ --color-gray-400: #A9AABE;
+ --color-gray-500: #7E83A1;
+ --color-gray-600: #747693;
+ --color-gray-700: #393F4E;
+ --color-gray-800: #262A34;
+ --color-gray-900: #353744;
+
+ --color-background1: #FAFAFA;
+ --color-background2: #EDEDF4;
+
+ --color-sub-red: #FF0F2D;
+ --color-sub-red-accent: #D80516;
+ --color-sub-red-light: #FFE9E9;
+ --color-sub-green: #00C400;
+ --color-sub-green-light: #DBF1DB;
+ --color-opacity-40: #00000066;
+ --color-opacity-20: #00000033;
+
+ --color-white: #ffffff;
+ --color-black: #000000;
+
+ --shadow-middlemodal: 0px 4px 50px 0px #0000000d;
+ --shadow-location-search: 0px 4px 28px 0px #0000000d;
+}
+
+/* 전역 폰트 스타일 */
+body {
+ font-family: Pretendard, 'Pretendard Variable', sans-serif;
+ background-color: #000000;
+ color: #000000;
+}
+
+{/* title */}
+@utility title-lg-bold {
+ /* Title/lg/bold */
+ font-family: Pretendard;
+ font-size: 60px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 72px; /* 120% */
+}
+@utility title-lg-semibold {
+ /* Title/lg/semiBold */
+ font-family: Pretendard;
+ font-size: 60px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 72px; /* 120% */
+}
+@utility title-lg-medium {
+ /* Title/lg/medium */
+ font-family: Pretendard;
+ font-size: 60px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 72px; /* 120% */
+}
+@utility title-lg-regular {
+ /* Title/lg/regular */
+ font-family: Pretendard;
+ font-size: 60px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 73px; /* 121.667% */
+}
+@utility title-md-bold {
+ /* Title/md/bold */
+ font-family: Pretendard;
+ font-size: 48px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 56px; /* 116.667% */
+}
+@utility title-md-semibold {
+ /* Title/md/semibold */
+ font-family: Pretendard;
+ font-size: 48px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 56px; /* 116.667% */
+}
+@utility title-md-medium {
+ /* Title/md/medium */
+ font-family: Pretendard;
+ font-size: 48px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 56px; /* 116.667% */
+}
+@utility title-md-regular {
+ /* Title/md/regular */
+ font-family: Pretendard;
+ font-size: 48px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 56px; /* 116.667% */
+}
+@utility title-sm-bold {
+ /* Title/sm/bold */
+ font-family: Pretendard;
+ font-size: 40px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 52px; /* 130% */
+}
+@utility title-sm-semibold {
+ /* Title/sm/semiBold */
+ font-family: Pretendard;
+ font-size: 40px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 52px; /* 130% */
+}
+@utility title-sm-medium {
+ /* Title/sm/medium */
+ font-family: Pretendard;
+ font-size: 40px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 52px; /* 130% */
+}
+@utility title-sm-regular {
+ /* Title/sm/regular */
+ font-family: Pretendard;
+ font-size: 40px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 52px; /* 130% */
+}
+
+{/* heading */}
+@utility heading-3xl-bold {
+ /* Heading/3xl/bold */
+ font-family: Pretendard;
+ font-size: 36px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 52px; /* 144.444% */
+}
+@utility heading-3xl-semibold {
+ /* Heading/3xl/semibold */
+ font-family: Pretendard;
+ font-size: 36px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 52px; /* 144.444% */
+}
+@utility heading-3xl-medium {
+ /* Heading/3xl/medium */
+ font-family: Pretendard;
+ font-size: 36px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 52px; /* 144.444% */
+}
+@utility heading-3xl-regular {
+ /* Heading/3xl/regular */
+ font-family: Pretendard;
+ font-size: 36px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 52px; /* 144.444% */
+}
+@utility heading-2xl-bold {
+ /* Heading/2xl/bold */
+ font-family: Pretendard;
+ font-size: 32px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 48px; /* 150% */
+}
+@utility heading-2xl-semibold {
+ /* Heading/2xl/semibold */
+ font-family: Pretendard;
+ font-size: 32px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 48px; /* 150% */
+}
+@utility heading-2xl-medium {
+ /* Heading/2xl/medium */
+ font-family: Pretendard;
+ font-size: 32px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 48px; /* 150% */
+}
+@utility heading-2xl-regular {
+ /* Heading/2xl/regular */
+ font-family: Pretendard;
+ font-size: 32px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 48px; /* 150% */
+}
+@utility heading-1xl-bold {
+ /* Heading/1xl/bold */
+ font-family: Pretendard;
+ font-size: 28px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 36px; /* 128.571% */
+}
+@utility heading-1xl-semibold {
+ /* Heading/1xl/semibold */
+ font-family: Pretendard;
+ font-size: 28px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 36px; /* 128.571% */
+}
+@utility heading-1xl-medium {
+ /* Heading/1xl/medium */
+ font-family: Pretendard;
+ font-size: 28px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 36px; /* 128.571% */
+}
+@utility heading-1xl-regular {
+ /* Heading/1xl/regular */
+ font-family: Pretendard;
+ font-size: 28px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 36px; /* 128.571% */
+}
+@utility heading-lg-bold {
+ /* Heading/lg/bold */
+ font-family: Pretendard;
+ font-size: 24px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 28px; /* 116.667% */
+}
+@utility heading-lg-semibold {
+ /* Heading/lg/semibold */
+ font-family: Pretendard;
+ font-size: 24px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 28px; /* 116.667% */
+}
+@utility heading-lg-medium {
+ /* Heading/lg/medium */
+ font-family: Pretendard;
+ font-size: 24px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 28px; /* 116.667% */
+}
+@utility heading-lg-regular {
+ /* Heading/lg/regular */
+ font-family: Pretendard;
+ font-size: 24px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 28px; /* 116.667% */
+}
+@utility heading-md-bold {
+ /* Heading/md/bold */
+ font-family: Pretendard;
+ font-size: 22px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 32px; /* 145.455% */
+}
+@utility heading-md-semibold {
+ /* Heading/md/semibold */
+ font-family: Pretendard;
+ font-size: 22px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 32px; /* 145.455% */
+}
+@utility heading-md-medium {
+ /* Heading/md/medium */
+ font-family: Pretendard;
+ font-size: 22px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 32px; /* 145.455% */
+}
+@utility heading-md-regular {
+ /* Heading/md/regular */
+ font-family: Pretendard;
+ font-size: 22px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 32px; /* 145.455% */
+}
+@utility heading-sm-bold {
+ /* Heading/sm/bold */
+ font-family: Pretendard;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 32px; /* 160% */
+}
+@utility heading-sm-semibold {
+ /* Heading/sm/semibold */
+ font-family: Pretendard;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 32px; /* 160% */
+}
+@utility heading-sm-medium {
+ /* Heading/sm/medium */
+ font-family: Pretendard;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 32px; /* 160% */
+}
+@utility heading-sm-regular {
+ /* Heading/sm/regular */
+ font-family: Pretendard;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 32px; /* 160% */
+}
+
+{/* body */}
+@utility body-2xl-bold {
+ /* Body/2xl/bold */
+ font-family: Pretendard;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 28px; /* 155.556% */
+}
+@utility body-2xl-semibold {
+ /* Body/2xl/semibold */
+ font-family: Pretendard;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 28px; /* 155.556% */
+}
+@utility body-2xl-medium {
+ /* Body/2xl/medium */
+ font-family: Pretendard;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 28px; /* 155.556% */
+}
+@utility body-2xl-regular {
+ /* Body/2xl/regular */
+ font-family: Pretendard;
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 28px; /* 155.556% */
+}
+@utility body-read {
+ /* Body/read */
+ font-family: Pretendard;
+ font-size: 17px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 32px; /* 188.235% */
+}
+@utility body-xl-bold {
+ /* Body/xl/bold */
+ font-family: Pretendard;
+ font-size: 17px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 28px; /* 164.706% */
+}
+@utility body-xl-semibold {
+ /* Body/xl/semibold */
+ font-family: Pretendard;
+ font-size: 17px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 28px; /* 164.706% */
+}
+@utility body-xl-medium {
+ /* Body/xl/medium */
+ font-family: Pretendard;
+ font-size: 17px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 28px; /* 164.706% */
+}
+@utility body-xl-regular {
+ /* Body/xl/regular */
+ font-family: Pretendard;
+ font-size: 17px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 28px; /* 164.706% */
+}
+@utility body-lg-bold {
+ /* Body/lg/bold */
+ font-family: Pretendard;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 24px; /* 150% */
+}
+@utility body-lg-semibold {
+ /* Body/lg/semibold */
+ font-family: Pretendard;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 24px; /* 150% */
+}
+@utility body-lg-medium {
+ /* Body/lg/medium */
+ font-family: Pretendard;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 24px; /* 150% */
+}
+@utility body-lg-regular {
+ /* Body/lg/regular */
+ font-family: Pretendard;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 150% */
+}
+
+@utility body-md-bold {
+ /* Body/md/bold */
+ font-family: Pretendard;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 24px; /* 160% */
+}
+@utility body-md-semibold {
+ /* Body/md/semibold */
+ font-family: Pretendard;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 24px; /* 160% */
+}
+@utility body-md-medium {
+ /* Body/md/medium */
+ font-family: Pretendard;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 24px; /* 160% */
+}
+@utility body-md-regular {
+ /* Body/md/regular */
+ font-family: Pretendard;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 24px; /* 160% */
+}
+
+@utility body-sm-bold {
+ /* Body/sm/bold */
+ font-family: Pretendard;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 20px; /* 142.857% */
+}
+@utility body-sm-semibold {
+ /* Body/sm/semibold */
+ font-family: Pretendard;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 20px; /* 142.857% */
+}
+@utility body-sm-medium {
+ /* Body/sm/medium */
+ font-family: Pretendard;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 20px; /* 142.857% */
+}
+@utility body-sm-regular {
+ /* Body/sm/regular */
+ font-family: Pretendard;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 20px; /* 142.857% */
+}
+
+{/* caption */}
+@utility caption-md-bold {
+ /* Caption/md/bold */
+ font-family: Pretendard;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 700;
+ line-height: 16px; /* 123.077% */
+}
+@utility caption-md-semibold {
+ /* Caption/md/semibold */
+ font-family: Pretendard;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 16px; /* 123.077% */
+}
+@utility caption-md-medium {
+ /* Caption/md/medium */
+ font-family: Pretendard;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 16px; /* 123.077% */
+}
+@utility caption-md-regular {
+ /* Caption/md/regular */
+ font-family: Pretendard;
+ font-size: 13px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 16px; /* 123.077% */
+}
+@utility caption-sm-medium {
+ /* Caption/sm/medium */
+ font-family: Pretendard;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 16px; /* 133.333% */
+}
+@utility caption-sm-semibold {
+ /* Caption/sm/semibold */
+ font-family: Pretendard;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 16px; /* 133.333% */
+}
+
+@theme inline {
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
+
+:root {
+ --radius: 0.625rem;
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --chart-1: oklch(0.646 0.222 41.116);
+ --chart-2: oklch(0.6 0.118 184.704);
+ --chart-3: oklch(0.398 0.07 227.392);
+ --chart-4: oklch(0.828 0.189 84.429);
+ --chart-5: oklch(0.769 0.188 70.08);
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: oklch(0.205 0 0);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
+}
+
+.dark {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.205 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.922 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.704 0.191 22.216);
+ --border: oklch(1 0 0 / 10%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.556 0 0);
+ --chart-1: oklch(0.488 0.243 264.376);
+ --chart-2: oklch(0.696 0.17 162.48);
+ --chart-3: oklch(0.769 0.188 70.08);
+ --chart-4: oklch(0.627 0.265 303.9);
+ --chart-5: oklch(0.645 0.246 16.439);
+ --sidebar: oklch(0.205 0 0);
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: oklch(0.488 0.243 264.376);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(1 0 0 / 10%);
+ --sidebar-ring: oklch(0.556 0 0);
+}
+
+@layer base {
+ * {
+ @apply border-border outline-ring/50;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+
+.tiptap-content {
+ @apply w-full;
+ line-height: 1.5;
+}
+
+.tiptap-content h1 {
+ @apply text-2xl font-bold mb-2;
+}
+
+.tiptap-content h2 {
+ @apply text-xl font-semibold mb-2;
+}
+
+.tiptap-content h3 {
+ @apply text-lg font-medium mb-2;
+}
+
+.tiptap-content p {
+ @apply mb-2;
+}
+
+.tiptap-content ul {
+ @apply list-disc ml-5 mb-2;
+}
+
+.tiptap-content ol {
+ @apply list-decimal ml-5 mb-2;
+}
+
+.tiptap-content a {
+ @apply text-blue-600 underline cursor-pointer;
+}
+
+.tiptap-content strong {
+ @apply font-bold;
+}
+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..e5720db
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,82 @@
+import type { Metadata } from 'next'
+import { Geist, Geist_Mono } from 'next/font/google'
+import localFont from 'next/font/local'
+import './globals.css'
+import QueryClientComponent from '@/components/member/common/QueryClient'
+import ToastContainer from '@/components/member/common/toast/ToastContainer'
+import { ToastProvider } from '@/components/member/common/toast/ToastContext'
+import Script from 'next/script'
+
+const geistSans = Geist({
+ variable: '--font-geist-sans',
+ subsets: ['latin'],
+})
+
+const geistMono = Geist_Mono({
+ variable: '--font-geist-mono',
+ subsets: ['latin'],
+})
+
+const pretendard = localFont({
+ src: '../../public/fonts/PretendardVariable.woff2',
+ variable: '--font-pretendard',
+ display: 'swap',
+})
+
+export const metadata: Metadata = {
+ title: 'Ku-Check',
+ description: '큐시즘 출석 체크 서비스',
+}
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode
+}>) {
+ const mazeApiKey = process.env.NEXT_PUBLIC_MAZE_API_KEY
+
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+ )
+}
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
new file mode 100644
index 0000000..0ce4fa5
--- /dev/null
+++ b/src/app/login/page.tsx
@@ -0,0 +1,56 @@
+import Link from 'next/link'
+import { DangerIcon } from '@/assets/svgComponents/member'
+
+interface LoginPageProps {
+ // Page 컴포넌트는 searchParams를 props로 직접 받을 수 있습니다.
+ searchParams?: { [key: string]: string | string[] | undefined }
+}
+
+// 에러 코드에 따른 메시지 매핑
+const ERROR_MESSAGES_TITLE: { [key: string]: string } = {
+ no_code: '카카오 인증 코드가 없어요',
+ unexpected_status: '확인되지 않은 사용자 상태예요',
+ unexpected_role: '알 수 없는 사용자 역할이에요',
+ authentication_failed: '인증에 실패했어요',
+ server_error: '서버에 문제가 발생했어요',
+ default: '로그인 중 알 수 없는 오류가 발생했어요',
+}
+
+const ERROR_MESSAGES_CONTENT: { [key: string]: string } = {
+ no_code: '다시 시도해주세요',
+ unexpected_status: '관리자에게 문의해 주세요',
+ unexpected_role: '관리자에게 문의해 주세요',
+ authentication_failed: '다시 로그인해 주세요',
+ server_error: '잠시후 다시 시도해 주세요',
+ default: '잠시후 다시 시도해 주세요',
+}
+
+/**
+ * 에러 메시지를 표시하는 컴포넌트
+ */
+function ErrorMessage({ errorCode }: { errorCode: string }) {
+ const messageTitle = ERROR_MESSAGES_TITLE[errorCode] || ERROR_MESSAGES_TITLE.default
+ const messageContent = ERROR_MESSAGES_CONTENT[errorCode] || ERROR_MESSAGES_CONTENT.default
+ return (
+
+
+
{messageTitle}
+
{messageContent}
+
+ )
+}
+
+export default async function LoginPage({ searchParams }: LoginPageProps) {
+ const errorCode = typeof searchParams?.error === 'string' ? searchParams.error : null
+
+ return (
+
+ {/* errorCode가 존재할 경우에만 ErrorMessage 컴포넌트를 렌더링합니다. */}
+ {errorCode && }
+
+
+ 로그인 재시도
+
+
+ )
+}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
new file mode 100644
index 0000000..2789d2a
--- /dev/null
+++ b/src/app/not-found.tsx
@@ -0,0 +1,18 @@
+import Link from 'next/link'
+import { Error404Icon } from '@/assets/svgComponents/member'
+
+export default function NotFound() {
+ return (
+
+
+
+
페이지를 찾을 수 없어요
+
+
+
+ 홈으로 돌아가기
+
+
+
+ )
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..102d212
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,11 @@
+import GATracker from '@/components/common/GATracker'
+import Login from '@/components/common/Login'
+
+export default function Home() {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/src/app/sign-up/layout.tsx b/src/app/sign-up/layout.tsx
new file mode 100644
index 0000000..2074717
--- /dev/null
+++ b/src/app/sign-up/layout.tsx
@@ -0,0 +1,30 @@
+import { Suspense } from 'react'
+import SignUpHeaderContainer from '@/components/common/sign-up/member/SignUpHeaderContainer'
+
+interface SignUpLayoutProps {
+ children: React.ReactNode
+}
+
+/**
+ * MemberHeader를 위한 로딩 폴백(Fallback) UI
+ * 헤더가 로드되는 동안 레이아웃이 밀리지 않도록 실제 헤더와 유사한 높이를 지정합니다.
+ */
+function HeaderFallback() {
+ return
+}
+
+export default async function SignUpLayout({ children }: SignUpLayoutProps) {
+ return (
+
+ {/* 훅을 사용하는 컴포넌트를 포함한 MemberHeader를 Suspense로 감싼다. */}
+
}>
+
+
+
+ {/* 헤더의 높이만큼 공간 확보 */}
+
+ {/*
*/}
+ {children}
+
+ )
+}
diff --git a/src/app/sign-up/page.tsx b/src/app/sign-up/page.tsx
new file mode 100644
index 0000000..9c75eda
--- /dev/null
+++ b/src/app/sign-up/page.tsx
@@ -0,0 +1,37 @@
+import { Suspense } from 'react'
+import { SearchParams } from '@/types/common'
+
+import NameField from '@/components/common/sign-up/member/NameField'
+import PhoneNumberField from '@/components/common/sign-up/member/PhoneNumberField'
+import SchoolField from '@/components/common/sign-up/member/SchoolField'
+import MajorField from '@/components/common/sign-up/member/MajorField'
+import PartField from '@/components/common/sign-up/member/PartField'
+import StudentCardUploadField from '@/components/common/sign-up/member/StudentCardUploadField'
+import SignUpDataSubmitModal from '@/components/common/sign-up/member/SignUpDataSubmitModal'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+function SignUpStepSwitcher({ step }: { step: StepType }) {
+ if (step === '1') return
+ if (step === '2') return
+ if (step === '3') return
+ if (step === '4') return
+ if (step === '5') return
+ if (step === '6') return
+ if (step === '7') return
+
+ return
+}
+
+export default async function SignUpPage({ searchParams }: { searchParams: SearchParams }) {
+ const params = await searchParams
+ const step = (params.step as StepType) || '1' // 기본값
+
+ return (
+
+ Loading...}>
+
+
+
+ )
+}
diff --git a/src/assets/svgComponents/BarIcon.tsx b/src/assets/svgComponents/BarIcon.tsx
new file mode 100644
index 0000000..50ef1cb
--- /dev/null
+++ b/src/assets/svgComponents/BarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgBarIcon = (props: SVGProps) => ;
+export default SvgBarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/CalendarIcon.tsx b/src/assets/svgComponents/CalendarIcon.tsx
new file mode 100644
index 0000000..0c7fa10
--- /dev/null
+++ b/src/assets/svgComponents/CalendarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCalendarIcon = (props: SVGProps) => ;
+export default SvgCalendarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/CameraIcon.tsx b/src/assets/svgComponents/CameraIcon.tsx
new file mode 100644
index 0000000..62bd1ac
--- /dev/null
+++ b/src/assets/svgComponents/CameraIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCameraIcon = (props: SVGProps) => ;
+export default SvgCameraIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/ChevronLeftBlackIcon.tsx b/src/assets/svgComponents/ChevronLeftBlackIcon.tsx
new file mode 100644
index 0000000..c96e1f2
--- /dev/null
+++ b/src/assets/svgComponents/ChevronLeftBlackIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronLeftBlackIcon = (props: SVGProps) => ;
+export default SvgChevronLeftBlackIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/ChevronRightIcon.tsx b/src/assets/svgComponents/ChevronRightIcon.tsx
new file mode 100644
index 0000000..bbd6e06
--- /dev/null
+++ b/src/assets/svgComponents/ChevronRightIcon.tsx
@@ -0,0 +1,8 @@
+import * as React from 'react'
+import type { SVGProps } from 'react'
+const SvgChevronRightIcon = (props: SVGProps) => (
+
+
+
+)
+export default SvgChevronRightIcon
diff --git a/src/assets/svgComponents/HomeLogoIcon.tsx b/src/assets/svgComponents/HomeLogoIcon.tsx
new file mode 100644
index 0000000..7dc97d6
--- /dev/null
+++ b/src/assets/svgComponents/HomeLogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHomeLogoIcon = (props: SVGProps) => ;
+export default SvgHomeLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/LogOutIcon.tsx b/src/assets/svgComponents/LogOutIcon.tsx
new file mode 100644
index 0000000..247875f
--- /dev/null
+++ b/src/assets/svgComponents/LogOutIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLogOutIcon = (props: SVGProps) => ;
+export default SvgLogOutIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/NoticeIcon.tsx b/src/assets/svgComponents/NoticeIcon.tsx
new file mode 100644
index 0000000..487ec94
--- /dev/null
+++ b/src/assets/svgComponents/NoticeIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeIcon = (props: SVGProps) => ;
+export default SvgNoticeIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/NotificationIcon.tsx b/src/assets/svgComponents/NotificationIcon.tsx
new file mode 100644
index 0000000..fee546a
--- /dev/null
+++ b/src/assets/svgComponents/NotificationIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNotificationIcon = (props: SVGProps) => ;
+export default SvgNotificationIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/PenaltyPointIcon.tsx b/src/assets/svgComponents/PenaltyPointIcon.tsx
new file mode 100644
index 0000000..9411381
--- /dev/null
+++ b/src/assets/svgComponents/PenaltyPointIcon.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+import type { SVGProps } from 'react'
+const SvgPenaltyPointIcon = (props: SVGProps) => (
+
+
+
+
+
+
+)
+export default SvgPenaltyPointIcon
diff --git a/src/assets/svgComponents/ProfileIcon.tsx b/src/assets/svgComponents/ProfileIcon.tsx
new file mode 100644
index 0000000..26444f5
--- /dev/null
+++ b/src/assets/svgComponents/ProfileIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgProfileIcon = (props: SVGProps) => ;
+export default SvgProfileIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/QrIcon.tsx b/src/assets/svgComponents/QrIcon.tsx
new file mode 100644
index 0000000..b296ae8
--- /dev/null
+++ b/src/assets/svgComponents/QrIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgQrIcon = (props: SVGProps) => ;
+export default SvgQrIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/RewardPointIcon.tsx b/src/assets/svgComponents/RewardPointIcon.tsx
new file mode 100644
index 0000000..56924e6
--- /dev/null
+++ b/src/assets/svgComponents/RewardPointIcon.tsx
@@ -0,0 +1,12 @@
+import * as React from 'react'
+import type { SVGProps } from 'react'
+const SvgRewardPointIcon = (props: SVGProps) => (
+
+
+
+
+)
+export default SvgRewardPointIcon
diff --git a/src/assets/svgComponents/ScheduleIcon.tsx b/src/assets/svgComponents/ScheduleIcon.tsx
new file mode 100644
index 0000000..046a3a4
--- /dev/null
+++ b/src/assets/svgComponents/ScheduleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgScheduleIcon = (props: SVGProps) => ;
+export default SvgScheduleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/SessionNoticeBlueIcon.tsx b/src/assets/svgComponents/SessionNoticeBlueIcon.tsx
new file mode 100644
index 0000000..30e119c
--- /dev/null
+++ b/src/assets/svgComponents/SessionNoticeBlueIcon.tsx
@@ -0,0 +1,17 @@
+import * as React from 'react'
+import type { SVGProps } from 'react'
+const SvgSessionNoticeBlueIcon = (props: SVGProps) => (
+
+
+
+
+
+)
+export default SvgSessionNoticeBlueIcon
diff --git a/src/assets/svgComponents/SettingIcon.tsx b/src/assets/svgComponents/SettingIcon.tsx
new file mode 100644
index 0000000..6df698e
--- /dev/null
+++ b/src/assets/svgComponents/SettingIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSettingIcon = (props: SVGProps) => ;
+export default SvgSettingIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/index.ts b/src/assets/svgComponents/index.ts
new file mode 100644
index 0000000..e2f32e3
--- /dev/null
+++ b/src/assets/svgComponents/index.ts
@@ -0,0 +1,16 @@
+export { default as QrIcon } from './QrIcon'
+export { default as BarIcon } from './BarIcon'
+export { default as CalendarIcon } from './CalendarIcon'
+export { default as CameraIcon } from './CameraIcon'
+export { default as ChevronLeftBlackIcon } from './ChevronLeftBlackIcon'
+export { default as ChevronRightIcon } from './ChevronRightIcon'
+export { default as HomeLogoIcon } from './HomeLogoIcon'
+export { default as LogOutIcon } from './LogOutIcon'
+export { default as NoticeIcon } from './NoticeIcon'
+export { default as NotificationIcon } from './NotificationIcon'
+export { default as PenaltyPointIcon } from './PenaltyPointIcon'
+export { default as ProfileIcon } from './ProfileIcon'
+export { default as RewardPointIcon } from './RewardPointIcon'
+export { default as ScheduleIcon } from './ScheduleIcon'
+export { default as SessionNoticeBlueIcon } from './SessionNoticeBlueIcon'
+export { default as SettingIcon } from './SettingIcon'
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AbsenceIcon.tsx b/src/assets/svgComponents/manager/AbsenceIcon.tsx
new file mode 100644
index 0000000..c3b3bb2
--- /dev/null
+++ b/src/assets/svgComponents/manager/AbsenceIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAbsenceIcon = (props: SVGProps) => ;
+export default SvgAbsenceIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AddPhotoIcon.tsx b/src/assets/svgComponents/manager/AddPhotoIcon.tsx
new file mode 100644
index 0000000..0cab582
--- /dev/null
+++ b/src/assets/svgComponents/manager/AddPhotoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAddPhotoIcon = (props: SVGProps) => ;
+export default SvgAddPhotoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AdminOnIcon.tsx b/src/assets/svgComponents/manager/AdminOnIcon.tsx
new file mode 100644
index 0000000..e67bed9
--- /dev/null
+++ b/src/assets/svgComponents/manager/AdminOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAdminOnIcon = (props: SVGProps) => ;
+export default SvgAdminOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AppleIcon.tsx b/src/assets/svgComponents/manager/AppleIcon.tsx
new file mode 100644
index 0000000..b2251e7
--- /dev/null
+++ b/src/assets/svgComponents/manager/AppleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAppleIcon = (props: SVGProps) => ;
+export default SvgAppleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ArrowLeftIcon.tsx b/src/assets/svgComponents/manager/ArrowLeftIcon.tsx
new file mode 100644
index 0000000..affd08c
--- /dev/null
+++ b/src/assets/svgComponents/manager/ArrowLeftIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgArrowLeftIcon = (props: SVGProps) => ;
+export default SvgArrowLeftIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AttendanceIcon.tsx b/src/assets/svgComponents/manager/AttendanceIcon.tsx
new file mode 100644
index 0000000..d720362
--- /dev/null
+++ b/src/assets/svgComponents/manager/AttendanceIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAttendanceIcon = (props: SVGProps) => ;
+export default SvgAttendanceIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/AttendanceOnIcon.tsx b/src/assets/svgComponents/manager/AttendanceOnIcon.tsx
new file mode 100644
index 0000000..6190313
--- /dev/null
+++ b/src/assets/svgComponents/manager/AttendanceOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAttendanceOnIcon = (props: SVGProps) => ;
+export default SvgAttendanceOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/CalendarIcon.tsx b/src/assets/svgComponents/manager/CalendarIcon.tsx
new file mode 100644
index 0000000..88d4a2b
--- /dev/null
+++ b/src/assets/svgComponents/manager/CalendarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCalendarIcon = (props: SVGProps) => ;
+export default SvgCalendarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/CalendarOnIcon.tsx b/src/assets/svgComponents/manager/CalendarOnIcon.tsx
new file mode 100644
index 0000000..6ef8ad0
--- /dev/null
+++ b/src/assets/svgComponents/manager/CalendarOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCalendarOnIcon = (props: SVGProps) => ;
+export default SvgCalendarOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/CancleIcon.tsx b/src/assets/svgComponents/manager/CancleIcon.tsx
new file mode 100644
index 0000000..9368c7c
--- /dev/null
+++ b/src/assets/svgComponents/manager/CancleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCancleIcon = (props: SVGProps) => ;
+export default SvgCancleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/CheckOneIcon.tsx b/src/assets/svgComponents/manager/CheckOneIcon.tsx
new file mode 100644
index 0000000..800e042
--- /dev/null
+++ b/src/assets/svgComponents/manager/CheckOneIcon.tsx
@@ -0,0 +1,6 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCheckOneIcon = (props: SVGProps) => ;
+export default SvgCheckOneIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ChevronLeft.tsx b/src/assets/svgComponents/manager/ChevronLeft.tsx
new file mode 100644
index 0000000..456dfbc
--- /dev/null
+++ b/src/assets/svgComponents/manager/ChevronLeft.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronLeft = (props: SVGProps) => ;
+export default SvgChevronLeft;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ChevronRight.tsx b/src/assets/svgComponents/manager/ChevronRight.tsx
new file mode 100644
index 0000000..8155e6f
--- /dev/null
+++ b/src/assets/svgComponents/manager/ChevronRight.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronRight = (props: SVGProps) => ;
+export default SvgChevronRight;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/DocumentIcon.tsx b/src/assets/svgComponents/manager/DocumentIcon.tsx
new file mode 100644
index 0000000..c16bc4b
--- /dev/null
+++ b/src/assets/svgComponents/manager/DocumentIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDocumentIcon = (props: SVGProps) => ;
+export default SvgDocumentIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/DocumentOnIcon.tsx b/src/assets/svgComponents/manager/DocumentOnIcon.tsx
new file mode 100644
index 0000000..ac5c3e0
--- /dev/null
+++ b/src/assets/svgComponents/manager/DocumentOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDocumentOnIcon = (props: SVGProps) => ;
+export default SvgDocumentOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/DownIcon.tsx b/src/assets/svgComponents/manager/DownIcon.tsx
new file mode 100644
index 0000000..162800c
--- /dev/null
+++ b/src/assets/svgComponents/manager/DownIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDownIcon = (props: SVGProps) => ;
+export default SvgDownIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/DropLIcon.tsx b/src/assets/svgComponents/manager/DropLIcon.tsx
new file mode 100644
index 0000000..d237e10
--- /dev/null
+++ b/src/assets/svgComponents/manager/DropLIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDropLIcon = (props: SVGProps) => ;
+export default SvgDropLIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/DropRIcon.tsx b/src/assets/svgComponents/manager/DropRIcon.tsx
new file mode 100644
index 0000000..17c71c1
--- /dev/null
+++ b/src/assets/svgComponents/manager/DropRIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDropRIcon = (props: SVGProps) => ;
+export default SvgDropRIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditBlue.tsx b/src/assets/svgComponents/manager/EditBlue.tsx
new file mode 100644
index 0000000..c2713d7
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditBlue.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditBlue = (props: SVGProps) => ;
+export default SvgEditBlue;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditBrown.tsx b/src/assets/svgComponents/manager/EditBrown.tsx
new file mode 100644
index 0000000..a09a97b
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditBrown.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditBrown = (props: SVGProps) => ;
+export default SvgEditBrown;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditCyan.tsx b/src/assets/svgComponents/manager/EditCyan.tsx
new file mode 100644
index 0000000..e4fd556
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditCyan.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditCyan = (props: SVGProps) => ;
+export default SvgEditCyan;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditGreen.tsx b/src/assets/svgComponents/manager/EditGreen.tsx
new file mode 100644
index 0000000..ece7718
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditGreen.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditGreen = (props: SVGProps) => ;
+export default SvgEditGreen;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditLime.tsx b/src/assets/svgComponents/manager/EditLime.tsx
new file mode 100644
index 0000000..360fe59
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditLime.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditLime = (props: SVGProps) => ;
+export default SvgEditLime;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditOrrange.tsx b/src/assets/svgComponents/manager/EditOrrange.tsx
new file mode 100644
index 0000000..238a23e
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditOrrange.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditOrrange = (props: SVGProps) => ;
+export default SvgEditOrrange;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditPink.tsx b/src/assets/svgComponents/manager/EditPink.tsx
new file mode 100644
index 0000000..8a421f9
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditPink.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditPink = (props: SVGProps) => ;
+export default SvgEditPink;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditPurple.tsx b/src/assets/svgComponents/manager/EditPurple.tsx
new file mode 100644
index 0000000..c00750e
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditPurple.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditPurple = (props: SVGProps) => ;
+export default SvgEditPurple;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditRed.tsx b/src/assets/svgComponents/manager/EditRed.tsx
new file mode 100644
index 0000000..600d5d9
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditRed.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditRed = (props: SVGProps) => ;
+export default SvgEditRed;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/EditYellow.tsx b/src/assets/svgComponents/manager/EditYellow.tsx
new file mode 100644
index 0000000..110499d
--- /dev/null
+++ b/src/assets/svgComponents/manager/EditYellow.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgEditYellow = (props: SVGProps) => ;
+export default SvgEditYellow;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/HeaderArrowRight.tsx b/src/assets/svgComponents/manager/HeaderArrowRight.tsx
new file mode 100644
index 0000000..2660158
--- /dev/null
+++ b/src/assets/svgComponents/manager/HeaderArrowRight.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHeaderArrowRight = (props: SVGProps) => ;
+export default SvgHeaderArrowRight;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/KakaoIcon.tsx b/src/assets/svgComponents/manager/KakaoIcon.tsx
new file mode 100644
index 0000000..75864c3
--- /dev/null
+++ b/src/assets/svgComponents/manager/KakaoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgKakaoIcon = (props: SVGProps) => ;
+export default SvgKakaoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/KupicArrowIcon.tsx b/src/assets/svgComponents/manager/KupicArrowIcon.tsx
new file mode 100644
index 0000000..e94ff93
--- /dev/null
+++ b/src/assets/svgComponents/manager/KupicArrowIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgKupicArrowIcon = (props: SVGProps) => ;
+export default SvgKupicArrowIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/KupickIcon.tsx b/src/assets/svgComponents/manager/KupickIcon.tsx
new file mode 100644
index 0000000..a3116a5
--- /dev/null
+++ b/src/assets/svgComponents/manager/KupickIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgKupickIcon = (props: SVGProps) => ;
+export default SvgKupickIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/LeftIcon.tsx b/src/assets/svgComponents/manager/LeftIcon.tsx
new file mode 100644
index 0000000..c1c3004
--- /dev/null
+++ b/src/assets/svgComponents/manager/LeftIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLeftIcon = (props: SVGProps) => ;
+export default SvgLeftIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/LinkIcon.tsx b/src/assets/svgComponents/manager/LinkIcon.tsx
new file mode 100644
index 0000000..0de82c0
--- /dev/null
+++ b/src/assets/svgComponents/manager/LinkIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLinkIcon = (props: SVGProps) => ;
+export default SvgLinkIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/LogOut.tsx b/src/assets/svgComponents/manager/LogOut.tsx
new file mode 100644
index 0000000..e912179
--- /dev/null
+++ b/src/assets/svgComponents/manager/LogOut.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLogOut = (props: SVGProps) => ;
+export default SvgLogOut;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/LogoIcon.tsx b/src/assets/svgComponents/manager/LogoIcon.tsx
new file mode 100644
index 0000000..c61f3ab
--- /dev/null
+++ b/src/assets/svgComponents/manager/LogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLogoIcon = (props: SVGProps) => ;
+export default SvgLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ManageImage.tsx b/src/assets/svgComponents/manager/ManageImage.tsx
new file mode 100644
index 0000000..14c47d5
--- /dev/null
+++ b/src/assets/svgComponents/manager/ManageImage.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgManageImage = (props: SVGProps) => ;
+export default SvgManageImage;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ManagementRightIcon.tsx b/src/assets/svgComponents/manager/ManagementRightIcon.tsx
new file mode 100644
index 0000000..bd51e31
--- /dev/null
+++ b/src/assets/svgComponents/manager/ManagementRightIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgManagementRightIcon = (props: SVGProps) => ;
+export default SvgManagementRightIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ManagerIcon.tsx b/src/assets/svgComponents/manager/ManagerIcon.tsx
new file mode 100644
index 0000000..126fcee
--- /dev/null
+++ b/src/assets/svgComponents/manager/ManagerIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgManagerIcon = (props: SVGProps) => ;
+export default SvgManagerIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ManagerOnIcon.tsx b/src/assets/svgComponents/manager/ManagerOnIcon.tsx
new file mode 100644
index 0000000..8e31078
--- /dev/null
+++ b/src/assets/svgComponents/manager/ManagerOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgManagerOnIcon = (props: SVGProps) => ;
+export default SvgManagerOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/MemberIcon.tsx b/src/assets/svgComponents/manager/MemberIcon.tsx
new file mode 100644
index 0000000..5d77263
--- /dev/null
+++ b/src/assets/svgComponents/manager/MemberIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgMemberIcon = (props: SVGProps) => ;
+export default SvgMemberIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/MemberOnIcon.tsx b/src/assets/svgComponents/manager/MemberOnIcon.tsx
new file mode 100644
index 0000000..741255d
--- /dev/null
+++ b/src/assets/svgComponents/manager/MemberOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgMemberOnIcon = (props: SVGProps) => ;
+export default SvgMemberOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ModalXIcon.tsx b/src/assets/svgComponents/manager/ModalXIcon.tsx
new file mode 100644
index 0000000..f186fa9
--- /dev/null
+++ b/src/assets/svgComponents/manager/ModalXIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgModalXIcon = (props: SVGProps) => ;
+export default SvgModalXIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NaverIcon.tsx b/src/assets/svgComponents/manager/NaverIcon.tsx
new file mode 100644
index 0000000..6b93bba
--- /dev/null
+++ b/src/assets/svgComponents/manager/NaverIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNaverIcon = (props: SVGProps) => ;
+export default SvgNaverIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NewIcon.tsx b/src/assets/svgComponents/manager/NewIcon.tsx
new file mode 100644
index 0000000..ce39c63
--- /dev/null
+++ b/src/assets/svgComponents/manager/NewIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNewIcon = (props: SVGProps) => ;
+export default SvgNewIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticeIcon.tsx b/src/assets/svgComponents/manager/NoticeIcon.tsx
new file mode 100644
index 0000000..861e7af
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticeIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeIcon = (props: SVGProps) => ;
+export default SvgNoticeIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticeImageIcon.tsx b/src/assets/svgComponents/manager/NoticeImageIcon.tsx
new file mode 100644
index 0000000..7f07ab3
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticeImageIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeImageIcon = (props: SVGProps) => ;
+export default SvgNoticeImageIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticeOnIcon.tsx b/src/assets/svgComponents/manager/NoticeOnIcon.tsx
new file mode 100644
index 0000000..e2a0bc6
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticeOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeOnIcon = (props: SVGProps) => ;
+export default SvgNoticeOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticePlusIcon.tsx b/src/assets/svgComponents/manager/NoticePlusIcon.tsx
new file mode 100644
index 0000000..b1a541c
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticePlusIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticePlusIcon = (props: SVGProps) => ;
+export default SvgNoticePlusIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticeSettingIcon.tsx b/src/assets/svgComponents/manager/NoticeSettingIcon.tsx
new file mode 100644
index 0000000..9254a87
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticeSettingIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeSettingIcon = (props: SVGProps) => ;
+export default SvgNoticeSettingIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/NoticeTagIcon.tsx b/src/assets/svgComponents/manager/NoticeTagIcon.tsx
new file mode 100644
index 0000000..57f4a63
--- /dev/null
+++ b/src/assets/svgComponents/manager/NoticeTagIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeTagIcon = (props: SVGProps) => ;
+export default SvgNoticeTagIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PhoneIcon.tsx b/src/assets/svgComponents/manager/PhoneIcon.tsx
new file mode 100644
index 0000000..47cc20e
--- /dev/null
+++ b/src/assets/svgComponents/manager/PhoneIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPhoneIcon = (props: SVGProps) => ;
+export default SvgPhoneIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PlusIcon.tsx b/src/assets/svgComponents/manager/PlusIcon.tsx
new file mode 100644
index 0000000..06e0c65
--- /dev/null
+++ b/src/assets/svgComponents/manager/PlusIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPlusIcon = (props: SVGProps) => ;
+export default SvgPlusIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PointIcon.tsx b/src/assets/svgComponents/manager/PointIcon.tsx
new file mode 100644
index 0000000..341f9f0
--- /dev/null
+++ b/src/assets/svgComponents/manager/PointIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPointIcon = (props: SVGProps) => ;
+export default SvgPointIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PointOnIcon.tsx b/src/assets/svgComponents/manager/PointOnIcon.tsx
new file mode 100644
index 0000000..36603af
--- /dev/null
+++ b/src/assets/svgComponents/manager/PointOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPointOnIcon = (props: SVGProps) => ;
+export default SvgPointOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PointdownIcon.tsx b/src/assets/svgComponents/manager/PointdownIcon.tsx
new file mode 100644
index 0000000..fb22537
--- /dev/null
+++ b/src/assets/svgComponents/manager/PointdownIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPointdownIcon = (props: SVGProps) => ;
+export default SvgPointdownIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/PointupIcon.tsx b/src/assets/svgComponents/manager/PointupIcon.tsx
new file mode 100644
index 0000000..9a8d309
--- /dev/null
+++ b/src/assets/svgComponents/manager/PointupIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPointupIcon = (props: SVGProps) => ;
+export default SvgPointupIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/QrCheckIcon.tsx b/src/assets/svgComponents/manager/QrCheckIcon.tsx
new file mode 100644
index 0000000..9a0f8bd
--- /dev/null
+++ b/src/assets/svgComponents/manager/QrCheckIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgQrCheckIcon = (props: SVGProps) => ;
+export default SvgQrCheckIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/QrErrorIcon.tsx b/src/assets/svgComponents/manager/QrErrorIcon.tsx
new file mode 100644
index 0000000..56fa36d
--- /dev/null
+++ b/src/assets/svgComponents/manager/QrErrorIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgQrErrorIcon = (props: SVGProps) => ;
+export default SvgQrErrorIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/RightIcon.tsx b/src/assets/svgComponents/manager/RightIcon.tsx
new file mode 100644
index 0000000..eda3757
--- /dev/null
+++ b/src/assets/svgComponents/manager/RightIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgRightIcon = (props: SVGProps) => ;
+export default SvgRightIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ScheduleIcon.tsx b/src/assets/svgComponents/manager/ScheduleIcon.tsx
new file mode 100644
index 0000000..e17ceb4
--- /dev/null
+++ b/src/assets/svgComponents/manager/ScheduleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgScheduleIcon = (props: SVGProps) => ;
+export default SvgScheduleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/ScheduleOnIcon.tsx b/src/assets/svgComponents/manager/ScheduleOnIcon.tsx
new file mode 100644
index 0000000..d15ab72
--- /dev/null
+++ b/src/assets/svgComponents/manager/ScheduleOnIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgScheduleOnIcon = (props: SVGProps) => ;
+export default SvgScheduleOnIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/SessionNoneIcon.tsx b/src/assets/svgComponents/manager/SessionNoneIcon.tsx
new file mode 100644
index 0000000..7545c5d
--- /dev/null
+++ b/src/assets/svgComponents/manager/SessionNoneIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSessionNoneIcon = (props: SVGProps) => ;
+export default SvgSessionNoneIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/SideMenuIcon.tsx b/src/assets/svgComponents/manager/SideMenuIcon.tsx
new file mode 100644
index 0000000..63c67b1
--- /dev/null
+++ b/src/assets/svgComponents/manager/SideMenuIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSideMenuIcon = (props: SVGProps) => ;
+export default SvgSideMenuIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap1Icon.tsx b/src/assets/svgComponents/manager/Tiptap1Icon.tsx
new file mode 100644
index 0000000..ba00fcf
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap1Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap1Icon = (props: SVGProps) => ;
+export default SvgTiptap1Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap2Icon.tsx b/src/assets/svgComponents/manager/Tiptap2Icon.tsx
new file mode 100644
index 0000000..a53cbb3
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap2Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap2Icon = (props: SVGProps) => ;
+export default SvgTiptap2Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap3Icon.tsx b/src/assets/svgComponents/manager/Tiptap3Icon.tsx
new file mode 100644
index 0000000..68b0735
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap3Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap3Icon = (props: SVGProps) => ;
+export default SvgTiptap3Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap4Icon.tsx b/src/assets/svgComponents/manager/Tiptap4Icon.tsx
new file mode 100644
index 0000000..37f3fe5
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap4Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap4Icon = (props: SVGProps) => ;
+export default SvgTiptap4Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap5Icon.tsx b/src/assets/svgComponents/manager/Tiptap5Icon.tsx
new file mode 100644
index 0000000..48512ee
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap5Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap5Icon = (props: SVGProps) => ;
+export default SvgTiptap5Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap6Icon.tsx b/src/assets/svgComponents/manager/Tiptap6Icon.tsx
new file mode 100644
index 0000000..a0631f0
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap6Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap6Icon = (props: SVGProps) => ;
+export default SvgTiptap6Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/Tiptap7Icon.tsx b/src/assets/svgComponents/manager/Tiptap7Icon.tsx
new file mode 100644
index 0000000..2ac4856
--- /dev/null
+++ b/src/assets/svgComponents/manager/Tiptap7Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgTiptap7Icon = (props: SVGProps) => ;
+export default SvgTiptap7Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/UpIcon.tsx b/src/assets/svgComponents/manager/UpIcon.tsx
new file mode 100644
index 0000000..0a2dc13
--- /dev/null
+++ b/src/assets/svgComponents/manager/UpIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgUpIcon = (props: SVGProps) => ;
+export default SvgUpIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/manager/index.ts b/src/assets/svgComponents/manager/index.ts
new file mode 100644
index 0000000..c18f07b
--- /dev/null
+++ b/src/assets/svgComponents/manager/index.ts
@@ -0,0 +1,71 @@
+export { default as Tiptap1Icon } from './Tiptap1Icon'
+export { default as Tiptap2Icon } from './Tiptap2Icon'
+export { default as Tiptap3Icon } from './Tiptap3Icon'
+export { default as Tiptap4Icon } from './Tiptap4Icon'
+export { default as Tiptap5Icon } from './Tiptap5Icon'
+export { default as Tiptap6Icon } from './Tiptap6Icon'
+export { default as Tiptap7Icon } from './Tiptap7Icon'
+export { default as AbsenceIcon } from './AbsenceIcon'
+export { default as AddPhotoIcon } from './AddPhotoIcon'
+export { default as AppleIcon } from './AppleIcon'
+export { default as ArrowLeftIcon } from './ArrowLeftIcon'
+export { default as AttendanceIcon } from './AttendanceIcon'
+export { default as AttendanceOnIcon } from './AttendanceOnIcon'
+export { default as CalendarIcon } from './CalendarIcon'
+export { default as CalendarOnIcon } from './CalendarOnIcon'
+export { default as CancleIcon } from './CancleIcon'
+export { default as CheckOneIcon } from './CheckOneIcon'
+export { default as ChevronLeft } from './ChevronLeft'
+export { default as ChevronRight } from './ChevronRight'
+export { default as DocumentIcon } from './DocumentIcon'
+export { default as DocumentOnIcon } from './DocumentOnIcon'
+export { default as DownIcon } from './DownIcon'
+export { default as DropLIcon } from './DropLIcon'
+export { default as DropRIcon } from './DropRIcon'
+export { default as EditBlue } from './EditBlue'
+export { default as EditBrown } from './EditBrown'
+export { default as EditCyan } from './EditCyan'
+export { default as EditGreen } from './EditGreen'
+export { default as EditLime } from './EditLime'
+export { default as EditOrrange } from './EditOrrange'
+export { default as EditPink } from './EditPink'
+export { default as EditPurple } from './EditPurple'
+export { default as EditRed } from './EditRed'
+export { default as EditYellow } from './EditYellow'
+export { default as HeaderArrowRight } from './HeaderArrowRight'
+export { default as KakaoIcon } from './KakaoIcon'
+export { default as KupicArrowIcon } from './KupicArrowIcon'
+export { default as KupickIcon } from './KupickIcon'
+export { default as LeftIcon } from './LeftIcon'
+export { default as LinkIcon } from './LinkIcon'
+export { default as LogOut } from './LogOut'
+export { default as LogoIcon } from './LogoIcon'
+export { default as ManageImage } from './ManageImage'
+export { default as ManagementRightIcon } from './ManagementRightIcon'
+export { default as ManagerIcon } from './ManagerIcon'
+export { default as ManagerOnIcon } from './ManagerOnIcon'
+export { default as MemberIcon } from './MemberIcon'
+export { default as MemberOnIcon } from './MemberOnIcon'
+export { default as ModalXIcon } from './ModalXIcon'
+export { default as NaverIcon } from './NaverIcon'
+export { default as NewIcon } from './NewIcon'
+export { default as NoticeIcon } from './NoticeIcon'
+export { default as NoticeImageIcon } from './NoticeImageIcon'
+export { default as NoticeOnIcon } from './NoticeOnIcon'
+export { default as NoticePlusIcon } from './NoticePlusIcon'
+export { default as NoticeSettingIcon } from './NoticeSettingIcon'
+export { default as NoticeTagIcon } from './NoticeTagIcon'
+export { default as PhoneIcon } from './PhoneIcon'
+export { default as PlusIcon } from './PlusIcon'
+export { default as PointIcon } from './PointIcon'
+export { default as PointOnIcon } from './PointOnIcon'
+export { default as PointdownIcon } from './PointdownIcon'
+export { default as PointupIcon } from './PointupIcon'
+export { default as QrCheckIcon } from './QrCheckIcon'
+export { default as QrErrorIcon } from './QrErrorIcon'
+export { default as RightIcon } from './RightIcon'
+export { default as ScheduleIcon } from './ScheduleIcon'
+export { default as ScheduleOnIcon } from './ScheduleOnIcon'
+export { default as SessionNoneIcon } from './SessionNoneIcon'
+export { default as SideMenuIcon } from './SideMenuIcon'
+export { default as UpIcon } from './UpIcon'
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AbsenceNoteIcon.tsx b/src/assets/svgComponents/member/AbsenceNoteIcon.tsx
new file mode 100644
index 0000000..9b79b40
--- /dev/null
+++ b/src/assets/svgComponents/member/AbsenceNoteIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAbsenceNoteIcon = (props: SVGProps) => ;
+export default SvgAbsenceNoteIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AkarIconsCircleCheckFillIcon.tsx b/src/assets/svgComponents/member/AkarIconsCircleCheckFillIcon.tsx
new file mode 100644
index 0000000..a86cc90
--- /dev/null
+++ b/src/assets/svgComponents/member/AkarIconsCircleCheckFillIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAkarIconsCircleCheckFillIcon = (props: SVGProps) => ;
+export default SvgAkarIconsCircleCheckFillIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AlertErrorIcon.tsx b/src/assets/svgComponents/member/AlertErrorIcon.tsx
new file mode 100644
index 0000000..739e708
--- /dev/null
+++ b/src/assets/svgComponents/member/AlertErrorIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAlertErrorIcon = (props: SVGProps) => ;
+export default SvgAlertErrorIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AlertInfoIcon.tsx b/src/assets/svgComponents/member/AlertInfoIcon.tsx
new file mode 100644
index 0000000..bfd8085
--- /dev/null
+++ b/src/assets/svgComponents/member/AlertInfoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAlertInfoIcon = (props: SVGProps) => ;
+export default SvgAlertInfoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AlertSuccessIcon.tsx b/src/assets/svgComponents/member/AlertSuccessIcon.tsx
new file mode 100644
index 0000000..272506a
--- /dev/null
+++ b/src/assets/svgComponents/member/AlertSuccessIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAlertSuccessIcon = (props: SVGProps) => ;
+export default SvgAlertSuccessIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/AppleLogoIcon.tsx b/src/assets/svgComponents/member/AppleLogoIcon.tsx
new file mode 100644
index 0000000..f716384
--- /dev/null
+++ b/src/assets/svgComponents/member/AppleLogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgAppleLogoIcon = (props: SVGProps) => ;
+export default SvgAppleLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ArrowRotateLeftIcon.tsx b/src/assets/svgComponents/member/ArrowRotateLeftIcon.tsx
new file mode 100644
index 0000000..43f3c3b
--- /dev/null
+++ b/src/assets/svgComponents/member/ArrowRotateLeftIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgArrowRotateLeftIcon = (props: SVGProps) => ;
+export default SvgArrowRotateLeftIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/BarIcon.tsx b/src/assets/svgComponents/member/BarIcon.tsx
new file mode 100644
index 0000000..50ef1cb
--- /dev/null
+++ b/src/assets/svgComponents/member/BarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgBarIcon = (props: SVGProps) => ;
+export default SvgBarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/BlueHomeLogoIcon.tsx b/src/assets/svgComponents/member/BlueHomeLogoIcon.tsx
new file mode 100644
index 0000000..01ce666
--- /dev/null
+++ b/src/assets/svgComponents/member/BlueHomeLogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgBlueHomeLogoIcon = (props: SVGProps) => ;
+export default SvgBlueHomeLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/CalendarIcon.tsx b/src/assets/svgComponents/member/CalendarIcon.tsx
new file mode 100644
index 0000000..0c7fa10
--- /dev/null
+++ b/src/assets/svgComponents/member/CalendarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCalendarIcon = (props: SVGProps) => ;
+export default SvgCalendarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/CameraIcon.tsx b/src/assets/svgComponents/member/CameraIcon.tsx
new file mode 100644
index 0000000..62bd1ac
--- /dev/null
+++ b/src/assets/svgComponents/member/CameraIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCameraIcon = (props: SVGProps) => ;
+export default SvgCameraIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/CancelIcon.tsx b/src/assets/svgComponents/member/CancelIcon.tsx
new file mode 100644
index 0000000..8f4e7ae
--- /dev/null
+++ b/src/assets/svgComponents/member/CancelIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgCancelIcon = (props: SVGProps) => ;
+export default SvgCancelIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronDownIcon.tsx b/src/assets/svgComponents/member/ChevronDownIcon.tsx
new file mode 100644
index 0000000..b4cdd3c
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronDownIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronDownIcon = (props: SVGProps) => ;
+export default SvgChevronDownIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronLeftBlackIcon.tsx b/src/assets/svgComponents/member/ChevronLeftBlackIcon.tsx
new file mode 100644
index 0000000..c96e1f2
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronLeftBlackIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronLeftBlackIcon = (props: SVGProps) => ;
+export default SvgChevronLeftBlackIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronRightGray600Icon.tsx b/src/assets/svgComponents/member/ChevronRightGray600Icon.tsx
new file mode 100644
index 0000000..30c1c3f
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronRightGray600Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronRightGray600Icon = (props: SVGProps) => ;
+export default SvgChevronRightGray600Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronRightIcon.tsx b/src/assets/svgComponents/member/ChevronRightIcon.tsx
new file mode 100644
index 0000000..aaa805c
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronRightIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronRightIcon = (props: SVGProps) => ;
+export default SvgChevronRightIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronRightPrimary500Icon.tsx b/src/assets/svgComponents/member/ChevronRightPrimary500Icon.tsx
new file mode 100644
index 0000000..514044f
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronRightPrimary500Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronRightPrimary500Icon = (props: SVGProps) => ;
+export default SvgChevronRightPrimary500Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ChevronUpIcon.tsx b/src/assets/svgComponents/member/ChevronUpIcon.tsx
new file mode 100644
index 0000000..73b51a8
--- /dev/null
+++ b/src/assets/svgComponents/member/ChevronUpIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgChevronUpIcon = (props: SVGProps) => ;
+export default SvgChevronUpIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/DangerIcon.tsx b/src/assets/svgComponents/member/DangerIcon.tsx
new file mode 100644
index 0000000..fee57af
--- /dev/null
+++ b/src/assets/svgComponents/member/DangerIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgDangerIcon = (props: SVGProps) => ;
+export default SvgDangerIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/Error404Icon.tsx b/src/assets/svgComponents/member/Error404Icon.tsx
new file mode 100644
index 0000000..3fba0f8
--- /dev/null
+++ b/src/assets/svgComponents/member/Error404Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgError404Icon = (props: SVGProps) => ;
+export default SvgError404Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/FeedbackBannerProfileIcon.tsx b/src/assets/svgComponents/member/FeedbackBannerProfileIcon.tsx
new file mode 100644
index 0000000..e8fd62c
--- /dev/null
+++ b/src/assets/svgComponents/member/FeedbackBannerProfileIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgFeedbackBannerProfileIcon = (props: SVGProps) => ;
+export default SvgFeedbackBannerProfileIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/FillCheckIcon.tsx b/src/assets/svgComponents/member/FillCheckIcon.tsx
new file mode 100644
index 0000000..8a6d055
--- /dev/null
+++ b/src/assets/svgComponents/member/FillCheckIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgFillCheckIcon = (props: SVGProps) => ;
+export default SvgFillCheckIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/GrayPaperclipIcon.tsx b/src/assets/svgComponents/member/GrayPaperclipIcon.tsx
new file mode 100644
index 0000000..1a73902
--- /dev/null
+++ b/src/assets/svgComponents/member/GrayPaperclipIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgGrayPaperclipIcon = (props: SVGProps) => ;
+export default SvgGrayPaperclipIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/HelpCircleIcon.tsx b/src/assets/svgComponents/member/HelpCircleIcon.tsx
new file mode 100644
index 0000000..c9e51c5
--- /dev/null
+++ b/src/assets/svgComponents/member/HelpCircleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHelpCircleIcon = (props: SVGProps) => ;
+export default SvgHelpCircleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/HomeCalendarIcon.tsx b/src/assets/svgComponents/member/HomeCalendarIcon.tsx
new file mode 100644
index 0000000..ab722d2
--- /dev/null
+++ b/src/assets/svgComponents/member/HomeCalendarIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHomeCalendarIcon = (props: SVGProps) => ;
+export default SvgHomeCalendarIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/HomeLogo.tsx b/src/assets/svgComponents/member/HomeLogo.tsx
new file mode 100644
index 0000000..dda5387
--- /dev/null
+++ b/src/assets/svgComponents/member/HomeLogo.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHomeLogo = (props: SVGProps) => ;
+export default SvgHomeLogo;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/HomeLogoIcon.tsx b/src/assets/svgComponents/member/HomeLogoIcon.tsx
new file mode 100644
index 0000000..7dc97d6
--- /dev/null
+++ b/src/assets/svgComponents/member/HomeLogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgHomeLogoIcon = (props: SVGProps) => ;
+export default SvgHomeLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ImageUploaderIcon.tsx b/src/assets/svgComponents/member/ImageUploaderIcon.tsx
new file mode 100644
index 0000000..d7ea4ad
--- /dev/null
+++ b/src/assets/svgComponents/member/ImageUploaderIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgImageUploaderIcon = (props: SVGProps) => ;
+export default SvgImageUploaderIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/KakaoLogoIcon.tsx b/src/assets/svgComponents/member/KakaoLogoIcon.tsx
new file mode 100644
index 0000000..9c670b1
--- /dev/null
+++ b/src/assets/svgComponents/member/KakaoLogoIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgKakaoLogoIcon = (props: SVGProps) => ;
+export default SvgKakaoLogoIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/LogOutIcon.tsx b/src/assets/svgComponents/member/LogOutIcon.tsx
new file mode 100644
index 0000000..247875f
--- /dev/null
+++ b/src/assets/svgComponents/member/LogOutIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgLogOutIcon = (props: SVGProps) => ;
+export default SvgLogOutIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/NoticeIcon.tsx b/src/assets/svgComponents/member/NoticeIcon.tsx
new file mode 100644
index 0000000..487ec94
--- /dev/null
+++ b/src/assets/svgComponents/member/NoticeIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNoticeIcon = (props: SVGProps) => ;
+export default SvgNoticeIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/NotificationIcon.tsx b/src/assets/svgComponents/member/NotificationIcon.tsx
new file mode 100644
index 0000000..fee546a
--- /dev/null
+++ b/src/assets/svgComponents/member/NotificationIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgNotificationIcon = (props: SVGProps) => ;
+export default SvgNotificationIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/PaperclipIcon.tsx b/src/assets/svgComponents/member/PaperclipIcon.tsx
new file mode 100644
index 0000000..4581fc9
--- /dev/null
+++ b/src/assets/svgComponents/member/PaperclipIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPaperclipIcon = (props: SVGProps) => ;
+export default SvgPaperclipIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/PenaltyPointIcon.tsx b/src/assets/svgComponents/member/PenaltyPointIcon.tsx
new file mode 100644
index 0000000..ecc7860
--- /dev/null
+++ b/src/assets/svgComponents/member/PenaltyPointIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPenaltyPointIcon = (props: SVGProps) => ;
+export default SvgPenaltyPointIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/PlayIcon.tsx b/src/assets/svgComponents/member/PlayIcon.tsx
new file mode 100644
index 0000000..c13310d
--- /dev/null
+++ b/src/assets/svgComponents/member/PlayIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPlayIcon = (props: SVGProps) => ;
+export default SvgPlayIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/PlusCircleIcon.tsx b/src/assets/svgComponents/member/PlusCircleIcon.tsx
new file mode 100644
index 0000000..d388f19
--- /dev/null
+++ b/src/assets/svgComponents/member/PlusCircleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPlusCircleIcon = (props: SVGProps) => ;
+export default SvgPlusCircleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/PointsIcon.tsx b/src/assets/svgComponents/member/PointsIcon.tsx
new file mode 100644
index 0000000..c976b72
--- /dev/null
+++ b/src/assets/svgComponents/member/PointsIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPointsIcon = (props: SVGProps) => ;
+export default SvgPointsIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/Polygon14Icon.tsx b/src/assets/svgComponents/member/Polygon14Icon.tsx
new file mode 100644
index 0000000..ef0fc84
--- /dev/null
+++ b/src/assets/svgComponents/member/Polygon14Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgPolygon14Icon = (props: SVGProps) => ;
+export default SvgPolygon14Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ProfileIcon.tsx b/src/assets/svgComponents/member/ProfileIcon.tsx
new file mode 100644
index 0000000..26444f5
--- /dev/null
+++ b/src/assets/svgComponents/member/ProfileIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgProfileIcon = (props: SVGProps) => ;
+export default SvgProfileIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/QrIcon.tsx b/src/assets/svgComponents/member/QrIcon.tsx
new file mode 100644
index 0000000..b296ae8
--- /dev/null
+++ b/src/assets/svgComponents/member/QrIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgQrIcon = (props: SVGProps) => ;
+export default SvgQrIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/RefreshCwIcon.tsx b/src/assets/svgComponents/member/RefreshCwIcon.tsx
new file mode 100644
index 0000000..3729575
--- /dev/null
+++ b/src/assets/svgComponents/member/RefreshCwIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgRefreshCwIcon = (props: SVGProps) => ;
+export default SvgRefreshCwIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/RewardPointIcon.tsx b/src/assets/svgComponents/member/RewardPointIcon.tsx
new file mode 100644
index 0000000..8c98009
--- /dev/null
+++ b/src/assets/svgComponents/member/RewardPointIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgRewardPointIcon = (props: SVGProps) => ;
+export default SvgRewardPointIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/ScheduleIcon.tsx b/src/assets/svgComponents/member/ScheduleIcon.tsx
new file mode 100644
index 0000000..046a3a4
--- /dev/null
+++ b/src/assets/svgComponents/member/ScheduleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgScheduleIcon = (props: SVGProps) => ;
+export default SvgScheduleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/SearchIcon.tsx b/src/assets/svgComponents/member/SearchIcon.tsx
new file mode 100644
index 0000000..fb2c626
--- /dev/null
+++ b/src/assets/svgComponents/member/SearchIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSearchIcon = (props: SVGProps) => ;
+export default SvgSearchIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/SessionNoticeBlueIcon.tsx b/src/assets/svgComponents/member/SessionNoticeBlueIcon.tsx
new file mode 100644
index 0000000..c5a20f1
--- /dev/null
+++ b/src/assets/svgComponents/member/SessionNoticeBlueIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSessionNoticeBlueIcon = (props: SVGProps) => ;
+export default SvgSessionNoticeBlueIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/SettingIcon.tsx b/src/assets/svgComponents/member/SettingIcon.tsx
new file mode 100644
index 0000000..6df698e
--- /dev/null
+++ b/src/assets/svgComponents/member/SettingIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgSettingIcon = (props: SVGProps) => ;
+export default SvgSettingIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/UploadCloudIcon.tsx b/src/assets/svgComponents/member/UploadCloudIcon.tsx
new file mode 100644
index 0000000..1685910
--- /dev/null
+++ b/src/assets/svgComponents/member/UploadCloudIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgUploadCloudIcon = (props: SVGProps) => ;
+export default SvgUploadCloudIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/WhiteXIcon.tsx b/src/assets/svgComponents/member/WhiteXIcon.tsx
new file mode 100644
index 0000000..58fb84f
--- /dev/null
+++ b/src/assets/svgComponents/member/WhiteXIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgWhiteXIcon = (props: SVGProps) => ;
+export default SvgWhiteXIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/XCircleIcon.tsx b/src/assets/svgComponents/member/XCircleIcon.tsx
new file mode 100644
index 0000000..2810f98
--- /dev/null
+++ b/src/assets/svgComponents/member/XCircleIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgXCircleIcon = (props: SVGProps) => ;
+export default SvgXCircleIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/XGray300Icon.tsx b/src/assets/svgComponents/member/XGray300Icon.tsx
new file mode 100644
index 0000000..0472457
--- /dev/null
+++ b/src/assets/svgComponents/member/XGray300Icon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgXGray300Icon = (props: SVGProps) => ;
+export default SvgXGray300Icon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/XIcon.tsx b/src/assets/svgComponents/member/XIcon.tsx
new file mode 100644
index 0000000..22f0e73
--- /dev/null
+++ b/src/assets/svgComponents/member/XIcon.tsx
@@ -0,0 +1,4 @@
+import * as React from "react";
+import type { SVGProps } from "react";
+const SvgXIcon = (props: SVGProps) => ;
+export default SvgXIcon;
\ No newline at end of file
diff --git a/src/assets/svgComponents/member/index.ts b/src/assets/svgComponents/member/index.ts
new file mode 100644
index 0000000..68df46e
--- /dev/null
+++ b/src/assets/svgComponents/member/index.ts
@@ -0,0 +1,49 @@
+export { default as QrIcon } from './QrIcon'
+export { default as AbsenceNoteIcon } from './AbsenceNoteIcon'
+export { default as AkarIconsCircleCheckFillIcon } from './AkarIconsCircleCheckFillIcon'
+export { default as AlertErrorIcon } from './AlertErrorIcon'
+export { default as AlertInfoIcon } from './AlertInfoIcon'
+export { default as AlertSuccessIcon } from './AlertSuccessIcon'
+export { default as AppleLogoIcon } from './AppleLogoIcon'
+export { default as ArrowRotateLeftIcon } from './ArrowRotateLeftIcon'
+export { default as BarIcon } from './BarIcon'
+export { default as BlueHomeLogoIcon } from './BlueHomeLogoIcon'
+export { default as CalendarIcon } from './CalendarIcon'
+export { default as CameraIcon } from './CameraIcon'
+export { default as CancelIcon } from './CancelIcon'
+export { default as ChevronDownIcon } from './ChevronDownIcon'
+export { default as ChevronLeftBlackIcon } from './ChevronLeftBlackIcon'
+export { default as ChevronRightGray600Icon } from './ChevronRightGray600Icon'
+export { default as ChevronRightPrimary500Icon } from './ChevronRightPrimary500Icon'
+export { default as ChevronUpIcon } from './ChevronUpIcon'
+export { default as DangerIcon } from './DangerIcon'
+export { default as Error404Icon } from './Error404Icon'
+export { default as FeedbackBannerProfileIcon } from './FeedbackBannerProfileIcon'
+export { default as FillCheckIcon } from './FillCheckIcon'
+export { default as GrayPaperclipIcon } from './GrayPaperclipIcon'
+export { default as HelpCircleIcon } from './HelpCircleIcon'
+export { default as HomeCalendarIcon } from './HomeCalendarIcon'
+export { default as HomeLogo } from './HomeLogo'
+export { default as ImageUploaderIcon } from './ImageUploaderIcon'
+export { default as KakaoLogoIcon } from './KakaoLogoIcon'
+export { default as LogOutIcon } from './LogOutIcon'
+export { default as NoticeIcon } from './NoticeIcon'
+export { default as NotificationIcon } from './NotificationIcon'
+export { default as PaperclipIcon } from './PaperclipIcon'
+export { default as PenaltyPointIcon } from './PenaltyPointIcon'
+export { default as PlayIcon } from './PlayIcon'
+export { default as PlusCircleIcon } from './PlusCircleIcon'
+export { default as PointsIcon } from './PointsIcon'
+export { default as Polygon14Icon } from './Polygon14Icon'
+export { default as ProfileIcon } from './ProfileIcon'
+export { default as RefreshCwIcon } from './RefreshCwIcon'
+export { default as RewardPointIcon } from './RewardPointIcon'
+export { default as ScheduleIcon } from './ScheduleIcon'
+export { default as SearchIcon } from './SearchIcon'
+export { default as SessionNoticeBlueIcon } from './SessionNoticeBlueIcon'
+export { default as SettingIcon } from './SettingIcon'
+export { default as UploadCloudIcon } from './UploadCloudIcon'
+export { default as WhiteXIcon } from './WhiteXIcon'
+export { default as XCircleIcon } from './XCircleIcon'
+export { default as XGray300Icon } from './XGray300Icon'
+export { default as XIcon } from './XIcon'
\ No newline at end of file
diff --git a/src/components/common/GATracker.tsx b/src/components/common/GATracker.tsx
new file mode 100644
index 0000000..64afd77
--- /dev/null
+++ b/src/components/common/GATracker.tsx
@@ -0,0 +1,63 @@
+'use client'
+
+import { useEffect } from 'react'
+import { usePathname } from 'next/navigation'
+
+const GA_ID = process.env.NEXT_PUBLIC_GA_ID
+
+declare global {
+ interface Window {
+ gtag: (...args: any[]) => void
+ }
+}
+
+export default function GATracker() {
+ const pathname = usePathname()
+
+ useEffect(() => {
+ // 페이지 변경 시 GA에 페이지뷰 전송
+ if (typeof window.gtag === 'function') {
+ window.gtag('config', GA_ID, {
+ page_path: pathname,
+ })
+ }
+
+ // 🧭 스크롤 추적용 코드
+ let maxScrollRatio = 0
+ let ticking = false
+
+ const onScroll = () => {
+ if (!ticking) {
+ window.requestAnimationFrame(() => {
+ const scrollTop = window.scrollY
+ const totalHeight = document.body.scrollHeight - window.innerHeight
+ const currentRatio = scrollTop / totalHeight
+
+ if (currentRatio > maxScrollRatio) {
+ maxScrollRatio = currentRatio
+
+ if (typeof window.gtag === 'function') {
+ window.gtag('event', 'max_scroll_ratio', {
+ event_category: 'Scroll',
+ event_label: 'Max Scroll Ratio',
+ value: Math.floor(maxScrollRatio * 100), // 예: 34%
+ })
+ }
+ }
+
+ ticking = false
+ })
+
+ ticking = true
+ }
+ }
+
+ window.addEventListener('scroll', onScroll)
+
+ return () => {
+ window.removeEventListener('scroll', onScroll)
+ }
+ }, [pathname])
+
+ return null
+}
diff --git a/src/components/common/Login.tsx b/src/components/common/Login.tsx
new file mode 100644
index 0000000..6a33da1
--- /dev/null
+++ b/src/components/common/Login.tsx
@@ -0,0 +1,50 @@
+import Link from 'next/link'
+
+import { LogoIcon } from '@/assets/svgComponents/manager'
+import { AppleLogoIcon, HomeLogo, KakaoLogoIcon } from '@/assets/svgComponents/member'
+
+export default function Login() {
+ const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI}&response_type=code`
+ const appleAuthUrl = `https://appleid.apple.com/auth/authorize?response_type=code&client_id=${process.env.NEXT_PUBLIC_APPLE_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_APPLE_REDIRECT_URI}&response_mode=form_post&scope=name%20email`
+
+ return (
+
+
+
+
+
+
+
+ 큐시즘 출석 서비스
+ KU-CHECK
+
+
+
+
+
+
+ 카카오 로그인
+
+
+
+ Apple로 계속하기
+
+
+
+ 큐시즘 학회원들을 위한 서비스 입니다.
+
+
+
+
+
+ )
+}
diff --git a/src/components/common/MobileDebugPanel.tsx b/src/components/common/MobileDebugPanel.tsx
new file mode 100644
index 0000000..84a94f7
--- /dev/null
+++ b/src/components/common/MobileDebugPanel.tsx
@@ -0,0 +1,113 @@
+// components/common/MobileDebugPanel.tsx
+'use client'
+
+import { useState } from 'react'
+import { DebugLog, useDebugStore } from '@/store/member/debugStore'
+
+export default function MobileDebugPanel() {
+ const { logs, isDebugOpen, toggleDebug, clearLogs } = useDebugStore()
+ const [autoScroll, setAutoScroll] = useState(true)
+
+ if (!isDebugOpen) {
+ return (
+
+ 🐛 {logs.filter((l) => l.type === 'error').length}
+
+ )
+ }
+
+ const errorCount = logs.filter((l) => l.type === 'error').length
+
+ return (
+
+ {/* 헤더 */}
+
+
+ 🐛 디버그 패널
+ 에러 {errorCount}
+
+
+
+ setAutoScroll(e.target.checked)}
+ className="w-3 h-3"
+ />
+ Auto Scroll
+
+
+ Clear
+
+
+ 닫기
+
+
+
+
+ {/* 로그 목록 */}
+
+ {logs.length === 0 ? (
+
로그 없음
+ ) : (
+ logs.map((log) => (
+
+ ))
+ )}
+
+
+ )
+}
+
+function LogItem({ log }: { log: DebugLog }) {
+ const [expanded, setExpanded] = useState(false)
+
+ const typeColors = {
+ error: 'text-red-400',
+ warn: 'text-yellow-400',
+ info: 'text-blue-400',
+ log: 'text-gray-400',
+ }
+
+ const typeIcons = {
+ error: '❌',
+ warn: '⚠️',
+ info: 'ℹ️',
+ log: '📝',
+ }
+
+ const time = new Date(log.timestamp).toLocaleTimeString()
+
+ // ✅ details를 문자열로 변환
+ const detailsText = typeof log.details === 'string' ? log.details : log.details ? JSON.stringify(log.details, null, 2) : undefined
+
+ return (
+
+
setExpanded(!expanded)}
+ className={`w-full text-left ${typeColors[log.type]} hover:bg-gray-800 px-2 py-1 rounded`}
+ >
+ {typeIcons[log.type]}
+ [{time}]
+ {log.message}
+ {detailsText && ▼ }
+
+
+ {expanded && detailsText && (
+
+ {detailsText}
+
+ )}
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/ImageUploader.tsx b/src/components/common/sign-up/manager/ImageUploader.tsx
new file mode 100644
index 0000000..a9272ce
--- /dev/null
+++ b/src/components/common/sign-up/manager/ImageUploader.tsx
@@ -0,0 +1,116 @@
+import { UploadCloudIcon, XGray300Icon, XIcon } from '@/assets/svgComponents/member'
+import { useCallback, useEffect, useRef, useState } from 'react'
+import { useSignUpStore } from '@/store/signUpStore'
+import { useFileUpload } from '@/hooks/useFileUpload'
+import { useToast } from '@/components/member/common/toast/ToastContext'
+import { usePathname, useRouter } from 'next/navigation'
+import { extractFileExtension, formatFileSize, generateId } from '@/utils/upload'
+import { getMembersProfileImageUrl } from '@/lib/member/common'
+import Image from 'next/image'
+
+export default function ImageUploader() {
+ const fileRef = useRef(null)
+ const file = useSignUpStore((state) => state.file)
+ const setFile = useSignUpStore((state) => state.setFile)
+
+ const { error } = useToast()
+
+
+ useEffect(() => {
+ return () => {
+ setFile(undefined)
+ }
+ }, [])
+
+ const handleFileChange = (e: React.ChangeEvent) => {
+ const selectedFile = e.currentTarget.files?.[0]
+
+ if (!selectedFile) return
+
+ if (!selectedFile.type.startsWith('image/')) {
+ error('이미지 파일만 선택 가능합니다')
+ return
+ }
+
+ if (selectedFile.size > 10 * 1024 * 1024) {
+ error('파일 크기가 10MB를 초과합니다')
+ return
+ }
+
+ const reader = new FileReader()
+ reader.onloadend = () => {
+ const fileInfo = {
+ id: generateId(),
+ name: selectedFile.name,
+ size: selectedFile.size,
+ url: reader.result as string,
+ file: selectedFile,
+ }
+ setFile(fileInfo)
+ }
+ reader.readAsDataURL(selectedFile)
+ }
+
+ const handleRemoveImage = () => {
+ setFile(undefined)
+ // 파일 input 초기화
+ if (fileRef.current) {
+ fileRef.current.value = ''
+ }
+ }
+
+ const profileImageSrc = typeof file?.url === 'string' ? file.url : ''
+
+ return (
+
+
+
+ {/* 업로드 영역 */}
+
fileRef.current?.click()}
+ className="flex cursor-pointer flex-col items-center justify-center gap-y-[10px] border border-dashed border-gray-300 rounded-[12px] h-[124px] transition-colors hover:bg-gray-50"
+ >
+
+
+
+ 10MB 이하의 이미지만 업로드 가능합니다
+
+
+ {/* 이미지 미리보기 */}
+ {profileImageSrc && (
+
+
+
+
+
+
+ {profileImageSrc && (
+
+ )}
+
+
{file?.name}
+
+
{formatFileSize(file?.size)}
+
+ )}
+
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/MajorField.tsx b/src/components/common/sign-up/manager/MajorField.tsx
new file mode 100644
index 0000000..ea5f70c
--- /dev/null
+++ b/src/components/common/sign-up/manager/MajorField.tsx
@@ -0,0 +1,23 @@
+import ManagerInput from '@/components/manager/common/ManagerInput'
+import { useSignUpStore } from '@/store/signUpStore'
+
+export default function MajorField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+ /**
+ * 전공 변경 event handler
+ */
+ const handleMajorChange = (e: React.ChangeEvent) => {
+ updateSignUpData({ major: e.target.value })
+ }
+
+ return (
+
+
+ 학과를 입력해주세요
+ 복수 전공이 있다면 함께 작성해 주세요 ex. 큐시즘학과/큐밀리학과
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/ManagerSignUp.tsx b/src/components/common/sign-up/manager/ManagerSignUp.tsx
new file mode 100644
index 0000000..ce1a975
--- /dev/null
+++ b/src/components/common/sign-up/manager/ManagerSignUp.tsx
@@ -0,0 +1,32 @@
+import NameField from '@/components/common/sign-up/manager/NameField'
+import PhoneNumberField from '@/components/common/sign-up/manager/PhoneNumberField'
+import SchoolField from '@/components/common/sign-up/manager/SchoolField'
+import MajorField from '@/components/common/sign-up/manager/MajorField'
+import PartField from '@/components/common/sign-up/manager/PartField'
+import ProfileImageUploadField from '@/components/common/sign-up/manager/ProfileImageUploadField'
+import { useEffect } from 'react'
+import { useSignUpStore } from '@/store/signUpStore'
+
+export default function ManagerSignUp() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+
+ useEffect(() => {
+ console.log('signUpData', signUpData)
+ }, [signUpData])
+
+ return (
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/NameField.tsx b/src/components/common/sign-up/manager/NameField.tsx
new file mode 100644
index 0000000..f3bd23c
--- /dev/null
+++ b/src/components/common/sign-up/manager/NameField.tsx
@@ -0,0 +1,33 @@
+import ManagerInput from '@/components/manager/common/ManagerInput'
+import { useSignUpStore } from '@/store/signUpStore'
+import { useCallback } from 'react'
+
+export default function NameField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ /**
+ * 이름 변경 event handler
+ * ✅ 올바른 store 업데이트
+ */
+ const handleNameChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const newName = e.target.value
+
+ // ✅ updateSignUpData로 올바르게 업데이트
+ updateSignUpData({ name: newName })
+ },
+ [updateSignUpData]
+ )
+
+
+ return (
+
+
+ 이름을 입력해주세요
+ 성까지 포함한 이름을 입력해 주세요
+
+
handleNameChange(e)} inputBoxStyle={'default'} placeholder={'이름'} type={'text'} />
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/PartField.tsx b/src/components/common/sign-up/manager/PartField.tsx
new file mode 100644
index 0000000..aefcd70
--- /dev/null
+++ b/src/components/common/sign-up/manager/PartField.tsx
@@ -0,0 +1,32 @@
+import { useSignUpStore } from '@/store/signUpStore'
+import { PartType } from '@/types/sign-up'
+
+export default function PartField() {
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const partList: { partName: string; partEnum: PartType }[] = [
+ { partName: '기획', partEnum: 'PLANNING' },
+ { partName: '디자인', partEnum: 'DESIGN' },
+ { partName: '프론트엔드', partEnum: 'FRONTEND' },
+ { partName: '백엔드', partEnum: 'BACKEND' },
+ ]
+
+ /**
+ * 파트 변경 event handler
+ */
+ const handlePartChange = (partEnum: PartType) => {
+ updateSignUpData({ part: signUpData?.part === partEnum ? undefined : partEnum })
+ }
+
+ return (
+
+ 파트를 선택해 주세요
+
+ {partList.map((part) => (
+
+ handlePartChange(part.partEnum)} type='button' className={`${signUpData?.part === part.partEnum ? "border-primary-500 bg-primary-50" : ' border-gray-200 bg-background1'} body-lg-regular py-3 px-6 rounded-[8px] border`}>{part.partName}
+ ))}
+
+
+)
+}
diff --git a/src/components/common/sign-up/manager/PhoneNumberField.tsx b/src/components/common/sign-up/manager/PhoneNumberField.tsx
new file mode 100644
index 0000000..8ab38d8
--- /dev/null
+++ b/src/components/common/sign-up/manager/PhoneNumberField.tsx
@@ -0,0 +1,23 @@
+import ManagerInput from '@/components/manager/common/ManagerInput'
+import { useSignUpStore } from '@/store/signUpStore'
+import { formatPhoneNumber } from '@/utils/common'
+
+export default function PhoneNumberField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ /**
+ * 휴대폰 번호 변경 event handler
+ */
+ const handlePhoneNumberChange = (e: React.ChangeEvent) => {
+ const formatted = formatPhoneNumber(e.target.value)
+ updateSignUpData({ phoneNumber: formatted })
+ }
+
+ return (
+
+ 휴대폰 번호를 입력해 주세요
+ handlePhoneNumberChange(e)} value={signUpData?.phoneNumber ?? ''} inputBoxStyle={'default'} placeholder={'휴대폰 번호'} type={'text'} />
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/ProfileImageUploadField.tsx b/src/components/common/sign-up/manager/ProfileImageUploadField.tsx
new file mode 100644
index 0000000..3fa6fcc
--- /dev/null
+++ b/src/components/common/sign-up/manager/ProfileImageUploadField.tsx
@@ -0,0 +1,112 @@
+import ImageUploader from '@/components/common/sign-up/manager/ImageUploader'
+import { useSignUpStore } from '@/store/signUpStore'
+import { extractFileExtension } from '@/utils/upload'
+import { getMembersProfileImageUrl } from '@/lib/member/common'
+import { useFileUpload } from '@/hooks/useFileUpload'
+import { useToast } from '@/components/member/common/toast/ToastContext'
+import { postMembersOnboarding } from '@/lib/common'
+import { usePathname, useRouter } from 'next/navigation'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+
+export default function ProfileImageUploadField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const file = useSignUpStore((state) => state.file)
+ const { uploadFile } = useFileUpload()
+ const setFile = useSignUpStore((state) => state.setFile)
+ const { error } = useToast()
+ const router = useRouter()
+ const pathname = usePathname()
+
+ const handleStepClick = (step: StepType) => {
+ // URL 업데이트 → 서버 컴포넌트 재렌더링
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ }
+ // ✅ 모든 필드가 채워졌는지 확인하는 함수
+ const isFormComplete = () => {
+ return (
+ signUpData?.name?.trim() &&
+ signUpData?.school?.trim() &&
+ signUpData?.major?.trim() &&
+ signUpData?.part &&
+ signUpData?.phoneNumber?.trim()
+ )
+ }
+
+ const isComplete = isFormComplete()
+
+
+ const handleSubmit = async () => {
+ if (!isFormComplete()) {
+ return
+ }
+ if (!file?.url) {
+ error('업로드할 파일을 선택해주세요')
+ return
+ }
+
+ try {
+ const response = await postMembersOnboarding(signUpData)
+ if (response.success) {
+ const extension = extractFileExtension(file.name)
+ const presignedResponse = await getMembersProfileImageUrl(`profileImageUrl.${extension}`)
+
+ if (presignedResponse.error) {
+ error(`${presignedResponse.error}`)
+ }
+
+ if (!presignedResponse.success || !presignedResponse.data?.data?.newUrl) {
+ throw new Error('프리사인드 URL 요청 실패')
+ }
+
+ const uploadResult = await uploadFile(file, {
+ preSignedUrl: presignedResponse.data.data.newUrl,
+ })
+
+ if (!uploadResult.success) {
+ throw new Error('파일 업로드 실패')
+ }
+
+ console.log('✅ 큐픽 신청서 서류 이미지 업로드 성공:', uploadResult)
+ if (uploadResult.success) {
+ handleStepClick('7')
+ setFile(undefined)
+ } else if (uploadResult.error) {
+ error(`${uploadResult.error}`)
+ }
+ } else if (response.error) {
+ error(`${response.error}`)
+ }
+ } catch (error) {
+ console.error('❌ 업로드 중 오류:', error)
+ }
+ }
+
+
+ return (
+
+
+
+ 사진을 업로드해 주세요
+
+ 얼굴은 잘 보이는 사진을 등록해 주세요. 출석 시 본인 확인 용도로만 사용돼요
+
+
+
+
+
+
+ 완료
+
+
+ )
+}
diff --git a/src/components/common/sign-up/manager/SchoolField.tsx b/src/components/common/sign-up/manager/SchoolField.tsx
new file mode 100644
index 0000000..324acee
--- /dev/null
+++ b/src/components/common/sign-up/manager/SchoolField.tsx
@@ -0,0 +1,67 @@
+import ManagerInput from '@/components/manager/common/ManagerInput'
+import { useSignUpStore } from '@/store/signUpStore'
+import { useCallback, useMemo, useState } from 'react'
+import { universityList } from '@/utils/sign-up'
+
+export default function SchoolField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+ const [isDropdownOpen, setIsDropdownOpen] = useState(false)
+
+ // 검색 결과 필터링 (useMemo로 최적화)
+ const filteredUniversities = useMemo(() => {
+ const searchTerm = signUpData?.school ?? ''
+ if (!searchTerm.trim()) return []
+
+ return universityList.filter((university) => university.toLowerCase().includes(searchTerm.toLowerCase()))
+ }, [signUpData?.school])
+
+ const handleSchoolChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const value = e.target.value
+ updateSignUpData({ school: value })
+ setIsDropdownOpen(true)
+ },
+ [signUpData, updateSignUpData]
+ )
+ // 대학교 선택 시
+ const handleUniversitySelect = useCallback(
+ (university: string) => {
+ updateSignUpData({ school: university })
+
+ setIsDropdownOpen(false)
+ },
+ [signUpData, updateSignUpData]
+ )
+
+ return (
+
+ 재학 중인 학교를 알려주세요
+
+
+ {isDropdownOpen && (signUpData?.school ?? '').trim().length > 0 && (
+
+ {filteredUniversities.length > 0 ? (
+ <>
+ {filteredUniversities.map((university) => (
+
handleUniversitySelect(university)}
+ className="w-full border-b border-gray-100 px-4 py-2.5 text-left transition-colors duration-150 last:border-b-0 hover:bg-gray-50"
+ type="button"
+ >
+ {university}
+
+ ))}
+
총 {filteredUniversities.length}개
+ >
+ ) : (
+
검색 결과가 없습니다.
+ )}
+
+ )}
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/ImageUploader.tsx b/src/components/common/sign-up/member/ImageUploader.tsx
new file mode 100644
index 0000000..035a369
--- /dev/null
+++ b/src/components/common/sign-up/member/ImageUploader.tsx
@@ -0,0 +1,271 @@
+'use client'
+
+import Image from 'next/image'
+import { useCallback, useEffect, useRef, useState } from 'react'
+
+import MemberButton from '@/components/member/common/MemberButton'
+import { usePathname, useRouter } from 'next/navigation'
+import { ImageUploaderIcon } from '@/assets/svgComponents/member'
+import { extractFileExtension, generateId } from '@/utils/upload'
+import { useSignUpStore } from '@/store/signUpStore'
+import { useFileUpload } from '@/hooks/useFileUpload'
+import { getMembersProfileImageUrl } from '@/lib/member/common'
+import { useToast } from '@/components/member/common/toast/ToastContext'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function ImageUploader() {
+ const fileRef = useRef(null)
+ const file = useSignUpStore((state) => state.file)
+ const setFile = useSignUpStore((state) => state.setFile)
+ const [isImageError, setIsImageError] = useState(false)
+ const [isLoading, setIsLoading] = useState(false)
+ const [localPreviewUrl, setLocalPreviewUrl] = useState('')
+
+ const { uploadFile } = useFileUpload()
+ const { error } = useToast()
+
+ const router = useRouter()
+ const pathname = usePathname()
+
+ useEffect(() => {
+ return () => {
+ setFile(undefined)
+ }
+ }, [setFile])
+
+ const handleStepClick = useCallback(
+ (step: StepType) => {
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ },
+ [pathname, router]
+ )
+
+ /**
+ * HEIC를 JPEG으로 변환
+ */
+ const convertHeicToJpeg = async (file: File): Promise => {
+ try {
+ // 클라이언트에서만 동적으로 import
+ const heic2any = (await import('heic2any')).default
+
+ const convertedBlob = await heic2any({
+ blob: file,
+ toType: 'image/jpeg',
+ quality: 0.9,
+ })
+
+ const convertedFile = new File(
+ [convertedBlob as Blob],
+ file.name.replace(/\.heic$/i, '.jpg'),
+ { type: 'image/jpeg' }
+ )
+
+ return convertedFile
+ } catch (err) {
+ console.error('HEIC 변환 실패:', err)
+ throw new Error('HEIC 파일 변환에 실패했습니다')
+ }
+ }
+
+ const handleFileChange = async (e: React.ChangeEvent) => {
+ let selectedFile = e.currentTarget.files?.[0]
+
+ if (!selectedFile) return
+
+ try {
+ // HEIC 파일 변환 처리
+ if (
+ selectedFile.type === 'image/heic' ||
+ selectedFile.type === 'image/heif' ||
+ selectedFile.name.toLowerCase().endsWith('.heic')
+ ) {
+ selectedFile = await convertHeicToJpeg(selectedFile)
+ }
+
+ // 변환 후 타입 가드
+ if (!selectedFile) {
+ error('파일 처리에 실패했습니다')
+ return
+ }
+
+ // 이미지 파일 검증
+ if (!selectedFile.type.startsWith('image/')) {
+ error('이미지 파일만 선택 가능합니다')
+ return
+ }
+
+ // 파일 크기 검증 (10MB)
+ if (selectedFile.size > 10 * 1024 * 1024) {
+ error('파일 크기가 10MB를 초과합니다')
+ return
+ }
+
+ const reader = new FileReader()
+ reader.onload = () => {
+ const result = reader.result as string
+
+ if (!result) {
+ error('파일 읽기에 실패했습니다')
+ return
+ }
+
+ // 로컬 미리보기 설정
+ setLocalPreviewUrl(result)
+ setIsImageError(false)
+
+ const fileInfo = {
+ id: generateId(),
+ name: selectedFile!.name,
+ size: selectedFile!.size,
+ url: result,
+ file: selectedFile,
+ }
+
+ setFile(fileInfo)
+ }
+
+ reader.onerror = () => {
+ error('파일을 읽을 수 없습니다')
+ }
+
+ reader.readAsDataURL(selectedFile)
+ } catch (err) {
+ error((err as Error).message)
+ if (fileRef.current) {
+ fileRef.current.value = ''
+ }
+ }
+ }
+
+ const handleSubmit = async () => {
+ if (!file?.url) {
+ error('업로드할 파일을 선택해주세요')
+ return
+ }
+
+ try {
+ setIsLoading(true)
+ const extension = extractFileExtension(file.name)
+ const presignedResponse = await getMembersProfileImageUrl(`profileImageUrl.${extension}`)
+
+ if (presignedResponse.error) {
+ error(`${presignedResponse.error}`)
+ return
+ }
+
+ if (!presignedResponse.success || !presignedResponse.data?.data?.newUrl) {
+ throw new Error('프리사인드 URL 요청 실패')
+ }
+
+ const uploadResult = await uploadFile(file, {
+ preSignedUrl: presignedResponse.data.data.newUrl,
+ })
+
+ if (!uploadResult.success) {
+ if (uploadResult.error) {
+ error(`${uploadResult.error}`)
+ } else {
+ throw new Error('파일 업로드 실패')
+ }
+ return
+ }
+
+ console.log('✅ 프로필 이미지 업로드 성공:', uploadResult)
+ handleStepClick('7')
+ setFile(undefined)
+ setLocalPreviewUrl('')
+ } catch (err) {
+ console.error('❌ 업로드 중 오류:', err)
+ error('업로드 중 오류가 발생했습니다')
+ } finally {
+ setIsLoading(false)
+ }
+ }
+
+ // 미리보기 이미지 선택 로직
+ const showLocalPreview = localPreviewUrl && !isImageError
+ const profileImageSrc = showLocalPreview ? localPreviewUrl : file?.url || ''
+ const isValidImageUrl = profileImageSrc && typeof profileImageSrc === 'string'
+
+ return (
+
+
+
+ {/* 이미지 업로드 영역 */}
+
+
+ {isValidImageUrl && !isImageError ? (
+
+ {/* 로컬 미리보기 - img 태그 사용 */}
+ {showLocalPreview ? (
+
+ ) : (
+ // 저장된 이미지 - Next.js Image 사용
+
setIsImageError(true)}
+ src={profileImageSrc}
+ alt="프로필"
+ fill
+ className="h-full w-full rounded-[8px] object-cover"
+ priority
+ />
+ )}
+
+ ) : (
+
!isLoading && fileRef.current?.click()}
+ className="relative flex h-[232px] w-full cursor-pointer flex-col items-center justify-center rounded-[8px] border border-gray-200 bg-gray-100 transition-colors hover:bg-gray-200"
+ >
+ {isLoading ? (
+
+ ) : (
+ <>
+
+
이미지 업로드
+ >
+ )}
+
+ )}
+
+
+ {/* 다시 선택하기 버튼 */}
+ {isValidImageUrl && !isImageError && (
+
+ fileRef.current?.click()}
+ disabled={isLoading}
+ className="caption-sm-medium cursor-pointer rounded-[4px] bg-gray-400 px-[10px] py-[6px] text-white transition-colors hover:bg-gray-500 disabled:opacity-50"
+ >
+ 다시 선택하기
+
+
+ )}
+
+
+ {/* 저장하기 버튼 */}
+
+
+ {isLoading ? '업로드 중...' : '완료'}
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/MajorField.tsx b/src/components/common/sign-up/member/MajorField.tsx
new file mode 100644
index 0000000..bbe9ee4
--- /dev/null
+++ b/src/components/common/sign-up/member/MajorField.tsx
@@ -0,0 +1,77 @@
+'use client'
+import { usePathname, useRouter } from 'next/navigation'
+import MemberButton from '@/components/member/common/MemberButton'
+import MemberInput from '@/components/member/common/MemberInput'
+import { useSignUpStore } from '@/store/signUpStore'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function MajorField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ const router = useRouter()
+ const pathname = usePathname()
+
+ const handleStepClick = (step: StepType) => {
+ // URL 업데이트 → 서버 컴포넌트 재렌더링
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ }
+
+ /**
+ * 전공 변경 event handler
+ */
+ const handleMajorChange = (e: React.ChangeEvent) => {
+ updateSignUpData({ major: e.target.value })
+ }
+
+ /**
+ * Enter 키 입력 감지
+ */
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ // Enter 키이고 이름이 1자 이상일 때만 실행
+ if (e.key === 'Enter' && signUpData?.major && signUpData?.major?.length > 0) {
+ e.preventDefault()
+ handleStepClick('5')
+ }
+ }
+
+ return (
+
+ {/* input field */}
+
+ 학과를 알려주세요
+
+
+
+ 복수 전공이 있다면 함께 작성해 주세요
+ ex. 큐시즘학과/큐밀리학과
+
+
+
+
+ {/* bottom button */}
+
+ 0)}
+ styleStatus={signUpData?.major && signUpData?.major?.length > 0 ? 'default' : 'disabled'}
+ onClick={() => {
+ handleStepClick('5')
+ }}
+ >
+ 다음
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/NameField.tsx b/src/components/common/sign-up/member/NameField.tsx
new file mode 100644
index 0000000..2c64cfd
--- /dev/null
+++ b/src/components/common/sign-up/member/NameField.tsx
@@ -0,0 +1,125 @@
+'use client'
+
+import { usePathname, useRouter } from 'next/navigation'
+import MemberButton from '@/components/member/common/MemberButton'
+import { useSignUpStore } from '@/store/signUpStore'
+import MemberInput from '@/components/member/common/MemberInput'
+import { useState, useCallback, useMemo } from 'react'
+import { validateName } from '@/utils/sign-up'
+import ManagerSignUp from '@/components/common/sign-up/manager/ManagerSignUp'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function NameField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ const [error, setError] = useState(null)
+ const router = useRouter()
+ const pathname = usePathname()
+
+ const handleStepClick = useCallback(
+ (step: StepType) => {
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ },
+ [router, pathname]
+ )
+
+ /**
+ * 이름 변경 event handler
+ * ✅ 올바른 store 업데이트
+ */
+ const handleNameChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const newName = e.target.value
+
+ // ✅ updateSignUpData로 올바르게 업데이트
+ updateSignUpData({ name: newName })
+
+ // 실시간 검증
+ if (newName.length > 0) {
+ const validation = validateName(newName)
+ setError(validation.error || null)
+ } else {
+ setError(null)
+ }
+ },
+ [updateSignUpData]
+ )
+
+ /**
+ * Enter 키 입력 감지
+ */
+ const handleKeyDown = useCallback(
+ (e: React.KeyboardEvent) => {
+ if (e.key === 'Enter' && signUpData?.name && signUpData.name.length > 0) {
+ e.preventDefault()
+ handleStepClick('2')
+ }
+ },
+ [signUpData?.name, handleStepClick]
+ )
+
+ /**
+ * 다음 단계로 진행
+ */
+ const handleNextStep = useCallback(() => {
+ const name = signUpData?.name ?? ''
+ const validation = validateName(name)
+
+ if (!validation.isValid) {
+ setError(validation.error || '오류가 발생했습니다')
+ return
+ }
+
+ setError(null)
+ handleStepClick('2')
+ }, [signUpData?.name, handleStepClick])
+
+ // ✅ 버튼 활성화 상태 메모이제이션
+ const isButtonEnabled = useMemo(() => validateName(signUpData?.name).isValid, [signUpData?.name])
+
+ return (
+ <>
+
+
+
+
+
+ 이름을 입력해주세요
+
+
+ {error ? (
+
+ {error}
+
+ ) : (
+
성까지 포함한 이름을 입력해 주세요.
+ )}
+
+
+
+
+
+ >
+
+ )
+}
diff --git a/src/components/common/sign-up/member/PartField.tsx b/src/components/common/sign-up/member/PartField.tsx
new file mode 100644
index 0000000..51da0e0
--- /dev/null
+++ b/src/components/common/sign-up/member/PartField.tsx
@@ -0,0 +1,102 @@
+'use client'
+
+import { usePathname, useRouter } from 'next/navigation'
+import MemberButton from '@/components/member/common/MemberButton'
+import { PartType } from '@/types/sign-up'
+import { useSignUpStore } from '@/store/signUpStore'
+import { postMembersOnboarding } from '@/lib/common'
+import { useToast } from '@/components/member/common/toast/ToastContext'
+import { useNativeDeviceInfo } from '@/hooks/member/useNativeDeviceInfo'
+import { useNativeMessage } from '@/hooks/member/useNativeMessage'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function PartField() {
+ // const deviceInfo = useNativeMessage()
+
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+ const signUpData = useSignUpStore((state) => state.signUpData)
+
+ const router = useRouter()
+ const pathname = usePathname()
+
+ const { error } = useToast()
+
+ const handleStepClick = (step: StepType) => {
+ // URL 업데이트 → 서버 컴포넌트 재렌더링
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ }
+
+ const partList: { partName: string; partEnum: PartType }[] = [
+ { partName: '기획', partEnum: 'PLANNING' },
+ { partName: '디자인', partEnum: 'DESIGN' },
+ { partName: '프론트엔드', partEnum: 'FRONTEND' },
+ { partName: '백엔드', partEnum: 'BACKEND' },
+ ]
+
+ /**
+ * 파트 변경 event handler
+ */
+ const handlePartChange = (partEnum: PartType) => {
+ updateSignUpData({ part: signUpData?.part === partEnum ? undefined : partEnum })
+ }
+
+ /**
+ * 온보딩 제출
+ */
+ const handleSubmit = async () => {
+ // deviceId가 있으면 fcmToken 추가
+ const dataToSubmit = {
+ ...signUpData,
+ // ...(deviceInfo?.fcmToken && { fcmToken: deviceInfo.fcmToken }),
+ }
+
+ const response = await postMembersOnboarding(dataToSubmit)
+ if (response.success) {
+ // handleStepClick('7')
+
+ } else if (response.error) {
+ error(`${response.error}`)
+ }
+ }
+
+ return (
+
+ {/* input field */}
+
+ 파트를 선택해 주세요.
+
+ {partList.map((part) => {
+ return (
+
handlePartChange(part.partEnum)}
+ key={part.partEnum}
+ className={`${signUpData?.part === part.partEnum ? 'bg-primary-50 border-primary-500 border' : 'bg-background1 border border-gray-200'} flex w-full cursor-pointer items-center justify-center rounded-[12px] py-[60px]`}
+ >
+ {part.partName}
+
+ )
+ })}
+
+ {/*디바이스 장치: {deviceInfo?.deviceId}
*/}
+ {/*fcmToken: {deviceInfo?.fcmToken}
*/}
+ {/*platform: {deviceInfo?.platform}
*/}
+ {/*timestamp: {deviceInfo?.timestamp}
*/}
+
+
+ {/* bottom button */}
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/PhoneNumberField.tsx b/src/components/common/sign-up/member/PhoneNumberField.tsx
new file mode 100644
index 0000000..6b00adf
--- /dev/null
+++ b/src/components/common/sign-up/member/PhoneNumberField.tsx
@@ -0,0 +1,93 @@
+'use client'
+
+import { usePathname, useRouter } from 'next/navigation'
+import MemberButton from '@/components/member/common/MemberButton'
+import MemberInput from '@/components/member/common/MemberInput'
+import { useSignUpStore } from '@/store/signUpStore'
+import { formatPhoneNumber } from '@/utils/common'
+import { getPhoneNumberErrorMessage, isValidPhoneNumber } from '@/utils/sign-up'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function PhoneNumberField() {
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ const router = useRouter()
+ const pathname = usePathname()
+
+ const handleStepClick = (step: StepType) => {
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ }
+
+ /**
+ * 휴대폰 번호 변경 event handler
+ */
+ const handlePhoneNumberChange = (e: React.ChangeEvent) => {
+ const formatted = formatPhoneNumber(e.target.value)
+ updateSignUpData({ phoneNumber: formatted })
+ }
+
+ /**
+ * Enter 키 입력 감지
+ */
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ // Enter 키이고 유효한 휴대폰 번호일 때만 실행
+ if (e.key === 'Enter' && isValidPhoneNumber(signUpData?.phoneNumber)) {
+ e.preventDefault()
+ handleStepClick('3')
+ }
+ }
+
+ /**
+ * 다음 버튼 클릭 handler
+ */
+ const handleNextClick = () => {
+ // 유효한 번호인지 한 번 더 확인
+ if (isValidPhoneNumber(signUpData?.phoneNumber)) {
+ handleStepClick('3')
+ }
+ }
+
+ const errorMessage = getPhoneNumberErrorMessage(signUpData?.phoneNumber)
+ const isError = errorMessage !== null
+ const isValid = isValidPhoneNumber(signUpData?.phoneNumber)
+
+ return (
+
+
+ 휴대폰 번호를 입력해 주세요
+
+
+
+
+ {isError && signUpData?.phoneNumber && (
+
+ {errorMessage}
+
+ )}
+
+
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/SchoolField.tsx b/src/components/common/sign-up/member/SchoolField.tsx
new file mode 100644
index 0000000..76d4c34
--- /dev/null
+++ b/src/components/common/sign-up/member/SchoolField.tsx
@@ -0,0 +1,125 @@
+'use client'
+
+import { usePathname, useRouter } from 'next/navigation'
+import { useState, useCallback, useMemo } from 'react'
+import MemberButton from '@/components/member/common/MemberButton'
+import { useSignUpStore } from '@/store/signUpStore'
+import MemberInput from '@/components/member/common/MemberInput'
+import { universityList } from '@/utils/sign-up'
+
+type StepType = '1' | '2' | '3' | '4' | '5' | '6' | '7'
+
+export default function SchoolField() {
+ const router = useRouter()
+ const pathname = usePathname()
+ const [isDropdownOpen, setIsDropdownOpen] = useState(false)
+
+ const signUpData = useSignUpStore((state) => state.signUpData)
+ const updateSignUpData = useSignUpStore((state) => state.updateSignUpData)
+
+ // 검색 결과 필터링 (useMemo로 최적화)
+ const filteredUniversities = useMemo(() => {
+ const searchTerm = signUpData?.school ?? ''
+ if (!searchTerm.trim()) return []
+
+ return universityList.filter((university) => university.toLowerCase().includes(searchTerm.toLowerCase()))
+ }, [signUpData?.school])
+
+ const handleStepClick = useCallback(
+ (step: StepType) => {
+ router.push(`${pathname}?step=${encodeURIComponent(step)}`)
+ },
+ [pathname, router]
+ )
+
+ const handleSchoolChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const value = e.target.value
+ updateSignUpData({ school: value })
+ setIsDropdownOpen(true)
+ },
+ [signUpData, updateSignUpData]
+ )
+
+ // 대학교 선택 시
+ const handleUniversitySelect = useCallback(
+ (university: string) => {
+ updateSignUpData({ school: university })
+
+ setIsDropdownOpen(false)
+ },
+ [signUpData, updateSignUpData]
+ )
+
+ const handleNext = useCallback(() => {
+ handleStepClick('4')
+ }, [handleStepClick])
+
+ /**
+ * Enter 키 입력 감지
+ */
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ // Enter 키이고 이름이 1자 이상일 때만 실행
+ if (e.key === 'Enter' && signUpData?.school) {
+ e.preventDefault()
+ handleStepClick('4')
+ }
+ }
+
+ return (
+
+
+ 대학교를 입력해 주세요.
+
+ {/* 검색 입력 컨테이너 */}
+
+
setIsDropdownOpen(true)}
+ />
+
+ {/* 드롭다운 */}
+ {isDropdownOpen && (signUpData?.school ?? '').trim().length > 0 && (
+
+ {filteredUniversities.length > 0 ? (
+ <>
+ {filteredUniversities.map((university) => (
+
handleUniversitySelect(university)}
+ className="w-full border-b border-gray-100 px-4 py-2.5 text-left transition-colors duration-150 last:border-b-0 hover:bg-gray-50"
+ type="button"
+ >
+ {university}
+
+ ))}
+
총 {filteredUniversities.length}개
+ >
+ ) : (
+
검색 결과가 없습니다.
+ )}
+
+ )}
+
+
+
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/SignUpDataSubmitModal.tsx b/src/components/common/sign-up/member/SignUpDataSubmitModal.tsx
new file mode 100644
index 0000000..4edaeb1
--- /dev/null
+++ b/src/components/common/sign-up/member/SignUpDataSubmitModal.tsx
@@ -0,0 +1,24 @@
+import { BlueHomeLogoIcon } from '@/assets/svgComponents/member'
+
+export default function SignUpDataSubmitModal() {
+ return (
+
+
+
+
+
승인 절차를 진행 중이에요
+
승인이 완료되면 바로 알려드릴게요!
+
+
+
+
+ 일주일 이상 승인되지 않을 시,
+
+ 경영총괄팀으로 문의해주세요
+
+
+ kusitms.management@gmail.com
+
+
+ )
+}
diff --git a/src/components/common/sign-up/member/SignUpHeaderContainer.tsx b/src/components/common/sign-up/member/SignUpHeaderContainer.tsx
new file mode 100644
index 0000000..b4aae06
--- /dev/null
+++ b/src/components/common/sign-up/member/SignUpHeaderContainer.tsx
@@ -0,0 +1,29 @@
+'use client'
+
+import { useSearchParams } from 'next/navigation'
+
+import MemberHeader from '@/components/member/common/MemberHeader'
+import SignUpStepIndicator from '@/components/common/sign-up/member/SignUpStepIndicator'
+import { LogoIcon } from '@/assets/svgComponents/manager'
+
+export default function SignUpHeaderContainer() {
+ const searchParams = useSearchParams()
+ const step = searchParams.get('step')
+
+ if (step === '7') {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/src/components/common/sign-up/member/SignUpStepIndicator.tsx b/src/components/common/sign-up/member/SignUpStepIndicator.tsx
new file mode 100644
index 0000000..3f8a2fe
--- /dev/null
+++ b/src/components/common/sign-up/member/SignUpStepIndicator.tsx
@@ -0,0 +1,10 @@
+'use client'
+
+import { useSearchParams } from 'next/navigation'
+
+export default function SignUpStepIndicator() {
+ const searchParams = useSearchParams()
+ const step = searchParams.get('step') || '1'
+
+ return step === '7' ?
: {step}/6
+}
diff --git a/src/components/common/sign-up/member/StudentCardUploadField.tsx b/src/components/common/sign-up/member/StudentCardUploadField.tsx
new file mode 100644
index 0000000..8a99050
--- /dev/null
+++ b/src/components/common/sign-up/member/StudentCardUploadField.tsx
@@ -0,0 +1,20 @@
+'use client'
+
+import ImageUploader from '@/components/common/sign-up/member/ImageUploader'
+
+export default function StudentCardUploadField() {
+ return (
+
+
+
+ 사진을 업로드 해주세요
+
+ 얼굴이 잘 보이는 사진을 등록해 주세요
+ 출석 시 본인 확인 용도로만 사용돼요
+
+
+
+
+
+ )
+}
diff --git a/src/components/manager/attendance/AbsenceDropdown.tsx b/src/components/manager/attendance/AbsenceDropdown.tsx
new file mode 100644
index 0000000..8e1907a
--- /dev/null
+++ b/src/components/manager/attendance/AbsenceDropdown.tsx
@@ -0,0 +1,113 @@
+'use client'
+
+import { useState } from 'react'
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'
+import clsx from 'clsx'
+
+interface AbsenceOption {
+ label: string
+ value: string
+ displayValue?: string
+}
+
+interface AbsenceDropdownProps {
+ options: AbsenceOption[]
+ selected?: string
+ onChange: (value: string) => void
+ placeholder?: string
+ rightIcon?: React.ReactNode
+ rightIconActive?: React.ReactNode
+ showValueInsteadOfLabel?: boolean
+ disabled?: boolean
+}
+
+const colorMap: Record = {
+ EXCUSED: { hover: 'hover:bg-[#FFE8E8]', active: 'bg-[#FFD0D0]' },
+ ABSENT_WITH_DOC: { hover: 'hover:bg-[#FFE8E8]', active: 'bg-[#FFD0D0]' },
+ ABSENT_WITH_CAUSE: { hover: 'hover:bg-[#FFE8E8]', active: 'bg-[#FFD0D0]' },
+ ABSENT: { hover: 'hover:bg-[#FFE8E8]', active: 'bg-[#FFD0D0]' },
+ LATE: { hover: 'hover:bg-[#FFF3D9]', active: 'bg-[#FBE6BA]' },
+ EARLY_LEAVE: { hover: 'hover:bg-[#F2F2F9]', active: 'bg-[#E5E5F4]' },
+}
+
+export default function AbsenceDropdown({
+ options,
+ selected,
+ onChange,
+ placeholder = '선택',
+ rightIcon,
+ rightIconActive,
+ showValueInsteadOfLabel = false,
+ disabled = false,
+}: AbsenceDropdownProps) {
+ const [open, setOpen] = useState(false)
+
+ const handleOpenChange = (newOpen: boolean) => {
+ if (disabled) {
+ setOpen(false)
+ return
+ }
+ setOpen(newOpen)
+ }
+
+ const selectedOption = options.find((o) => o.value === selected)
+
+ const selectedLabel = selectedOption
+ ? showValueInsteadOfLabel
+ ? (selectedOption.displayValue ?? selectedOption.value)
+ : selectedOption.label
+ : placeholder
+
+ const triggerClasses = open ? 'border-black text-black' : 'border-gray-300 text-gray-500'
+
+ return (
+
+
+
+ {selectedLabel}
+ {(rightIcon || rightIconActive) && (
+
+ {open && rightIconActive ? rightIconActive : rightIcon}
+
+ )}
+
+
+
+
+ {options.map((option) => {
+ const colorSet = colorMap[option.value] || {
+ hover: 'hover:bg-gray-100',
+ active: 'bg-gray-200',
+ }
+ const isSelected = selected === option.value
+
+ return (
+ onChange(option.value)}
+ disabled={disabled}
+ className={clsx(
+ 'body-md-medium flex cursor-pointer items-center justify-between rounded-[4px] p-[10px] focus:outline-none',
+ colorSet.hover,
+ isSelected && colorSet.active,
+ disabled && 'cursor-not-allowed opacity-60'
+ )}
+ >
+ {option.label}
+
+ )
+ })}
+
+
+ )
+}
diff --git a/src/components/manager/attendance/AbsenceTable.tsx b/src/components/manager/attendance/AbsenceTable.tsx
new file mode 100644
index 0000000..98c6c9f
--- /dev/null
+++ b/src/components/manager/attendance/AbsenceTable.tsx
@@ -0,0 +1,105 @@
+'use client'
+import { useState, useMemo, useCallback, useEffect } from 'react'
+import AbsenceTableHeader from './AbsenceTableHeader'
+import AbsenceTableRow from './AbsenceTableRow'
+import { AbsenceReportItem } from '@/types/manager/attendance/type'
+import Dropdown from '../common/ManagerdropDown'
+import { CalendarOnIcon, UpIcon, KupicArrowIcon } from '@/assets/svgComponents/manager'
+import { SessionScheduleData } from '@/types/manager/session/type'
+import { AbsenceIcon } from '@/assets/svgComponents/manager'
+import {
+ generateDateOptionsFromSessions,
+ getDefaultSelectedDate,
+ transformAbsenceReportItem,
+} from '@/utils/manager/attendance'
+import { getAbsenceClient } from '@/lib/manager/client/absence'
+
+interface AbsenceTableProps {
+ sessionId: number
+ sessions?: SessionScheduleData[]
+}
+
+const gridTemplate = '161px 151px 131px 123px 112px 500px 224px 173px'
+
+export default function AbsenceTable({ sessionId, sessions = [] }: AbsenceTableProps) {
+ const dateOptions = useMemo(() => generateDateOptionsFromSessions(sessions), [sessions])
+ const defaultSelectedDate = useMemo(() => getDefaultSelectedDate(sessions), [sessions])
+ const [selectedDate, setSelectedDate] = useState(defaultSelectedDate)
+ const [currentRecords, setCurrentRecords] = useState()
+
+ const currentTotalCount = currentRecords?.length || 0
+
+ const fetchAbsenceRecords = useCallback(async (sessionId: number) => {
+ try {
+ const result = await getAbsenceClient(sessionId)
+ if (result.success) {
+ setCurrentRecords(result.data)
+ }
+ } catch (error) {
+ console.error('❌ Error fetching absence records:', error)
+ }
+ }, [])
+
+ // 초기 데이터 로드
+ useEffect(() => {
+ if (sessionId) fetchAbsenceRecords(sessionId)
+ }, [sessionId, fetchAbsenceRecords])
+
+ // 날짜 변경 시 해당 세션 데이터 불러오기
+ const handleDateChange = useCallback(
+ (date: string) => {
+ setSelectedDate(date)
+ const selectedOption = dateOptions.find((option) => option.value === date)
+ if (selectedOption) fetchAbsenceRecords(selectedOption.sessionId)
+ },
+ [dateOptions, fetchAbsenceRecords]
+ )
+
+ return (
+
+
+
+
+
불참 사유서
+
+ {currentTotalCount}
+
+
+
}
+ leftIconActive={
}
+ rightIcon={
}
+ rightIconActive={
}
+ />
+
+
+
+
+ {currentRecords?.length === 0 ? (
+
+
+
아직 불참 사유서가 등록되지 않았어요
+
+ ) : (
+
+
+
+ {currentRecords?.map((record, index) => (
+
+ ))}
+
+
+ )}
+
+
+ )
+}
diff --git a/src/components/manager/attendance/AbsenceTableHeader.tsx b/src/components/manager/attendance/AbsenceTableHeader.tsx
new file mode 100644
index 0000000..ef4996f
--- /dev/null
+++ b/src/components/manager/attendance/AbsenceTableHeader.tsx
@@ -0,0 +1,23 @@
+const headers = ['이름', '파트', '제출일시', '불참여부', '시간', '사유', '증빙서류', '벌점']
+
+interface AbsenceTableHeaderProps {
+ gridTemplate: string
+}
+
+export default function AbsenceTableHeader({ gridTemplate }: AbsenceTableHeaderProps) {
+ return (
+
+ {headers.map((header, index) => (
+
+ {header}
+
+ ))}
+
+ )
+}
diff --git a/src/components/manager/attendance/AbsenceTableRow.tsx b/src/components/manager/attendance/AbsenceTableRow.tsx
new file mode 100644
index 0000000..6626238
--- /dev/null
+++ b/src/components/manager/attendance/AbsenceTableRow.tsx
@@ -0,0 +1,119 @@
+'use client'
+import { useState, useEffect } from 'react'
+import AbsenceDropdown from './AbsenceDropdown'
+import { UpIcon, DownIcon } from '@/assets/svgComponents/manager'
+import { AbsenceReportItem, AbsencePenaltyType } from '@/types/manager/attendance/type'
+import { patchPenaltyClient } from '@/lib/manager/client/absence'
+import ImageModal from '../modal/imageModal'
+import { getFileType } from '@/utils/manager/fileType'
+import RoleTag from '../common/RoleTag'
+
+interface AbsenceTableRowProps {
+ record: AbsenceReportItem & { documentStatus?: string }
+ isEven: boolean
+ gridTemplate: string
+}
+
+const ATTENDANCE_SCORE_OPTIONS = [
+ { label: '결석(인정)', value: 'EXCUSED', displayValue: '0' },
+ { label: '결석(사유 -2)', value: 'ABSENT_WITH_DOC', displayValue: '-2' },
+ { label: '결석(무단 -2)', value: 'ABSENT_WITH_CAUSE', displayValue: '-2' },
+ { label: '결석(미제출 -3)', value: 'ABSENT', displayValue: '-3' },
+ { label: '지각(-1)', value: 'LATE', displayValue: '-1' },
+ { label: '조퇴(-1)', value: 'EARLY_LEAVE', displayValue: '-1' },
+]
+
+export default function AbsenceTableRow({ record, isEven, gridTemplate }: AbsenceTableRowProps) {
+ const getInitialSelectedScore = () => {
+ if (record.absenceApprovedType && record.absenceApprovedType !== 'null') {
+ return record.absenceApprovedType
+ }
+ return ''
+ }
+
+ const [selectedScore, setSelectedScore] = useState(getInitialSelectedScore())
+ const [isLoading, setIsLoading] = useState(false)
+ const [isImageModalOpen, setIsImageModalOpen] = useState(false)
+
+ useEffect(() => {
+ setSelectedScore(getInitialSelectedScore())
+ }, [record.absenceApprovedType])
+
+ // 벌점 설정 핸들러
+ const handleScoreChange = async (value: string) => {
+ setSelectedScore(value)
+ setIsLoading(true)
+ try {
+ const result = await patchPenaltyClient(record.absenceReportId, value as AbsencePenaltyType)
+ if (result.success) {
+ console.log('✅ Successfully set penalty:', result.data)
+ }
+ } catch (error) {
+ console.error('❌ Error setting penalty:', error)
+ setSelectedScore('')
+ } finally {
+ setIsLoading(false)
+ }
+ }
+
+ // 증빙서류 클릭 핸들러
+ const handleDocumentClick = () => {
+ if (!record.url) return
+ const fileType = getFileType(record.url)
+ if (fileType === 'image') {
+ // 이미지인 경우 ImageModal 열기
+ setIsImageModalOpen(true)
+ } else {
+ // PDF나 기타 파일인 경우 새 창에서 열기
+ window.open(record.url, '_blank')
+ }
+ }
+
+ return (
+ <>
+
+
{record.name}
+
+
+
+
{record.submitDate}
+
{record.submitType}
+
{record.time}
+
{record.reason}
+
+
+ {record.documentStatus || record.url}
+
+
+
+
}
+ rightIconActive={
}
+ showValueInsteadOfLabel={true}
+ disabled={isLoading}
+ />
+
+
+ {isImageModalOpen && record.url && getFileType(record.url) === 'image' && (
+ setIsImageModalOpen(false)}
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/attendance/SessionInfo.tsx b/src/components/manager/attendance/SessionInfo.tsx
new file mode 100644
index 0000000..0e7ec7c
--- /dev/null
+++ b/src/components/manager/attendance/SessionInfo.tsx
@@ -0,0 +1,95 @@
+'use client'
+import { useEffect, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import ManagerButton from '../common/ManagerButton'
+
+interface SessionInfoProps {
+ location?: string
+ time?: string
+ sessionTitle?: string
+ isHoliday?: boolean
+ category?: string
+}
+
+export default function SessionInfo({ location, time, sessionTitle, isHoliday, category }: SessionInfoProps) {
+ const [showStickyHeader, setShowStickyHeader] = useState(false)
+ const router = useRouter()
+
+ useEffect(() => {
+ const handleScroll = () => {
+ const mainContent = document.querySelector('main')
+ if (!mainContent) return
+ const currentScroll = mainContent.scrollTop
+ setShowStickyHeader(currentScroll > 0)
+ }
+ const mainContent = document.querySelector('main')
+ if (mainContent) {
+ mainContent.addEventListener('scroll', handleScroll)
+ return () => mainContent.removeEventListener('scroll', handleScroll)
+ }
+ }, [])
+
+ const getDisplayTitle = () => {
+ if (isHoliday) return '공휴일'
+ if (category === 'REST') return '휴회'
+ return sessionTitle
+ }
+
+ const isButtonDisabled = isHoliday || category === 'REST'
+ const shouldShowLocationTime = !isHoliday && category !== 'REST'
+
+ const HeaderContent = () => (
+ <>
+ {getDisplayTitle()}
+ {
+ const params = new URLSearchParams()
+ if (sessionTitle) params.set('title', sessionTitle)
+ if (location) params.set('location', location)
+ if (time) params.set('time', time)
+ const queryString = params.toString()
+ const url = queryString ? `/attendance/qr?${queryString}` : '/attendance/qr'
+ router.push(url)
+ }}
+ >
+ 출석체크 시작하기
+
+ >
+ )
+
+ return (
+ <>
+ {showStickyHeader && (
+
+
+
+ )}
+
+
+ >
+ )
+}
diff --git a/src/components/manager/attendance/qr/AttendanceSuccess.tsx b/src/components/manager/attendance/qr/AttendanceSuccess.tsx
new file mode 100644
index 0000000..98f7e22
--- /dev/null
+++ b/src/components/manager/attendance/qr/AttendanceSuccess.tsx
@@ -0,0 +1,33 @@
+import { QrCheckIcon, QrErrorIcon } from '@/assets/svgComponents/manager'
+
+interface AttendanceSuccessProps {
+ name: string
+ avatarUrl?: string
+ className?: string
+ status?: 'success' | 'error'
+ errorMessage?: string | null
+}
+
+export default function AttendanceSuccess({
+ name,
+ className = '',
+ status = 'success',
+ errorMessage = null,
+}: AttendanceSuccessProps) {
+ const isSuccess = status === 'success'
+ return (
+
+
+
+ {isSuccess && `${name}님의 출석체크가 완료되었어요`}
+ {!isSuccess && errorMessage ? {errorMessage} : null}
+
+
+ )
+}
diff --git a/src/components/manager/attendance/qr/FocusSessionCard.tsx b/src/components/manager/attendance/qr/FocusSessionCard.tsx
new file mode 100644
index 0000000..4cb5f0e
--- /dev/null
+++ b/src/components/manager/attendance/qr/FocusSessionCard.tsx
@@ -0,0 +1,54 @@
+'use client'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { AttendanceSummaryType } from '@/types/manager/attendance/type'
+
+export default function FocusSessionCard({ summary }: { summary: AttendanceSummaryType | null }) {
+ const searchParams = useSearchParams()
+
+ const sessionTitle = searchParams.get('title')
+ const location = searchParams.get('location')
+ const time = searchParams.get('time')
+
+ const router = useRouter()
+
+ return (
+
+
+
+
{sessionTitle}
+
+ 장소 {location} 일시 {time}
+
+
+
+ router.push('/attendance')}
+ className={'= body-2xl-semibold rounded-[12px] bg-gray-700 px-[15.5] py-3 text-white'}
+ >
+ 출석체크 종료하기
+
+
+
+
+
+ )
+}
+
+function Stat({ label, value, highlight = false }: { label: string; value?: number | null; highlight?: boolean }) {
+ return (
+
+ {label}
+
+ {value}
+
+
+ )
+}
diff --git a/src/components/manager/attendance/qr/ManagerAttendanceQRClient.tsx b/src/components/manager/attendance/qr/ManagerAttendanceQRClient.tsx
new file mode 100644
index 0000000..bc34341
--- /dev/null
+++ b/src/components/manager/attendance/qr/ManagerAttendanceQRClient.tsx
@@ -0,0 +1,116 @@
+'use client'
+
+import { useState, useEffect, useCallback, Suspense } from 'react'
+import QRScanner from './QRScanner'
+import FocusSessionCard from './FocusSessionCard'
+import { postClientAttendanceScan, getClientAttendanceSummary } from '@/lib/manager/client/attendance'
+import type { AttendanceScanResponseType, AttendanceSummaryType } from '@/types/manager/attendance/type'
+import type { ApiCallResult } from '@/types/common'
+import { useAttendanceStore } from '@/store/attendanceStore'
+
+export default function ManagerAttendanceQRClient() {
+ const [errorMessage, setErrorMessage] = useState(null)
+ const [successPulseUntil, setSuccessPulseUntil] = useState(null)
+ const [pulseStatus, setPulseStatus] = useState<'success' | 'error' | null>(null)
+ const [resultPayload, setResultPayload] = useState<{ name: string; avatarUrl?: string } | null>(null)
+ const { setLatestScanResult } = useAttendanceStore()
+
+ const [summary, setSummary] = useState(null)
+
+ const setPulseState = useCallback(
+ (status: 'success' | 'error', payload: { name: string; avatarUrl?: string }, message: string | null = null) => {
+ setPulseStatus(status)
+ setResultPayload(payload)
+ setErrorMessage(message)
+ setSuccessPulseUntil(Date.now() + 4000)
+ },
+ []
+ )
+
+ const fetchSummary = useCallback(async () => {
+ try {
+ const result = await getClientAttendanceSummary()
+ if (result.success && result.data) {
+ const summaryData = result.data as AttendanceSummaryType
+ setSummary(summaryData)
+ } else {
+ console.error('Summary Fetch 실패. 오류:', result.error)
+ }
+ } catch (e) {
+ console.error('Summary Fetch 통신 오류:', e)
+ }
+ }, [])
+
+ // 4초 후 UI 상태 초기화
+ useEffect(() => {
+ if (!successPulseUntil) return
+ const timer = setTimeout(() => {
+ console.log('[Timer] 4초 경과, 상태 초기화')
+ setSuccessPulseUntil(null)
+ setPulseStatus(null)
+ setResultPayload(null)
+ setErrorMessage(null)
+ }, 4000)
+ return () => clearTimeout(timer)
+ }, [successPulseUntil])
+
+ // 컴포넌트 마운트 시 최초 1회 호출
+ useEffect(() => {
+ fetchSummary()
+ }, [fetchSummary])
+
+ // QR 감지 시 처리
+ const handleDetect = useCallback(
+ async (data: string) => {
+ setLatestScanResult(null)
+ let actualToken: string
+ try {
+ const parsed = JSON.parse(data)
+ actualToken = parsed.token
+ } catch (e) {
+ console.error('QR data parsing failed:', e)
+ setPulseState('error', { name: 'QR 오류' }, 'QR 데이터 형식이 잘못되었습니다.')
+ return
+ }
+ try {
+ const response: ApiCallResult = await postClientAttendanceScan(actualToken)
+ setLatestScanResult(response)
+
+ if (!response.success) {
+ const errMsg = typeof response.error === 'string' ? response.error : '알 수 없는 출석 실패 오류'
+ setPulseState('error', { name: '출석 실패' }, errMsg)
+ console.error('[QR Scan] POST 실패:', errMsg)
+ return
+ }
+
+ const resultData = response.data
+ if (resultData) {
+ fetchSummary()
+
+ setPulseState('success', { name: resultData.memberName ?? '회원' }, null)
+ } else {
+ setPulseState('error', { name: '데이터 오류' }, 'API 응답에서 출석 결과를 찾을 수 없습니다.')
+ }
+ } catch (error) {
+ console.error('[QR Scan] 통신 오류:', error)
+ setPulseState('error', { name: '서버 오류' }, '서버와의 통신에 실패했습니다.')
+ }
+ },
+ [setLatestScanResult, setPulseState, fetchSummary]
+ )
+
+ return (
+
+ 로딩 중...}>
+
+
+
+
+ )
+}
diff --git a/src/components/manager/attendance/qr/QRScanner.tsx b/src/components/manager/attendance/qr/QRScanner.tsx
new file mode 100644
index 0000000..f253afb
--- /dev/null
+++ b/src/components/manager/attendance/qr/QRScanner.tsx
@@ -0,0 +1,201 @@
+'use client'
+import { useEffect, useRef } from 'react'
+import AttendanceSuccess from './AttendanceSuccess'
+import useQRScanner from '@/hooks/manager/useQRScanner'
+
+interface QRScannerProps {
+ onDetect?: (decodedText: string) => void
+ successPulseUntil?: number | null
+ pulseStatus?: 'success' | 'error' | null
+ resultPayload?: { name: string; avatarUrl?: string } | null
+ errorMessage: string | null
+}
+
+export default function QRScanner({
+ onDetect,
+ successPulseUntil,
+ pulseStatus = null,
+ resultPayload = null,
+ errorMessage = null,
+}: QRScannerProps) {
+ const {
+ videoRef,
+ canvasRef,
+ containerRef,
+ guideRef,
+ scanning,
+ error,
+ maskRect,
+ guideState,
+ setGuideState,
+ resumeDecoding,
+ switchCamera,
+ facingMode,
+ hasMultipleCameras,
+ } = useQRScanner(onDetect)
+
+ const cornerColor =
+ pulseStatus === 'error'
+ ? 'bg-red-500'
+ : guideState === 'detected'
+ ? 'bg-yellow-400'
+ : guideState === 'success'
+ ? 'bg-green-500'
+ : 'bg-white'
+
+ const borderClass =
+ pulseStatus === 'error'
+ ? 'border-red-300'
+ : guideState === 'detected'
+ ? 'border-yellow-300'
+ : guideState === 'success'
+ ? 'border-green-200'
+ : 'border-white/30'
+ const cornerPositions = [
+ ['top', 'left'],
+ ['top', 'right'],
+ ['bottom', 'left'],
+ ['bottom', 'right'],
+ ] as const
+
+ const prevSuccessPulseRef = useRef(null)
+
+ useEffect(() => {
+ let raf = 0
+ const tick = () => {
+ const now = Date.now()
+ if (successPulseUntil && now < successPulseUntil) {
+ setGuideState('success')
+ raf = requestAnimationFrame(tick)
+ } else {
+ setGuideState((s) => (s === 'success' ? 'idle' : s))
+ if (raf) cancelAnimationFrame(raf)
+ }
+ }
+
+ if (successPulseUntil) {
+ tick()
+ } else {
+ setGuideState((s) => (s === 'success' ? 'idle' : s))
+ }
+
+ return () => {
+ if (raf) cancelAnimationFrame(raf)
+ }
+ }, [successPulseUntil, setGuideState])
+
+ useEffect(() => {
+ const prev = prevSuccessPulseRef.current
+ if (prev && !successPulseUntil) {
+ resumeDecoding()
+ }
+ prevSuccessPulseRef.current = successPulseUntil ?? null
+ }, [successPulseUntil, resumeDecoding])
+
+ return (
+
+
+
+
+ {maskRect ? (
+
+
+
+
+
+
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+
+ {cornerPositions.map(([vpos, hpos]) => (
+
+ ))}
+
+
+
+
+
+
+ {successPulseUntil ? (
+
+ {resultPayload ? (
+
+ ) : (
+
{pulseStatus === 'error' ? '오류 발생' : '출석 완료'}
+ )}
+
+ ) : guideState === 'detected' ? (
+ '인식중'
+ ) : (
+ '사각형에 QR코드가 꽉 차도록 맞춰주세요'
+ )}
+
+
+ {!scanning && error && (
+
{error}
+ )}
+
+ {/* 카메라 전환 버튼 - 여러 카메라가 있을 때만 표시 */}
+ {hasMultipleCameras && (
+
+
+
+
+
+
+
+ )}
+
+
+
+ )
+}
diff --git a/src/components/manager/check-document/CheckTable.tsx b/src/components/manager/check-document/CheckTable.tsx
new file mode 100644
index 0000000..774d600
--- /dev/null
+++ b/src/components/manager/check-document/CheckTable.tsx
@@ -0,0 +1,142 @@
+'use client'
+
+import { useEffect, useState, useMemo, useRef } from 'react'
+import CheckTableHeader from './CheckTableHeader'
+import CheckTableRow from './CheckTableRow'
+import Dropdown from '../common/ManagerdropDown'
+import TopToast from '../common/TopToast'
+import { CalendarIcon, CalendarOnIcon, UpIcon, KupicArrowIcon, KupickIcon } from '@/assets/svgComponents/manager'
+
+import { getKupickMonths } from '@/utils/manager/kupick'
+import type { CheckDocumentRecord } from '@/types/manager/check-document/types'
+import { getKupicClient } from '@/lib/manager/client/kupic'
+
+export default function CheckTable() {
+ const kupickMonths = getKupickMonths()
+ const currentMonth = new Date().getMonth() + 1
+ const defaultMonth = kupickMonths.includes(currentMonth) ? `${currentMonth}월` : '10월'
+
+ const [selectedMonth, setSelectedMonth] = useState(defaultMonth)
+ const [records, setRecords] = useState([])
+ const [loading, setLoading] = useState(true)
+ const [toastMessage, setToastMessage] = useState(null)
+ const [showStickyHeader, setShowStickyHeader] = useState(false)
+
+ const gridTemplate = '164px 586px 204px 227px 227px 164px'
+ const toastTimeoutRef = useRef(null)
+
+ const dropdownOptions = useMemo(
+ () => [...kupickMonths].sort((a, b) => b - a).map((month) => ({ label: `${month}월`, value: `${month}월` })),
+ [kupickMonths]
+ )
+ const fetchKupicData = async (year: number, month: number) => {
+ setLoading(true)
+ try {
+ const result = await getKupicClient(year, month)
+ setRecords(result.success ? result.data || [] : [])
+ } catch (err) {
+ console.error('Error fetching kupic data:', err)
+ setRecords([])
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ // 초기 데이터 로딩 + 드롭다운 변경 시
+ useEffect(() => {
+ const currentYear = new Date().getFullYear()
+ const monthNumber = Number(selectedMonth.replace('월', ''))
+ fetchKupicData(currentYear, monthNumber)
+ }, [selectedMonth])
+
+ // 초기 토스트 표시
+ useEffect(() => {
+ setToastMessage('먼저 증빙 서류를 확인해 주세요')
+ }, [])
+
+ // 스크롤 처리
+ useEffect(() => {
+ const mainContent = document.querySelector('main')
+ if (!mainContent) return
+
+ const handleScroll = () => {
+ const currentScroll = (mainContent as HTMLElement).scrollTop
+ setShowStickyHeader(currentScroll > 0)
+ }
+
+ mainContent.addEventListener('scroll', handleScroll)
+ return () => mainContent.removeEventListener('scroll', handleScroll)
+ }, [])
+
+ // 토스트 표시
+ const handleToast = (toast: { message: string; icon?: React.ReactNode }) => {
+ const message = toast?.message ?? ''
+ setToastMessage(message)
+ if (toastTimeoutRef.current) clearTimeout(toastTimeoutRef.current)
+ toastTimeoutRef.current = setTimeout(() => setToastMessage(null), 3400)
+ }
+
+ const visibleCount = records.length
+
+ const HeaderContent = () => (
+
+
{selectedMonth} 큐픽
+
+ {visibleCount}
+
+
+ )
+
+ return (
+
+ {showStickyHeader && (
+
+
+
+ )}
+
+
+
+ }
+ leftIconActive={ }
+ rightIcon={ }
+ rightIconActive={ }
+ placeholder="선택"
+ />
+
+
+
+
+ {loading ? (
+
+ ) : records.length === 0 ? (
+
+ ) : (
+ records.map((record, index) => (
+
+ ))
+ )}
+
+
+ {toastMessage &&
}
+
+ )
+}
diff --git a/src/components/manager/check-document/CheckTableHeader.tsx b/src/components/manager/check-document/CheckTableHeader.tsx
new file mode 100644
index 0000000..c7392b8
--- /dev/null
+++ b/src/components/manager/check-document/CheckTableHeader.tsx
@@ -0,0 +1,20 @@
+const headers = ['이름', '파트', '제출일시', '신청 사진', '시청 사진', '확인']
+
+interface CheckTableHeaderProps {
+ gridTemplate: string
+}
+
+export default function CheckTableHeader({ gridTemplate }: CheckTableHeaderProps) {
+ return (
+
+ {headers.map((header, index) => (
+
+ {header}
+
+ ))}
+
+ )
+}
diff --git a/src/components/manager/check-document/CheckTableRow.tsx b/src/components/manager/check-document/CheckTableRow.tsx
new file mode 100644
index 0000000..b549dc9
--- /dev/null
+++ b/src/components/manager/check-document/CheckTableRow.tsx
@@ -0,0 +1,135 @@
+'use client'
+
+import { useState } from 'react'
+import { useRouter } from 'next/navigation'
+import clsx from 'clsx'
+
+import Dropdown from '../common/ManagerdropDown'
+import RoleTag from '../common/RoleTag'
+import ImageModal from '../modal/imageModal'
+import { UpIcon, DownIcon } from '@/assets/svgComponents/manager'
+import CheckOneIcon from '@/assets/svgComponents/manager/CheckOneIcon'
+import { postKupicClient } from '@/lib/manager/client/kupic'
+import type { CheckDocumentRecord } from '@/types/manager/check-document/types'
+import { formatDateToKorean, formatDateToMD, formatTimeToHM, getPartName } from '@/utils/manager/attendance'
+
+interface AbsenceTableRowProps {
+ record: CheckDocumentRecord
+ isEven: boolean
+ gridTemplate?: string
+ onToast?: (toast: { message: string; icon?: React.ReactNode }) => void
+}
+
+const ATTENDANCE_SCORE_OPTIONS = [
+ { label: '승인', value: 'approved', displayValue: '승인' },
+ { label: '미승인', value: 'rejected', displayValue: '미승인' },
+]
+
+// URL에서 파일명 추출
+const getFileNameFromUrl = (url?: string) => {
+ if (!url) return ''
+ const fileName = url.split('/').pop() ?? ''
+ return fileName.split('?')[0] // 쿼리 제거
+}
+
+export default function AbsenceTableRow({ record, isEven, gridTemplate, onToast }: AbsenceTableRowProps) {
+ const router = useRouter()
+ const initialApprovalValue = record.approval === null ? '' : record.approval ? 'approved' : 'rejected'
+
+ const [selectedScore, setSelectedScore] = useState(initialApprovalValue)
+ const [isLoading, setIsLoading] = useState(false)
+ const [modalState, setModalState] = useState<{ open: boolean; index: number }>({ open: false, index: 0 })
+
+ const formattedDate = record.submitDate ? formatDateToMD(record.submitDate) : ''
+ const formattedTime = record.submitDate ? formatTimeToHM(record.submitDate.split('T')[1] || '') : ''
+ const formattedSubmitDate = record.submitDate ? formatDateToKorean(record.submitDate) : ''
+
+ const files = [
+ { url: record.applicationUrl, title: '신청 사진' },
+ { url: record.viewUrl, title: '시청 사진' },
+ ]
+
+ const toImageUrl = (val: string) => {
+ if (val && (val.startsWith('http') || val.startsWith('/'))) return val
+ return '/png/mock-image-default.png'
+ }
+
+ const handleApprovalChange = async (newValue: string) => {
+ const isApproved = newValue === 'approved'
+ const originalValue = selectedScore
+ setSelectedScore(newValue)
+ setIsLoading(true)
+
+ try {
+ const result = await postKupicClient({ kupickId: record.kupickId, approval: isApproved })
+ if (!result.success) throw new Error(result.error || '알 수 없는 오류')
+ onToast?.({ message: '저장되었습니다', icon: })
+ router.refresh()
+ } catch (err: unknown) {
+ console.error('Approval update failed:', err)
+ onToast?.({ message: `승인 처리 실패: ${err instanceof Error ? err.message : '알 수 없는 오류'}` })
+ setSelectedScore(originalValue)
+ } finally {
+ setIsLoading(false)
+ }
+ }
+console.log(files)
+ return (
+ <>
+
+
{record.name}
+
+
+
+
{formattedSubmitDate}
+ {files.map(({ url }, index) => {
+ const fileName = getFileNameFromUrl(url)
+ const isSubmitted = !!fileName
+ return (
+
isSubmitted && setModalState({ open: true, index })}
+ disabled={!isSubmitted}
+ className={clsx(
+ 'h-full flex items-center body-lg-regular overflow-hidden text-start text-ellipsis whitespace-nowrap',
+ isEven ? 'bg-white' : 'bg-background1',
+ isSubmitted ? 'text-gray-800 hover:underline' : 'cursor-default text-gray-500'
+ )}
+ >
+
+ {fileName || '미제출'}
+
+
+ )
+ })}
+
+ }
+ rightIconActive={ }
+ showValueInsteadOfLabel
+ placeholder="선택"
+ />
+
+
+
+ {modalState.open && (
+ f.title)}
+ images={files.map((f) => toImageUrl(f.url))}
+ footerText={`${record.name} ${formattedDate} ${formattedTime}`}
+ initialIndex={modalState.index}
+ onClose={() => setModalState({ ...modalState, open: false })}
+ imageClassName="px-0 m-0"
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/common/BottomToast.tsx b/src/components/manager/common/BottomToast.tsx
new file mode 100644
index 0000000..35057c9
--- /dev/null
+++ b/src/components/manager/common/BottomToast.tsx
@@ -0,0 +1,48 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+
+interface BottomToastProps {
+ message: string
+ duration?: number
+ className?: string // 추가: 커스텀 클래스
+}
+
+export default function BottomToast({ message, duration = 3000, className = '' }: BottomToastProps) {
+ const [visible, setVisible] = useState(false)
+ const [shouldRender, setShouldRender] = useState(false)
+
+ useEffect(() => {
+ setShouldRender(true)
+ const showTimer = setTimeout(() => setVisible(true), 50)
+ const hideTimer = setTimeout(() => setVisible(false), duration)
+ const removeTimer = setTimeout(() => setShouldRender(false), duration + 400)
+ return () => {
+ clearTimeout(showTimer)
+ clearTimeout(hideTimer)
+ clearTimeout(removeTimer)
+ }
+ }, [duration])
+
+ if (!shouldRender) return null
+
+ return (
+
+ )
+}
+
+export const DEFAULT_SHIFT_WHEEL_MESSAGE = 'Shift 키를 누른 상태로 휠을 돌리면 좌우로 스크롤 됩니다.'
diff --git a/src/components/manager/common/ManagerButton.tsx b/src/components/manager/common/ManagerButton.tsx
new file mode 100644
index 0000000..b0b41c2
--- /dev/null
+++ b/src/components/manager/common/ManagerButton.tsx
@@ -0,0 +1,72 @@
+import { ReactNode } from 'react'
+
+const variantStyles = {
+ primary: {
+ default: 'bg-primary-500 text-white cursor-pointer',
+ disabled: 'bg-gray-100 text-gray-500 cursor-not-allowed',
+ },
+ gray: {
+ default: 'bg-background2 text-black',
+ disabled: '',
+ },
+ white: {
+ default: 'bg-white text-black',
+ disabled: '',
+ },
+}
+const sizeStyles = {
+ lg: '',
+ md: 'body-2xl-semibold h-[52px] rounded-[12px] ',
+ sm: 'body-sm-medium h-[36px] rounded-[4px] min-w-[73px]',
+}
+
+export interface ManagerButtonProps {
+ children: ReactNode
+ onClick: () => void
+ styleType?: 'primary' | 'gray' | 'white'
+ styleStatus?: 'default' | 'disabled'
+ styleSize?: 'lg' | 'md' | 'sm'
+ customClassName?: string
+ buttonType?: 'button' | 'submit'
+ disabled?: boolean
+ rightIcon?: ReactNode
+ leftIcon?: ReactNode
+}
+
+const ManagerButton = ({
+ styleType = 'primary',
+ styleStatus = 'default',
+ styleSize = 'lg',
+ children,
+ customClassName,
+ onClick,
+ buttonType = 'button',
+ disabled = false,
+ rightIcon,
+ leftIcon,
+}: ManagerButtonProps) => {
+ // disabled 상태일 때 styleStatus를 강제로 'disabled'로 설정
+ const actualStyleStatus = disabled ? 'disabled' : styleStatus
+
+ const base = 'flex items-center justify-center gap-x-2 py-[12px] px-[15.5px]'
+ const hoverClass = disabled ? '' : 'hover:bg-primary-700'
+ const variantClass = variantStyles[styleType][actualStyleStatus]
+ const sizeClass = sizeStyles[styleSize]
+ const className = [base, hoverClass, variantClass, sizeClass].join(' ')
+
+ const handleClick = () => {
+ if (!disabled) {
+ onClick()
+ }
+ }
+
+ return (
+
+ {leftIcon ? leftIcon : null}
+ {children}
+ {rightIcon ? rightIcon : null}
+
+ )
+}
+
+export default ManagerButton
diff --git a/src/components/manager/common/ManagerHeader.tsx b/src/components/manager/common/ManagerHeader.tsx
new file mode 100644
index 0000000..54483c6
--- /dev/null
+++ b/src/components/manager/common/ManagerHeader.tsx
@@ -0,0 +1,96 @@
+'use client'
+import { useState, useEffect } from 'react'
+import Link from 'next/link'
+import { ProfileIcon } from '@/assets/svgComponents'
+import { LogoIcon, SideMenuIcon } from '@/assets/svgComponents/manager'
+import ProfileModal from '../modal/ProfileModal'
+import ManagerSidebar from './ManagerSidebar'
+import { getClientProfile } from '@/lib/member/client/profile'
+
+export default function ManagerHeader() {
+ const [isModalOpen, setIsModalOpen] = useState(false)
+ const [isSidebarOpen, setIsSidebarOpen] = useState(false)
+ const [isMobile, setIsMobile] = useState(false)
+ const [name, setName] = useState('')
+
+ useEffect(() => {
+ const handleResize = () => {
+ setIsMobile(window.innerWidth <= 766)
+ }
+ handleResize()
+ window.addEventListener('resize', handleResize)
+ return () => window.removeEventListener('resize', handleResize)
+ }, [])
+
+ useEffect(() => {
+ getClientProfile().then((res) => {
+ const userData = res.data?.data
+ setName(userData?.name)
+ })
+ }, [])
+
+ const handleProfileClick = () => {
+ setIsModalOpen(true)
+ }
+
+ const handleCloseModal = () => {
+ setIsModalOpen(false)
+ }
+
+ const handleSidebarToggle = () => {
+ setIsSidebarOpen((prev) => !prev)
+ }
+
+ return (
+ <>
+
+ {isModalOpen && (
+
+
e.stopPropagation()}
+ >
+
+
+
+ )}
+ {isSidebarOpen && isMobile && (
+
+
+
e.stopPropagation()}
+ >
+
+
+
+ )}
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/manager/common/ManagerInput.tsx b/src/components/manager/common/ManagerInput.tsx
new file mode 100644
index 0000000..db6b853
--- /dev/null
+++ b/src/components/manager/common/ManagerInput.tsx
@@ -0,0 +1,82 @@
+import { ChangeEvent } from 'react'
+
+const inputBoxStyles = {
+ default: 'border-gray-300 cursor-pointer',
+ error: 'border-sub-red border-[1px] cursor-pointer',
+ disabled: '',
+}
+
+interface ManagerInputProps {
+ inputBoxStyle?: 'default' | 'error' | 'disabled'
+ size?: 'sm' | 'md' | 'lg'
+ value?: string | number
+ onChange?: (event: ChangeEvent) => void
+ onClick?: () => void
+ rightIcon?: React.ReactNode
+ leftIcon?: React.ReactNode
+ placeholder?: string
+ type?: 'text' | 'password' | 'email' | 'tel' | 'date' | 'number' | 'time'
+ customClassName?: string
+ className?: string
+ inputClassName?: string
+ errorMessage?: string
+ inputMode?: 'text' | 'email' | 'tel' | 'search' | 'url' | 'none' | 'numeric' | 'decimal'
+ readonly?: boolean
+ onFocus?: () => void
+}
+
+const ManagerInput = ({
+ value,
+ onChange,
+ inputBoxStyle = 'default',
+ rightIcon,
+ leftIcon,
+ placeholder,
+ type = 'text',
+ customClassName,
+ className,
+ inputClassName,
+ errorMessage,
+ inputMode,
+ onClick,
+ onFocus,
+ size = 'sm',
+}: ManagerInputProps) => {
+ const inputBoxBase = 'border flex gap-x-2 rounded-[8px] items-center bg-white'
+ const inputFieldBase = 'button desktop:body-md w-full outline-none bg-white placeholder:text-gray-400'
+
+ const sizeClass = {
+ sm: 'px-[20px] py-[14px] body-sm-medium',
+ md: '',
+ lg: '',
+ }[size]
+
+ const inputBoxStyleClassName = inputBoxStyles[inputBoxStyle ?? 'default']
+
+ return (
+
+
+ {leftIcon ? leftIcon : null}
+
+ {})}
+ type={type}
+ disabled={inputBoxStyle === 'disabled'}
+ onFocus={onFocus}
+ inputMode={inputMode}
+ className={`${inputFieldBase} ${inputBoxStyle === 'disabled' ? 'cursor-not-allowed' : ''} ${inputClassName ?? ''}`}
+ placeholder={placeholder}
+ style={{
+ color: inputBoxStyle === 'disabled' ? '#9CA3AF' : 'inherit',
+ }}
+ />
+
+ {rightIcon ? rightIcon : null}
+
+ {errorMessage &&
{errorMessage}
}
+
+ )
+}
+export default ManagerInput
diff --git a/src/components/manager/common/ManagerModal.tsx b/src/components/manager/common/ManagerModal.tsx
new file mode 100644
index 0000000..01cd3da
--- /dev/null
+++ b/src/components/manager/common/ManagerModal.tsx
@@ -0,0 +1,101 @@
+'use client'
+
+import { ReactNode, useEffect, useState } from 'react'
+
+type ManagerModalProps = {
+ open: boolean
+ message?: ReactNode
+ onCancel: () => void
+ onConfirm: () => void
+ customClassName?: string
+ transientMessage?: ReactNode | null
+ transientDuration?: number
+ onTransientClose?: () => void
+ confirmLabel?: string
+ cancelLabel?: string
+ reverseButtons?: boolean // 버튼 순서 반전 여부
+}
+
+export default function ManagerModal({
+ open,
+ message = '변경사항을 저장할까요?',
+ onCancel,
+ onConfirm,
+ customClassName = '',
+ transientMessage = null,
+ transientDuration = 10000,
+ onTransientClose,
+ confirmLabel = '저장',
+ cancelLabel = '취소',
+ reverseButtons = false,
+}: ManagerModalProps) {
+ const [transientVisible, setTransientVisible] = useState(false)
+
+ useEffect(() => {
+ if (transientMessage) {
+ setTransientVisible(true)
+ const t = setTimeout(() => {
+ setTransientVisible(false)
+ onTransientClose?.()
+ }, transientDuration)
+ return () => clearTimeout(t)
+ }
+ setTransientVisible(false)
+ return
+ }, [transientMessage, transientDuration, onTransientClose])
+
+ if (!open && !transientVisible) return null
+
+ const isTransient = transientVisible && transientMessage
+
+ return (
+
+
+ {isTransient ? (
+
+ {transientMessage}
+
+ ) : (
+ <>
+ {message}
+
+ {reverseButtons ? (
+ <>
+
+ {confirmLabel}
+
+
+ {cancelLabel}
+
+ >
+ ) : (
+ <>
+
+ {cancelLabel}
+
+
+ {confirmLabel}
+
+ >
+ )}
+
+ >
+ )}
+
+
+ )
+}
diff --git a/src/components/manager/common/ManagerSidebar.tsx b/src/components/manager/common/ManagerSidebar.tsx
new file mode 100644
index 0000000..d1e4250
--- /dev/null
+++ b/src/components/manager/common/ManagerSidebar.tsx
@@ -0,0 +1,90 @@
+'use client'
+
+import Link from 'next/link'
+import { usePathname } from 'next/navigation'
+import { useEffect, useState } from 'react'
+import {
+ ManagerOnIcon,
+ AttendanceIcon,
+ AttendanceOnIcon,
+ DocumentIcon,
+ DocumentOnIcon,
+ ManagerIcon,
+ MemberIcon,
+ MemberOnIcon,
+ NoticeIcon,
+ NoticeOnIcon,
+ PointIcon,
+ PointOnIcon,
+ ScheduleIcon,
+ ScheduleOnIcon,
+} from '@/assets/svgComponents/manager'
+
+const managerSidebarItems = [
+ { title: '출석체크', href: '/attendance', icon: AttendanceIcon, activeIcon: AttendanceOnIcon },
+ { title: '상벌점 조회', href: '/point', icon: PointIcon, activeIcon: PointOnIcon },
+ { title: '공지 등록', href: '/create-notice', icon: NoticeIcon, activeIcon: NoticeOnIcon },
+ { title: '세션 일정', href: '/session-schedule', icon: ScheduleIcon, activeIcon: ScheduleOnIcon },
+ { title: '큐픽 서류 확인', href: '/check-document', icon: DocumentIcon, activeIcon: DocumentOnIcon },
+ { title: '학회원 관리', href: '/member-management', icon: MemberIcon, activeIcon: MemberOnIcon },
+ { title: '운영진 관리', href: '/staff-management', icon: ManagerIcon, activeIcon: ManagerOnIcon },
+]
+
+export default function ManagerSidebar({
+ forceShow = false,
+ onLinkClick,
+}: {
+ forceShow?: boolean
+ onLinkClick?: () => void
+} = {}) {
+ const pathname = usePathname()
+ const [showSidebar, setShowSidebar] = useState(false)
+
+ useEffect(() => {
+ if (forceShow) {
+ setShowSidebar(true)
+ return
+ }
+ const handleResize = () => {
+ setShowSidebar(window.innerWidth >= 767)
+ }
+ handleResize()
+ window.addEventListener('resize', handleResize)
+ return () => window.removeEventListener('resize', handleResize)
+ }, [forceShow])
+
+ if (pathname && pathname.startsWith('/attendance/qr')) return null
+ if (!showSidebar) return null
+
+ return (
+
+
+ {managerSidebarItems.map((item) => {
+ const isActive =
+ item.href === '/session-schedule'
+ ? pathname?.startsWith('/session-schedule')
+ : item.href === '/create-notice'
+ ? pathname?.startsWith('/create-notice')
+ : pathname === item.href
+ const IconComponent = isActive ? item.activeIcon : item.icon
+ return (
+
+ {/* 아이콘을 맨 왼쪽에 위치 */}
+
+
+
+ {item.title}
+
+ )
+ })}
+
+
+ )
+}
diff --git a/src/components/manager/common/ManagerdropDown.tsx b/src/components/manager/common/ManagerdropDown.tsx
new file mode 100644
index 0000000..236f3b0
--- /dev/null
+++ b/src/components/manager/common/ManagerdropDown.tsx
@@ -0,0 +1,157 @@
+'use client'
+
+import { useState } from 'react'
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'
+import clsx from 'clsx'
+
+interface DropdownOption {
+ label: string
+ value: string
+ displayValue?: string
+ icon?: React.ReactNode
+}
+
+interface DropdownProps {
+ options: DropdownOption[]
+ selected?: string
+ onChange: (value: string) => void
+ placeholder?: string
+ icon?: React.ReactNode
+ leftIcon?: React.ReactNode
+ leftIconActive?: React.ReactNode
+ rightIcon?: React.ReactNode
+ rightIconActive?: React.ReactNode
+ size?: 'sm' | 'md' | 'lg' | 'add'
+ type?: 'default' | 'icon-list' | 'date'
+ customWidth?: string
+ showValueInsteadOfLabel?: boolean
+ unstyled?: boolean
+ triggerClassName?: string
+ textColor?: string
+ disabled?: boolean
+ originValue?: string // 원래 값(수정 전 값)
+}
+
+export default function Dropdown({
+ options,
+ selected,
+ onChange,
+ placeholder = '선택',
+ icon,
+ leftIcon,
+ leftIconActive,
+ rightIcon,
+ rightIconActive,
+ size = 'sm',
+ customWidth,
+ showValueInsteadOfLabel = false,
+ unstyled = false,
+ triggerClassName = '',
+ textColor = '',
+ disabled = false,
+}: DropdownProps) {
+ const [open, setOpen] = useState(false)
+
+ const handleOpenChange = (newOpen: boolean) => {
+ if (disabled) {
+ setOpen(false)
+ return
+ }
+ setOpen(newOpen)
+ }
+
+ const selectedOption = options.find((o) => o.value === selected)
+
+ const selectedLabel = selectedOption
+ ? showValueInsteadOfLabel
+ ? (selectedOption.displayValue ?? selectedOption.value)
+ : selectedOption.label
+ : placeholder
+
+ const sizeClass = {
+ sm: 'h-[36px] w-[140px] px-3 py-2 body-lg-regular text-gray-800 ',
+
+ md: 'h-[36px] w-[193px] px-6 ',
+ lg: 'h-[40px] gap-2 py-2 body-lg-medium w-[216px] px-3 text-gray-800 ',
+ add: 'h-[40px] w-[66px] body-lg-medium px-3 ',
+ }[size]
+ const resolvedTriggerClassWhenOpen = (() => {
+ if (!triggerClassName) return 'text-primary-500'
+ const parts = triggerClassName.split(/\s+/)
+ const replaced = parts.map((p) => (p.startsWith('text-') ? 'text-primary-500' : p))
+ return Array.from(new Set(replaced)).join(' ')
+ })()
+
+ const triggerClasses = (() => {
+ if (unstyled) return open ? resolvedTriggerClassWhenOpen : triggerClassName
+ if (triggerClassName) {
+ return open ? `${resolvedTriggerClassWhenOpen} border-primary-500` : `${triggerClassName} border-gray-300`
+ }
+ return open ? 'border-black text-black' : 'border-gray-300 text-gray-500'
+ })()
+
+ return (
+
+
+
+
+ {(leftIcon || leftIconActive || icon) && (
+
+ {open && leftIconActive ? leftIconActive : leftIcon || icon}
+
+ )}
+ {selectedLabel}
+
+ {(rightIcon || rightIconActive) && (
+
+ {open && rightIconActive ? rightIconActive : rightIcon}
+
+ )}
+
+
+
+
+ {options.map((option) => (
+ onChange(option.value)}
+ disabled={disabled}
+ className={clsx(
+ 'flex cursor-pointer items-center gap-2 rounded-[4px] p-[10px] hover:bg-gray-100 focus:outline-none',
+ selected === option.value && 'bg-gray-200',
+ size === 'lg' && 'body-lg-medium',
+ size === 'sm' && 'body-md-medium',
+ size === 'add' && 'body-lg-medium h-[32px] justify-center',
+ disabled && 'cursor-not-allowed opacity-60'
+ )}
+ >
+ {option.icon && {option.icon} }
+ {option.label}
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/manager/common/RoleTag.tsx b/src/components/manager/common/RoleTag.tsx
new file mode 100644
index 0000000..f740d7f
--- /dev/null
+++ b/src/components/manager/common/RoleTag.tsx
@@ -0,0 +1,18 @@
+interface RoleTagProps {
+ label: string
+}
+
+const colorMap: Record = {
+ 기획: 'w-[84px] bg-[#FFE69C] text-[#8B5F00]',
+ 디자인: 'bg-[#BCFAD1] text-[#14712B] w-[84px]',
+ 프론트엔드: 'bg-[#FFDAEC] text-[#9F428C] w-[106px]',
+ 백엔드: 'bg-[#BBE1FF] text-[#3768C7] w-[84px]',
+}
+
+export default function RoleTag({ label }: RoleTagProps) {
+ return (
+
+ {label}
+
+ )
+}
diff --git a/src/components/manager/common/TopToast.tsx b/src/components/manager/common/TopToast.tsx
new file mode 100644
index 0000000..f725c64
--- /dev/null
+++ b/src/components/manager/common/TopToast.tsx
@@ -0,0 +1,48 @@
+'use client'
+import { useEffect, useState } from 'react'
+import type { ReactNode } from 'react'
+
+interface TopToastProps {
+ message: string
+ duration?: number
+ icon?: ReactNode
+}
+
+export default function TopToast({ message, duration = 3000, icon }: TopToastProps) {
+ const [visible, setVisible] = useState(false)
+ const [shouldRender, setShouldRender] = useState(false)
+
+ useEffect(() => {
+ setShouldRender(true)
+ const showTimer = setTimeout(() => setVisible(true), 50)
+ const hideTimer = setTimeout(() => setVisible(false), duration)
+ const removeTimer = setTimeout(() => setShouldRender(false), duration + 400)
+ return () => {
+ clearTimeout(showTimer)
+ clearTimeout(hideTimer)
+ clearTimeout(removeTimer)
+ }
+ }, [duration])
+
+ if (!shouldRender) return null
+
+ return (
+
+
+
+
+ {icon ?? '!'}
+
+
{message}
+
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/category/CategoryModal.tsx b/src/components/manager/create-notice/category/CategoryModal.tsx
new file mode 100644
index 0000000..2210d85
--- /dev/null
+++ b/src/components/manager/create-notice/category/CategoryModal.tsx
@@ -0,0 +1,254 @@
+'use client'
+import { useState } from 'react'
+import clsx from 'clsx'
+import { ModalXIcon } from '@/assets/svgComponents/manager'
+import ColorSelectDropdown from './ColorDropDown'
+import {
+ MAX_CATEGORY_LENGTH,
+ DEFAULT_COLOR,
+ getCategoryColorClasses,
+ validateCategoryName,
+} from '@/utils/manager/notice'
+import { getCategoryEditIcon, createColorDropdownOptions } from '@/utils/manager/notice-components'
+import { NoticeCategory } from '@/types/manager/notice/type'
+import { postClientCategory, putClientCategory, deleteClientCategory } from '@/lib/manager/client/notice'
+import BottomToast from '../../common/BottomToast'
+
+interface CategoryModalProps {
+ isOpen: boolean
+ onClose: () => void
+ categories: NoticeCategory[]
+ onAddCategory: (category: Omit) => void
+ onDeleteCategory: (categoryId: string) => void
+ onEditCategory: (categoryId: string, updatedCategory: Omit) => void
+}
+
+export default function CategoryModal({
+ isOpen,
+ onClose,
+ categories,
+ onAddCategory,
+ onDeleteCategory,
+ onEditCategory,
+}: CategoryModalProps) {
+ const [newCategoryName, setNewCategoryName] = useState('')
+ const [selectedColor, setSelectedColor] = useState(DEFAULT_COLOR)
+ const [error, setError] = useState('')
+ const [editingId, setEditingId] = useState(null)
+ const [editingName, setEditingName] = useState('')
+ const [refreshTrigger, setRefreshTrigger] = useState(0)
+ const [toastMsg, setToastMsg] = useState('')
+
+ const colorOptions = createColorDropdownOptions()
+
+ const validateCategory = (name: string): string => {
+ return validateCategoryName(
+ name,
+ categories.map((c) => ({ ...c, id: c.id.toString() }))
+ )
+ }
+
+ // 등록
+ const handleAdd = async () => {
+ if (newCategoryName.length > 7) {
+ setError('최대 7자까지 등록할 수 있어요')
+ return
+ }
+ const err = validateCategory(newCategoryName)
+ if (err) {
+ if (err.includes('이미 같은 이름의 카테고리가 있어요')) {
+ setToastMsg(err)
+ setTimeout(() => setToastMsg(''), 2000)
+ setError('')
+ return
+ }
+ setError(err)
+ return
+ }
+ if (!newCategoryName.trim() || !selectedColor) return
+ const res = await postClientCategory(newCategoryName.trim(), selectedColor)
+ if (res.success && res.data) {
+ onAddCategory({ name: newCategoryName.trim(), color: selectedColor })
+ setNewCategoryName('')
+ setSelectedColor(DEFAULT_COLOR)
+ setError('')
+ setRefreshTrigger((prev) => prev + 1)
+ } else {
+ if (res.error?.includes('이미 같은 이름의 카테고리가 있어요')) {
+ setToastMsg(res.error)
+ setTimeout(() => setToastMsg(''), 2000)
+ setError('')
+ } else {
+ setError(res.error || '카테고리 등록 실패')
+ }
+ }
+ }
+
+ const startEdit = (cat: NoticeCategory) => {
+ setEditingId(cat.id.toString())
+ setEditingName(cat.name)
+ setError('')
+ }
+
+ // 수정
+ const confirmEdit = async () => {
+ if (!editingId || !editingName.trim()) return cancelEdit()
+ const err = validateCategory(editingName)
+ if (err) return setError(err)
+ const current = categories.find((c) => c.id.toString() === editingId)
+ if (current) {
+ const res = await putClientCategory(Number(editingId), editingName.trim(), current.color)
+ if (res.success && res.data) {
+ onEditCategory(editingId, { name: editingName.trim(), color: current.color })
+ setEditingId(null)
+ setEditingName('')
+ setError('')
+ setRefreshTrigger((prev) => prev + 1) // 색상 목록 새로고침
+ } else {
+ setError(res.error || '카테고리 수정 실패')
+ }
+ }
+ cancelEdit()
+ }
+
+ // 삭제
+ const handleDeleteCategory = async (id: string) => {
+ const res = await deleteClientCategory(Number(id))
+ if (res.success) {
+ onDeleteCategory(id)
+ setRefreshTrigger((prev) => prev + 1)
+ } else {
+ if (
+ res.error?.includes('이미 공지에 등록된 카테고리는 삭제가 불가해요') ||
+ res.error?.includes('해당 카테고리로 작성된 공지가 있어 삭제할 수 없습니다.')
+ ) {
+ setToastMsg(res.error)
+ setTimeout(() => setToastMsg(''), 2000)
+ setError('')
+ } else {
+ setError(res.error || '카테고리 삭제 실패')
+ }
+ }
+ }
+
+ const cancelEdit = () => {
+ setEditingId(null)
+ setEditingName('')
+ setError('')
+ }
+
+ if (!isOpen) return null
+
+ return (
+
+
+
+
카테고리 편집
+
+
+
+
+
+ {categories.length === 0 &&
카테고리를 등록해 보세요!
}
+
+
+
+
+ {categories.map((cat) => {
+ const isEditing = editingId === cat.id.toString()
+ return (
+
+ {isEditing ? (
+ setEditingName(e.target.value)}
+ onBlur={confirmEdit}
+ onKeyDown={(e) => e.key === 'Enter' && confirmEdit()}
+ maxLength={MAX_CATEGORY_LENGTH}
+ autoFocus
+ className="bg-transparent text-start outline-none"
+ />
+ ) : (
+
+ {cat.name}
+ startEdit(cat)}>{getCategoryEditIcon(cat.color, 16)}
+
+ )}
+ handleDeleteCategory(cat.id.toString())}>
+
+
+
+ )
+ })}
+
+
+
+
+ {/* 새 카테고리 등록 */}
+
+
새 카테고리 등록
+
+ {
+ setNewCategoryName(e.target.value)
+ if (e.target.value.length > 7) {
+ setError('최대 7자까지 등록할 수 있어요')
+ }
+ }}
+ placeholder="카테고리 이름"
+ maxLength={MAX_CATEGORY_LENGTH}
+ className={clsx(
+ 'h-[40px] flex-1 rounded-md border px-3 text-sm transition focus:outline-none',
+ error ? 'border-red-500' : 'focus:border-primary-500 border-gray-300'
+ )}
+ />
+
+
+
+
+ 등록
+
+
+
+ {error &&
{error}
}
+
+ {toastMsg &&
+ (toastMsg.includes('이미 같은 이름의 카테고리가 있어요') ||
+ toastMsg.includes('이미 공지에 등록된 카테고리는 삭제가 불가해요') ||
+ toastMsg.includes('해당 카테고리로 작성된 공지가 있어 삭제할 수 없습니다.')) && (
+
+ )}
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/category/ColorDropDown.tsx b/src/components/manager/create-notice/category/ColorDropDown.tsx
new file mode 100644
index 0000000..19eea30
--- /dev/null
+++ b/src/components/manager/create-notice/category/ColorDropDown.tsx
@@ -0,0 +1,110 @@
+'use client'
+import { useState, useRef, useEffect } from 'react'
+import clsx from 'clsx'
+import { DownIcon, UpIcon } from '@/assets/svgComponents/manager'
+import { getClientAvailableCategoryColors } from '@/lib/manager/client/notice'
+
+interface DropdownOption {
+ label: string
+ value: string
+ icon?: React.ReactNode
+}
+
+interface ColorSelectDropdownProps {
+ options: DropdownOption[]
+ selected: string
+ onChange: (value: string) => void
+ refreshTrigger?: number
+ placeholder?: string
+}
+
+export default function ColorSelectDropdown({
+ options,
+ selected,
+ onChange,
+ placeholder = '색상',
+}: ColorSelectDropdownProps) {
+ const [isOpen, setIsOpen] = useState(false)
+ const dropdownRef = useRef(null)
+ const [availableColors, setAvailableColors] = useState([])
+
+ useEffect(() => {
+ // 사용 가능한 컬러 API 연동 -> 타입에러보기
+ getClientAvailableCategoryColors().then((res) => {
+ if (res.success && res.data && Array.isArray(res.data.colors)) {
+ setAvailableColors(res.data.colors)
+ } else if (res.success && Array.isArray(res.data)) {
+ setAvailableColors(res.data)
+ } else {
+ setAvailableColors([])
+ }
+ })
+ }, [])
+
+ // 옵션 중 사용 가능한 컬러만 필터링
+ const filteredOptions = options.filter(
+ (opt) => (Array.isArray(availableColors) && availableColors.includes(opt.value)) || opt.value === selected
+ )
+ const availableOptions = filteredOptions.filter((opt) => opt.value !== selected && opt.value !== '')
+ const selectedOption = filteredOptions.find((opt) => opt.value === selected)
+
+ useEffect(() => {
+ const handleClickOutside = (e: MouseEvent) => {
+ if (!dropdownRef.current?.contains(e.target as Node)) setIsOpen(false)
+ }
+
+ if (isOpen) {
+ document.addEventListener('mousedown', handleClickOutside)
+ return () => document.removeEventListener('mousedown', handleClickOutside)
+ }
+ }, [isOpen])
+
+ const handleSelect = (value: string) => {
+ onChange(value)
+ setIsOpen(false)
+ }
+
+ return (
+
+
setIsOpen(!isOpen)}
+ className={clsx(
+ 'caption-md-medium flex h-[40px] w-[123px] items-center justify-between rounded-[8px] border bg-white px-3 py-2 transition-all',
+ isOpen ? 'border-black text-black' : 'border-gray-300 text-black hover:border-gray-500'
+ )}
+ >
+
+ {selectedOption?.icon}
+
+ {selectedOption?.label || placeholder}
+
+
+ {isOpen ? : }
+
+
+ {isOpen && (
+
+
+ {availableOptions.length > 0 ? (
+ availableOptions.map((option) => (
+
handleSelect(option.value)}
+ className={clsx(
+ 'caption-md-medium flex w-full items-center gap-2 rounded-[4px] px-[10px] py-[10px] text-left hover:bg-gray-100 focus:outline-none',
+ selected === option.value && 'bg-gray-200'
+ )}
+ >
+ {option.icon}
+ {option.label}
+
+ ))
+ ) : (
+
사용 가능한 색상이 없습니다
+ )}
+
+
+ )}
+
+ )
+}
diff --git a/src/components/manager/create-notice/category/CreateNoticeDropDown.tsx b/src/components/manager/create-notice/category/CreateNoticeDropDown.tsx
new file mode 100644
index 0000000..20e6199
--- /dev/null
+++ b/src/components/manager/create-notice/category/CreateNoticeDropDown.tsx
@@ -0,0 +1,45 @@
+'use client'
+
+import { useState } from 'react'
+import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'
+import clsx from 'clsx'
+
+interface DropdownOption {
+ label: string
+ value: string
+}
+
+interface DropdownProps {
+ options: DropdownOption[]
+ selected?: string
+ onChange: (value: string) => void
+ trigger?: React.ReactNode
+}
+
+export default function Dropdown({ options, selected, onChange, trigger }: DropdownProps) {
+ const [open, setOpen] = useState(false)
+
+ return (
+
+ {trigger}
+
+ {options.map((option) => (
+ onChange(option.value)}
+ className={clsx(
+ 'body-md-medium flex cursor-pointer items-center gap-2 rounded-[4px] p-[10px] hover:bg-gray-100 focus:outline-none',
+ selected === option.value && 'bg-gray-200'
+ )}
+ >
+ {option.label}
+
+ ))}
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/notice-add/NoticeAdd.tsx b/src/components/manager/create-notice/notice-add/NoticeAdd.tsx
new file mode 100644
index 0000000..d3fd69e
--- /dev/null
+++ b/src/components/manager/create-notice/notice-add/NoticeAdd.tsx
@@ -0,0 +1,206 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import AddBody from '../../session-schedule/add-post/AddBody'
+import PostHeader from './PostHeader'
+import {
+ postClientNoticeManage,
+ putClientNoticeManage,
+ getClientCategory,
+ postClientNoticeFile,
+ getClientNoticeDetail,
+} from '@/lib/manager/client/notice'
+import NoticeAddHeader from './NoticeAddHeader'
+import { NoticeCategory } from '@/types/manager/notice/type'
+import { useRouter, useSearchParams } from 'next/navigation'
+import NoticeBottomToast from './NoticeBottomToast'
+import dynamic from 'next/dynamic'
+
+const NoticeAddInner = () => {
+ const [title, setTitle] = useState('')
+ const [category, setCategory] = useState([])
+ const [content, setContent] = useState('')
+ const [files, setFiles] = useState([])
+ const [categories, setCategories] = useState([])
+ const [existingFileIds, setExistingFileIds] = useState([]) // 기존 파일 ID -> 수정해야함
+ const [error, setError] = useState<{ title?: boolean; category?: boolean; content?: boolean }>({})
+ const [toastMsg, setToastMsg] = useState('')
+ const router = useRouter()
+ const searchParams = useSearchParams()
+ const isEditMode = searchParams.get('isEditMode') === 'true'
+ const noticeId = searchParams.get('noticeId')
+
+ // 카테고리 조회
+ const fetchCategories = async () => {
+ const response = await getClientCategory()
+ if (response.success && response.data) setCategories(response.data)
+ else console.error('❌ Error fetching categories:', response.error)
+ }
+
+ // 기존 공지 내용 조회
+ const fetchNoticeDetail = async () => {
+ if (isEditMode && noticeId) {
+ const res = await getClientNoticeDetail(parseInt(noticeId))
+ console.log('Fetched notice detail:', res.data?.content)
+ if (res.success && res.data) {
+ const notice = res.data
+ setTitle(notice.title)
+ setContent(notice.content)
+
+ // 기존 카테고리 선택
+ if (notice.categories) {
+ const selectedIds = notice.categories
+ .map((cat) => categories.find((c) => c.name === cat.name)?.id)
+ .filter((id): id is number => !!id)
+ setCategory(selectedIds)
+ }
+
+ // 기존 파일 -> 수정해야함
+ if (notice.fileUrls) {
+ setExistingFileIds(notice.fileUrls.map((f) => f.id))
+ }
+ }
+ }
+ }
+
+ useEffect(() => {
+ fetchCategories()
+ }, [])
+
+ useEffect(() => {
+ if (categories.length > 0) fetchNoticeDetail()
+ }, [categories])
+
+ // 파일 업로드
+ const uploadFilesAndGetIds = async (files: File[]): Promise => {
+ const fileIds: number[] = []
+ for (const file of files) {
+ const ext = file.name.split('.').pop()?.toLowerCase()
+ const fileType: 'FILE' | 'IMAGE' = ['png', 'jpg', 'jpeg', 'webp'].includes(ext || '') ? 'IMAGE' : 'FILE'
+ const sizeMB = Math.max(1, Math.round(file.size / (1024 * 1024)))
+
+ const presignedRes = await postClientNoticeFile(file.name, fileType, sizeMB)
+ if (!presignedRes.success || !presignedRes.data) continue
+
+ const { presignedUrl, fileId } = presignedRes.data
+ try {
+ const uploadRes = await fetch(presignedUrl, {
+ method: 'PUT',
+ body: file,
+ headers: { 'Content-Type': file.type },
+ })
+ if (!uploadRes.ok) throw new Error(`S3 업로드 실패: ${uploadRes.status}`)
+ fileIds.push(fileId)
+ } catch (err) {
+ console.error('S3 업로드 실패:', file.name, err)
+ }
+ }
+ return fileIds
+ }
+
+ // 제출 (등록 / 수정 분기)
+ const handleSubmit = async () => {
+ const newError = {
+ title: !title.trim(),
+ category: category.length === 0,
+ content: !content.trim(),
+ }
+ setError(newError)
+ if (newError.title || newError.category || newError.content) return
+
+ const uploadedFileIds = await uploadFilesAndGetIds(files)
+ const allFileIds = [...existingFileIds, ...uploadedFileIds]
+
+ if (isEditMode && noticeId) {
+ const response = await putClientNoticeManage(parseInt(noticeId), {
+ title,
+ categoryIds: category,
+ content,
+ fileIds: allFileIds,
+ })
+ if (response.success) router.push(`/create-notice/detail/${noticeId}`)
+ else console.error('❌ Error updating notice:', response.error)
+ } else {
+ const response = await postClientNoticeManage({
+ title,
+ categoryIds: category,
+ content,
+ fileIds: uploadedFileIds,
+ })
+ if (response.success && response.data?.id) router.push(`/create-notice/detail/${response.data.id}`)
+ else console.error('❌ Error creating notice:', response.error)
+ }
+ }
+
+ // 카테고리 선택 제한
+ const handleSetCategory: typeof setCategory = (value) => {
+ if (typeof value === 'function') {
+ setCategory((prev) => {
+ const next = value(prev)
+ if (next.length > 3) {
+ setToastMsg('카테고리는 최대 3개까지 설정할 수 있어요')
+ return prev
+ }
+ return next
+ })
+ } else {
+ if (value.length > 3) {
+ setToastMsg('카테고리는 최대 3개까지 설정할 수 있어요')
+ return
+ }
+ setCategory(value)
+ }
+ }
+
+ // 이미지 선택 제한
+ const handleSetFiles: typeof setFiles = (value) => {
+ if (typeof value === 'function') {
+ setFiles((prev) => {
+ const next = value(prev)
+ if (next.length > 8) {
+ setToastMsg('이미지는 최대 8개까지 등록 가능해요')
+ return prev
+ }
+ return next
+ })
+ } else {
+ if (value.length > 8) {
+ setToastMsg('이미지는 최대 8개까지 등록 가능해요')
+ return
+ }
+ setFiles(value)
+ }
+ }
+
+ useEffect(() => {
+ if (toastMsg) {
+ const timer = setTimeout(() => setToastMsg(''), 2000)
+ return () => clearTimeout(timer)
+ }
+ }, [toastMsg])
+
+ return (
+ <>
+
+
+
+ >
+ )
+}
+
+// CSR에서만 렌더링되게 dynamic import로 감싸기
+export default dynamic(() => Promise.resolve(NoticeAddInner), { ssr: false })
diff --git a/src/components/manager/create-notice/notice-add/NoticeAddHeader.tsx b/src/components/manager/create-notice/notice-add/NoticeAddHeader.tsx
new file mode 100644
index 0000000..41ce6ec
--- /dev/null
+++ b/src/components/manager/create-notice/notice-add/NoticeAddHeader.tsx
@@ -0,0 +1,109 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+import { useRouter } from 'next/navigation'
+import ManagerButton from '../../common/ManagerButton'
+import { ArrowLeftIcon } from '@/assets/svgComponents/manager'
+import ManagerModal from '../../common/ManagerModal'
+import { useSearchParams } from 'next/navigation'
+
+interface NoticeAddHeaderProps {
+ handleSubmit: () => Promise
+}
+
+export default function NoticeAddHeader({ handleSubmit }: NoticeAddHeaderProps) {
+ const router = useRouter()
+ const [saving, setSaving] = useState(false)
+ const [isScrolled, setIsScrolled] = useState(false)
+
+ const searchParams = useSearchParams()
+ const isEditMode = searchParams.get('isEditMode') === 'true'
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setIsScrolled(window.scrollY > 0)
+ }
+ window.addEventListener('scroll', handleScroll)
+ return () => window.removeEventListener('scroll', handleScroll)
+ }, [])
+
+ const handleButtonClick = async () => {
+ setSaving(true)
+ try {
+ const ok = await handleSubmit()
+ if (ok) {
+ console.log('WriteHeader: 저장 성공!')
+ } else {
+ console.log('WriteHeader: 저장 실패')
+ }
+ } finally {
+ setSaving(false)
+ }
+ }
+
+ const [showModal, setShowModal] = useState(false)
+ const handleBackClick = () => {
+ if (isEditMode) {
+ setShowModal(true)
+ } else {
+ router.push('/create-notice')
+ }
+ }
+
+ const handleModalCancel = () => {
+ setShowModal(false)
+ }
+ const handleModalConfirm = () => {
+ setShowModal(false)
+ router.push('/create-notice')
+ }
+
+ return (
+ <>
+
+
+
+ {isEditMode ? '공지 등록' : '공지 수정'}
+
+
+
{isEditMode ? '공지 수정' : '공지 등록'}
+
+ {}} styleSize="sm" styleType="white">
+ 취소
+
+ {}} styleSize="sm" styleType="gray">
+ 예약
+
+
+ {saving ? '저장중...' : '등록'}
+
+
+
+
+
+ {showModal && (
+
+ 작성중인 글을 취소하겠습니까?
+
+ 작성 취소 선택 시, 작성된 글은 저장되지 않습니다.
+
+
+ }
+ confirmLabel="작성 취소"
+ onConfirm={handleModalConfirm}
+ cancelLabel="계속 작성하기"
+ onCancel={handleModalCancel}
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/create-notice/notice-add/NoticeBottomToast.tsx b/src/components/manager/create-notice/notice-add/NoticeBottomToast.tsx
new file mode 100644
index 0000000..aebf49a
--- /dev/null
+++ b/src/components/manager/create-notice/notice-add/NoticeBottomToast.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+
+type NoticeBottomToastProps = {
+ message: string
+}
+
+export default function NoticeBottomToast({ message }: NoticeBottomToastProps) {
+ if (!message) return null
+ return (
+
+ {message}
+
+ )
+}
diff --git a/src/components/manager/create-notice/notice-add/PostHeader.tsx b/src/components/manager/create-notice/notice-add/PostHeader.tsx
new file mode 100644
index 0000000..9c5dda5
--- /dev/null
+++ b/src/components/manager/create-notice/notice-add/PostHeader.tsx
@@ -0,0 +1,76 @@
+'use client'
+
+import { Dispatch, SetStateAction } from 'react'
+import ImageUpload from '../../session-schedule/add-post/ImageUpload'
+import { NoticeCategory } from '@/types/manager/notice/type'
+
+type PostHeaderProps = {
+ title: string
+ setTitle: Dispatch>
+ setCategory: Dispatch>
+ files: File[]
+ setFiles: Dispatch>
+ categories: NoticeCategory[]
+ selectedCategoryIds?: number[] // 선택된 카테고리
+ error?: {
+ title?: boolean
+ category?: boolean
+ }
+}
+
+export default function PostHeader({
+ title,
+ setTitle,
+ setCategory,
+ files,
+ setFiles,
+ categories,
+ selectedCategoryIds = [],
+ error = {},
+}: PostHeaderProps) {
+ const clickCheckbox = (id: number) => {
+ setCategory((prev) => {
+ if (prev.includes(id)) return prev.filter((catId) => catId !== id)
+ return [...prev, id]
+ })
+ }
+
+ return (
+
+
+
+ 제목
+ {error.title && 필수 항목입니다 }
+
+
setTitle(e.target.value)}
+ placeholder="공지 제목을 입력해주세요."
+ className={`mt-1 w-full rounded-xl border px-4 py-3 text-sm outline-none ${error.title ? 'border-red-400' : 'border-gray-200'}`}
+ />
+
+
+
+ 카테고리
+ {error.category && 필수 항목입니다 }
+
+
+ {categories.map((cat) => (
+
+ clickCheckbox(cat.id)}
+ />
+ {cat.name}
+
+ ))}
+
+
+
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/notice-detail/NoticeDetail.tsx b/src/components/manager/create-notice/notice-detail/NoticeDetail.tsx
new file mode 100644
index 0000000..66e9b78
--- /dev/null
+++ b/src/components/manager/create-notice/notice-detail/NoticeDetail.tsx
@@ -0,0 +1,83 @@
+'use client'
+
+import { NoticeManageResponse } from '@/types/manager/notice/type'
+import { getCategoryClass } from '@/utils/manager/notice'
+import NoticeDetailHeader from './NoticeDetailHeader'
+import { LinkIcon } from '@/assets/svgComponents/manager'
+import { useRouter } from 'next/navigation'
+
+export default function NoticeDetail(notice: NoticeManageResponse) {
+ console.log('notice:', notice)
+
+ const imageUrls = notice.imageUrls || []
+ const fileUrls = notice.fileUrls || []
+ const router = useRouter()
+
+ const handleEdit = async (): Promise => {
+ await router.push(`/create-notice/add?isEditMode=true¬iceId=${notice.id}`)
+ }
+
+ // 읽기 모드일 때
+ return (
+
+
+
+
+
+
+ {notice.categories.map((cat) => (
+
+ {cat.name}
+
+ ))}
+
+
+
{notice.title}
+
{notice.createdAt}
+
+
+
+ {fileUrls.length > 0 && (
+
+ {fileUrls.map((file) => (
+
+ ))}
+
+ )}
+
+ {imageUrls.length > 0 && (
+
+
+ {imageUrls.map((img, idx) => (
+
+
+
+ ))}
+
+
+ )}
+
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/notice-detail/NoticeDetailHeader.tsx b/src/components/manager/create-notice/notice-detail/NoticeDetailHeader.tsx
new file mode 100644
index 0000000..95d6a35
--- /dev/null
+++ b/src/components/manager/create-notice/notice-detail/NoticeDetailHeader.tsx
@@ -0,0 +1,102 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+import { useRouter, usePathname } from 'next/navigation'
+import ManagerButton from '../../common/ManagerButton'
+import { ArrowLeftIcon } from '@/assets/svgComponents/manager'
+import ManagerModal from '../../common/ManagerModal'
+
+interface NoticeAddHeaderProps {
+ title: string
+ handleSubmit: () => Promise
+}
+
+export default function NoticeDetailHeader({ title, handleSubmit }: NoticeAddHeaderProps) {
+ const router = useRouter()
+ const pathname = usePathname()
+ const [isEditing, setEditing] = useState(false)
+ const [saving, setSaving] = useState(false)
+ const [isScrolled, setIsScrolled] = useState(false)
+
+ const isDetailAddPage = pathname?.includes('/detail-add')
+ const isEditMode = isDetailAddPage || isEditing
+
+ useEffect(() => {
+ const handleScroll = () => setIsScrolled(window.scrollY > 0)
+ window.addEventListener('scroll', handleScroll)
+ return () => window.removeEventListener('scroll', handleScroll)
+ }, [])
+
+ const handleButtonClick = async () => {
+ if (!isEditMode) {
+ setEditing(true)
+ return
+ }
+
+ setSaving(true)
+ try {
+ await handleSubmit()
+ } finally {
+ setSaving(false)
+ }
+ }
+
+ const [showModal, setShowModal] = useState(false)
+ const handleBackClick = () => {
+ if (isEditMode) {
+ setShowModal(true)
+ } else {
+ router.push('/create-notice')
+ }
+ }
+
+ const handleModalCancel = () => setShowModal(false)
+ const handleModalConfirm = () => {
+ setEditing(false)
+ setShowModal(false)
+ router.push('/create-notice')
+ }
+
+ return (
+ <>
+
+
+
+ 공지 등록
+
+
+
{title}
+
+
+ {saving ? '저장중...' : '수정하기'}
+
+
+
+
+
+ {showModal && (
+
+ 작성중인 글을 취소하겠습니까?
+
+ 작성 취소 선택 시, 작성된 글은 저장되지 않습니다.
+
+
+ }
+ confirmLabel="작성 취소"
+ onConfirm={handleModalConfirm}
+ cancelLabel="계속 작성하기"
+ onCancel={handleModalCancel}
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/create-notice/notice-list/CreateNoticeBody.tsx b/src/components/manager/create-notice/notice-list/CreateNoticeBody.tsx
new file mode 100644
index 0000000..d3bbdb5
--- /dev/null
+++ b/src/components/manager/create-notice/notice-list/CreateNoticeBody.tsx
@@ -0,0 +1,144 @@
+'use client'
+
+import { useEffect, useState, useRef, useCallback } from 'react'
+import { NoticeSettingIcon } from '@/assets/svgComponents/manager'
+import CreateNoticeDropDown from '../category/CreateNoticeDropDown'
+import { getClientNoticeList, deleteClientNoticeManage } from '@/lib/manager/client/notice'
+import { NoticeListItem } from '@/types/manager/notice/type'
+import { getCategoryClass } from '@/utils/manager/notice'
+import { useRouter } from 'next/navigation'
+
+export default function CreateNoticeBody() {
+ const [notices, setNotices] = useState([])
+ const [selectedSetting, setSelectedSetting] = useState('')
+ const [page, setPage] = useState(1)
+ const [isLastPage, setIsLastPage] = useState(false)
+ const [loading, setLoading] = useState(false)
+ const observerRef = useRef(null)
+ const gridTemplate = '67px 613px 120px 199px 185px 145px 124px 120px 35px'
+ const gridHeaderTemplate = '613px 120px 199px 185px 145px 124px 155px'
+ const router = useRouter()
+
+ const fetchNotices = useCallback(async (pageNum: number) => {
+ setLoading(true)
+ const res = await getClientNoticeList(pageNum, 20)
+ if (res.success && res.data) {
+ setNotices((prev) => [...prev, ...(res?.data?.data ?? [])])
+ setIsLastPage(res.data.isLastPage)
+ } else {
+ console.error('❌ Error fetching notice list:', res.error)
+ }
+ setLoading(false)
+ }, [])
+
+ useEffect(() => {
+ fetchNotices(page)
+ }, [page, fetchNotices])
+
+ useEffect(() => {
+ if (isLastPage) return
+ const observer = new IntersectionObserver(
+ (entries) => {
+ if (entries[0].isIntersecting && !loading && !isLastPage) {
+ setPage((prev) => prev + 1)
+ }
+ },
+ { threshold: 0.5 }
+ )
+ const currentRef = observerRef.current
+ if (currentRef) observer.observe(currentRef)
+ return () => {
+ if (currentRef) observer.unobserve(currentRef)
+ }
+ }, [loading, isLastPage])
+
+ // 삭제 핸들러
+ const handleDelete = async (noticeId: number) => {
+ const res = await deleteClientNoticeManage(noticeId)
+ if (res.success) {
+ setNotices((prev) => prev.filter((n) => n.id !== noticeId))
+ } else {
+ alert('삭제에 실패했습니다.')
+ }
+ }
+ const handleEdit = async (noticeId: number) => {
+ router.push(`/create-notice/add?isEditMode=true¬iceId=${noticeId}`)
+ }
+
+ return (
+
+
+
+ 총 {notices.length} 개
+
+
+
+
+
공지 제목
+
담당자
+
카테고리
+
작성일
+
상태
+
열람자 수
+
사진
+
+ {notices.map((n, idx) => (
+
router.push(`/create-notice/detail/${n.id}`)}
+ >
+
{idx + 1}
+
+
{n.title}
+
{n.content.replace(/<[^>]+>/g, '')}
+
+
{n.authorName}
+
+ {n.categories.map((cat) => (
+
+ {cat.name}
+
+ ))}
+
+
{n.createdAt}
+
{n.status === 'PUBLISHED' && '공개'}
+
20
+
+ {n.imageUrls.length > 0 && (
+
+ )}
+
+
e.stopPropagation()} className="flex items-start justify-end">
+
+
+
+ }
+ options={[
+ { label: '수정', value: '수정' },
+ { label: '삭제', value: '삭제' },
+ ]}
+ selected={selectedSetting}
+ onChange={(value) => {
+ setSelectedSetting(value)
+ if (value === '삭제') handleDelete(n.id)
+ else if (value === '수정') handleEdit(n.id)
+ }}
+ />
+
+
+ ))}
+ {!isLastPage &&
}
+ {loading &&
로딩 중...
}
+
+
+ )
+}
diff --git a/src/components/manager/create-notice/notice-list/CreateNoticeHeader.tsx b/src/components/manager/create-notice/notice-list/CreateNoticeHeader.tsx
new file mode 100644
index 0000000..c803422
--- /dev/null
+++ b/src/components/manager/create-notice/notice-list/CreateNoticeHeader.tsx
@@ -0,0 +1,112 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import { NoticePlusIcon, NoticeTagIcon } from '@/assets/svgComponents/manager'
+import ManagerButton from '../../common/ManagerButton'
+import CategoryModal from '../category/CategoryModal'
+import { useRouter } from 'next/navigation'
+import { getClientCategory } from '@/lib/manager/client/notice'
+import { NoticeCategory } from '@/types/manager/notice/type'
+
+export default function CreateNoticeHeader() {
+ const [showStickyHeader, setShowStickyHeader] = useState(false)
+ const [isCategoryModalOpen, setIsCategoryModalOpen] = useState(false)
+ const [categories, setCategories] = useState([])
+ const router = useRouter()
+
+ // 카테고리 조회
+ const fetchCategories = async () => {
+ const response = await getClientCategory()
+ if (response.success && response.data) setCategories(response.data)
+ else console.error('❌ Error fetching categories:', response.error)
+ }
+ useEffect(() => {
+ fetchCategories()
+ }, [])
+
+ //스크롤 감지
+ useEffect(() => {
+ const handleScroll = () => {
+ const mainContent = document.querySelector('main')
+ if (!mainContent) return
+
+ const currentScroll = mainContent.scrollTop
+ setShowStickyHeader(currentScroll > 0)
+ }
+
+ const mainContent = document.querySelector('main')
+ if (mainContent) {
+ mainContent.addEventListener('scroll', handleScroll)
+ return () => mainContent.removeEventListener('scroll', handleScroll)
+ }
+ }, [])
+
+ // 카테고리 추가
+ const handleAddCategory = async (newCategory: Omit) => {
+ const { postClientCategory } = await import('@/lib/manager/client/notice')
+ await postClientCategory(newCategory.name, newCategory.color)
+ fetchCategories()
+ }
+
+ // 카테고리 삭제
+ const handleDeleteCategory = async (categoryId: string) => {
+ const { deleteClientCategory } = await import('@/lib/manager/client/notice')
+ await deleteClientCategory(Number(categoryId))
+ fetchCategories()
+ }
+
+ // 카테고리 수정
+ const handleEditCategory = async (categoryId: string, updatedCategory: Omit) => {
+ const { putClientCategory } = await import('@/lib/manager/client/notice')
+ await putClientCategory(Number(categoryId), updatedCategory.name, updatedCategory.color)
+ fetchCategories()
+ }
+
+ const HeaderContent = () => (
+ <>
+ 공지 등록
+
+ setIsCategoryModalOpen(true)}
+ >
+
+ 카테고리 편집
+
+
+ router.push('/create-notice/add')} styleSize="sm">
+
+ 공지 등록하기
+
+
+ >
+ )
+
+ return (
+ <>
+ {showStickyHeader && (
+
+
+
+ )}
+
+
+
+
+
+ setIsCategoryModalOpen(false)}
+ categories={categories}
+ onAddCategory={handleAddCategory}
+ onDeleteCategory={handleDeleteCategory}
+ onEditCategory={handleEditCategory}
+ />
+ >
+ )
+}
diff --git a/src/components/manager/member/ApprovalListNew.tsx b/src/components/manager/member/ApprovalListNew.tsx
new file mode 100644
index 0000000..18d147e
--- /dev/null
+++ b/src/components/manager/member/ApprovalListNew.tsx
@@ -0,0 +1,160 @@
+'use client'
+import RoleTag from '@/components/manager/common/RoleTag'
+ const partMap: Record = {
+ BACKEND: '백엔드',
+ FRONTEND: '프론트엔드',
+ DESIGN: '디자인',
+ PLANNING: '기획',
+ }
+
+import { AppleIcon ,KakaoIcon} from '@/assets/svgComponents/manager'
+import { useState, useEffect } from 'react'
+import useScrollSync from '@/utils/manager/useScrollSync'
+import Dropdown from '../common/ManagerdropDown'
+import { DownIcon, UpIcon } from '@/assets/svgComponents/manager'
+import { MemberApprovalRequestListResponse, MemberApprovalRequestResponse } from '@/types/manager/member/types'
+import ImageModal from '@/components/manager/modal/imageModal'
+import { useMemberApprovalStore } from '@/store/manager/useMemberApprovalStore'
+import { ManageImage } from '@/assets/svgComponents/manager'
+
+export default function ApprovalListNew({ data }: { data?: MemberApprovalRequestListResponse }) {
+ const [members] = useState(data?.members.data || [])
+ const [modalOpen, setModalOpen] = useState(false)
+ const [modalIndex, setModalIndex] = useState(0)
+ // 사진 컬럼 추가로 gridTemplate도 컬럼 개수에 맞게 수정해야 함
+ const gridTemplate = '132px 171px 163px 185px 419px 170px 404px 170px'
+ const { containerRef, headerScrollRef, isScrolled } = useScrollSync()
+ const { selections, setSelection, setApprovalMembers } = useMemberApprovalStore()
+
+ const APPROVAL_OPTIONS = [
+ { label: '선택', value: '' },
+ { label: '승인', value: 'APPROVED' },
+ { label: '거절', value: 'REJECTED' },
+ ]
+
+ // 승인요청 멤버 배열을 store에 저장
+ useEffect(() => {
+ setApprovalMembers(members)
+ }, [members, setApprovalMembers])
+
+ return (
+ <>
+
+
+
+
+
이름
+
사진
+
파트
+
학교
+
학과
+
전화번호
+
로그인한 소셜 계정
+
승인 여부
+
+
+
+
+
+
+ {members.map((m, i) => (
+
+
+ {m.name}
+
+
+ {
+ setModalIndex(i)
+ setModalOpen(true)
+ }}
+ className="bg-gray-100 body-lg-regular flex h-[40px] max-w-[119px] items-center justify-center rounded-[4px] border border-gray-200 px-4 text-center text-gray-800 hover:bg-gray-100 gap-2"
+ >
+
+
+ {m.profileImageUrl ? (
+
+ {m.profileImageUrl.split('/').pop()}
+
+ ) : (
+ 사진없음
+ )}
+
+
+
+
+
+
+
+ {m.school}
+
+
+ {m.major}
+
+
+ {m.phoneNumber}
+
+
+ {m.socialType=== 'APPLE' ?
:
}
+
{m.email}
+
+
+ setSelection(i, v as 'APPROVED' | 'REJECTED' | '')}
+ rightIcon={ }
+ rightIconActive={ }
+ showValueInsteadOfLabel={false}
+ placeholder={
+ m.approval === 'APPROVED' ? '승인'
+ : m.approval === 'REJECTED' ? '반려'
+ : '선택'
+ }
+ size="sm"
+ textColor={
+ !selections[i] || selections[i] === ''
+ ? 'text-gray-00'
+ : 'text-blue-500'
+ }
+ />
+
+
+ ))}
+
+
+ {modalOpen && (
+
setModalOpen(false)}
+ customClassName="px-[60px] gap-[60px]"
+ />
+ )}
+
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/manager/member/MemberHeader.tsx b/src/components/manager/member/MemberHeader.tsx
new file mode 100644
index 0000000..625767f
--- /dev/null
+++ b/src/components/manager/member/MemberHeader.tsx
@@ -0,0 +1,200 @@
+'use client'
+
+import React, { useState, useEffect } from 'react'
+import ManagerButton from '../common/ManagerButton'
+import { useMemberStore } from '@/store/manager/useMemberStore'
+import { NewIcon } from '@/assets/svgComponents/manager'
+import { ManagementRightIcon } from '@/assets/svgComponents/manager'
+import { patchClientStaffProfile } from '@/lib/member/client/staff'
+import { useMemberTableStore } from '@/store/manager/useMemberTableStore'
+import { useMemberApprovalStore } from '@/store/manager/useMemberApprovalStore'
+import { patchClientStaffApprovalStatusBatch } from '@/lib/member/client/staff'
+import ManagerModal from '../common/ManagerModal'
+
+export default function MemberHeader(memberLength?: number) {
+ const { isEditMode, toggleEditMode, isApprovalView, setApprovalView } = useMemberStore()
+ const [pendingApprovals, setPendingApprovals] = useState(2)
+ const {
+ members,
+ editBuffer,
+ clearEditBuffer,
+ } = useMemberTableStore()
+ const { selections, clearSelections, approvalMembers } = useMemberApprovalStore()
+ const [loadingApproval, setLoadingApproval] = useState(false)
+ const [loadingProfile, setLoadingProfile] = useState(false)
+ const [approvalModalOpen, setApprovalModalOpen] = useState(false)
+ const [approvalFeedback, setApprovalFeedback] = useState(null)
+ const [showFeedbackModal, setShowFeedbackModal] = useState(false)
+
+ // 항상 페이지 진입 시 학회원관리 탭이 보이도록
+ useEffect(() => {
+ setApprovalView(false)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ // 프로필 저장 핸들러 (학회원관리)
+ const handleSaveProfiles = async () => {
+ setLoadingProfile(true)
+ const requiredFields = ['name', 'school', 'major', 'part', 'phoneNumber']
+ const requests = Object.entries(editBuffer)
+ .filter(([_, patch]) => Object.keys(patch).length > 0)
+ .map(([idx, patch]) => {
+ const member = members[Number(idx)]
+ if (!member) return null
+ // 모든 필수 필드를 patch에 없으면 member에서 채워서 보냄
+ const fullPatch = { ...patch } as Record
+ requiredFields.forEach(field => {
+ if (fullPatch[field] === undefined || fullPatch[field] === '') {
+ fullPatch[field] = (member as Record)[field]
+ }
+ })
+ // 필수 필드가 모두 채워졌는지 확인
+ const hasAllFields = requiredFields.every(
+ field => fullPatch[field] !== undefined && String(fullPatch[field]).trim() !== ''
+ )
+ if (!hasAllFields) return null
+ return patchClientStaffProfile(member.memberId, fullPatch)
+ })
+ .filter(Boolean)
+ if (requests.length > 0) await Promise.all(requests)
+ clearEditBuffer()
+ setLoadingProfile(false)
+ toggleEditMode() // 저장 후 수정모드 해제
+ }
+
+ // 승인/거절 저장 핸들러 (회원가입 승인)
+ const handleSaveApprovals = async () => {
+ setLoadingApproval(true)
+ let feedbackMsg = ''
+ try {
+ const payload = Object.entries(selections)
+ .filter(([_, status]) => status === 'APPROVED' || status === 'REJECTED')
+ .map(([idx, status]) => {
+ const member = approvalMembers?.[Number(idx)]
+ if (!member) {
+ console.error(`approvalMembers[${idx}] is undefined`)
+ return null
+ }
+ const memberId = member.memberId ?? member.id
+ if (!memberId) {
+ console.error(`Member at index ${idx} has no memberId or id`, member)
+ return null
+ }
+ return { memberId, status }
+ })
+ .filter(Boolean)
+
+ if (payload.length > 0) {
+ await patchClientStaffApprovalStatusBatch(payload)
+ feedbackMsg = '성공적으로 저장되었습니다.'
+ } else {
+ feedbackMsg = '변경사항이 없습니다.'
+ }
+ } catch (e) {
+ feedbackMsg = '저장에 실패했습니다.'
+ }
+ setApprovalFeedback(feedbackMsg)
+ setShowFeedbackModal(true)
+ clearSelections()
+ setLoadingApproval(false)
+ }
+
+ // 저장하기 버튼 클릭 시 모달 오픈
+ const handleApprovalSaveClick = () => {
+ setApprovalModalOpen(true)
+ }
+
+ // 피드백 모달 닫기
+ const handleApprovalFeedbackClose = () => {
+ setShowFeedbackModal(false)
+ setApprovalFeedback(null)
+ }
+
+ // 모달에서 확인 시 모달 닫기 + 기존 저장 로직 호출
+ const handleApprovalModalConfirm = async () => {
+ setApprovalModalOpen(false)
+ await handleSaveApprovals()
+ }
+
+ // 모달에서 취소 시 모달 닫기
+ const handleApprovalModalCancel = () => {
+ setApprovalModalOpen(false)
+ }
+
+ return (
+
+
+ {isApprovalView ? (
+
+ ) : (
+
학회원 관리
+ )}
+
+
+
+ {isApprovalView ? (
+ setApprovalView(false)}
+ >
+ 학회원 관리
+
+ ) : (
+ setApprovalView(true)}
+ >
+ 승인요청{memberLength}
+
+ )}
+ setPendingApprovals((n) => n + 1)} aria-hidden />
+ {!isApprovalView && pendingApprovals > 0 && (
+
+
+
+ )}
+
+ {isApprovalView ? (
+
+ {loadingApproval ? '저장 중...' : '저장하기'}
+
+ ) : (
+
+ {loadingProfile ? '저장 중...' : isEditMode ? '저장하기' : '수정하기'}
+
+ )}
+
+ {/* 저장 확인 모달 */}
+
+ {showFeedbackModal && approvalFeedback && (
+
+ )}
+
+ )
+}
diff --git a/src/components/manager/member/MemberManagementClient.tsx b/src/components/manager/member/MemberManagementClient.tsx
new file mode 100644
index 0000000..0db0b2f
--- /dev/null
+++ b/src/components/manager/member/MemberManagementClient.tsx
@@ -0,0 +1,30 @@
+'use client'
+import MemberHeader from '@/components/manager/member/MemberHeader'
+import MemberTable from '@/components/manager/member/MemberTable'
+import ApprovalList from '@/components/manager/member/ApprovalListNew'
+import { useMemberStore } from '@/store/manager/useMemberStore'
+import { useState, useEffect } from 'react'
+import { getClientApprovedStaffMembers, getClientStaffApprovalRequests } from '@/lib/member/client/staff'
+import { MemberApprovalRequestListResponse, MemberListResult } from '@/types/manager/member/types'
+
+export default function MemberManagementClient() {
+ const [approvedStaff, setApprovedStaff] = useState()
+ const [approvalRequests, setApprovalRequests] = useState()
+ const { isApprovalView } = useMemberStore()
+ useEffect(() => {
+ const fetchData = async () => {
+ const approvalRes = await getClientStaffApprovalRequests(1, 80)
+ setApprovalRequests(approvalRes.data)
+ const approvedRes = await getClientApprovedStaffMembers(1, 80)
+ setApprovedStaff(approvedRes.data)
+ }
+ fetchData()
+ }, [])
+
+ return (
+ <>
+ {MemberHeader(approvalRequests?.pendingCount ?? 0)}
+ {isApprovalView ? : }
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/manager/member/MemberTable.tsx b/src/components/manager/member/MemberTable.tsx
new file mode 100644
index 0000000..24aa2cc
--- /dev/null
+++ b/src/components/manager/member/MemberTable.tsx
@@ -0,0 +1,143 @@
+'use client'
+
+import { useEffect, useState, useRef } from 'react'
+import MemberTableRow from './member-row/MemberTableRow'
+import { getClientApprovedStaffMembers } from '@/lib/member/client/staff'
+import { MemberListResult } from '@/types/manager/member/types'
+import { useMemberStore } from '@/store/manager/useMemberStore'
+import { useMemberTableStore } from '@/store/manager/useMemberTableStore'
+import useScrollSync from '@/utils/manager/useScrollSync'
+import ManagerModal from '@/components/manager/common/ManagerModal'
+
+export default function MemberTable({ data }: { data?: MemberListResult }) {
+ const { isEditMode } = useMemberStore()
+ const {
+ members,
+ setMembers,
+ editBuffer,
+ updateEditBufferEntry,
+ clearEditBuffer,
+ applyEditBuffer,
+ isManagerModalOpen,
+ setIsManagerModalOpen,
+ pendingDeleteIndex,
+ setPendingDeleteIndex,
+ isDeleteModalOpen,
+ setIsDeleteModalOpen,
+ } = useMemberTableStore()
+ const [prevEdit, setPrevEdit] = useState(isEditMode)
+ const [revertToken, setRevertToken] = useState(0)
+ const { containerRef, headerScrollRef, isScrolled } = useScrollSync()
+ const feedbackTimerRef = useRef | null>(null)
+ const { feedbackMessage, setFeedbackMessage } = useMemberTableStore()
+ const gridTemplate = '132px 171px 163px 185px 419px 170px 404px'
+
+ useEffect(() => {
+ // data.members가 배열로 오므로 그대로 사용
+ if (data && Array.isArray(data.members.data)) {
+ setMembers(data.members.data)
+ } else {
+ getClientApprovedStaffMembers(1, 80).then(res => {
+ if (res.success && res.data && Array.isArray(res.data.members)) setMembers(res.data.members)
+ })
+ }
+ }, [data, setMembers])
+
+ useEffect(() => {
+ if (prevEdit && !isEditMode) {
+ setIsManagerModalOpen(true)
+ }
+ setPrevEdit(isEditMode)
+ }, [isEditMode, prevEdit, setIsManagerModalOpen])
+ console.log('members', members)
+
+ return (
+ <>
+
+
+
+
+
이름
+
사진
+
파트
+
학교
+
학과
+
전화번호
+
로그인한 소셜 계정
+
+
+
+
+
+
+ {members.map((m, i) => (
+ updateEditBufferEntry(i, patch)}
+ editedValues={editBuffer[i]}
+ />
+ ))}
+
+
+
{
+ setRevertToken((t) => t + 1)
+ clearEditBuffer()
+ setIsManagerModalOpen(false)
+ setFeedbackMessage(저장이 취소되었어요. 다시 시도해주세요 )
+ if (feedbackTimerRef.current) clearTimeout(feedbackTimerRef.current)
+ feedbackTimerRef.current = setTimeout(() => setFeedbackMessage(null), 1200)
+ }}
+ onConfirm={() => {
+ applyEditBuffer()
+ setIsManagerModalOpen(false)
+ setFeedbackMessage(성공적으로 저장되었어요 )
+ if (feedbackTimerRef.current) clearTimeout(feedbackTimerRef.current)
+ feedbackTimerRef.current = setTimeout(() => setFeedbackMessage(null), 1200)
+ }}
+ />
+ {
+ setPendingDeleteIndex(null)
+ setIsDeleteModalOpen(false)
+ }}
+ onConfirm={() => {
+ if (typeof pendingDeleteIndex === 'number') {
+ setMembers((prev) => prev.filter((_, idx) => idx !== pendingDeleteIndex))
+ }
+ setPendingDeleteIndex(null)
+ setIsDeleteModalOpen(false)
+ setFeedbackMessage(삭제되었습니다 )
+ }}
+ confirmLabel={'삭제하기'}
+ cancelLabel={'취소'}
+ reverseButtons={true}
+ />
+ {feedbackMessage && (
+ setFeedbackMessage(null)}
+ onCancel={() => {}}
+ onConfirm={() => {}}
+ />
+ )}
+
+ >
+ )}
+
diff --git a/src/components/manager/member/member-row/EditableTextCell.tsx b/src/components/manager/member/member-row/EditableTextCell.tsx
new file mode 100644
index 0000000..2bb53ee
--- /dev/null
+++ b/src/components/manager/member/member-row/EditableTextCell.tsx
@@ -0,0 +1,31 @@
+'use client'
+
+interface EditableTextCellProps {
+ isEditMode: boolean
+ value: string
+ isModified?: boolean
+ onChange?: (v: string) => void
+ className?: string
+}
+
+export default function EditableTextCell({
+ isEditMode,
+ value,
+ isModified = false,
+ onChange,
+ className = '',
+}: EditableTextCellProps) {
+ return (
+
+ {isEditMode ? (
+
onChange && onChange(e.target.value)}
+ />
+ ) : (
+
{value}
+ )}
+
+ )
+}
diff --git a/src/components/manager/member/member-row/MemberTableRow.tsx b/src/components/manager/member/member-row/MemberTableRow.tsx
new file mode 100644
index 0000000..1500e36
--- /dev/null
+++ b/src/components/manager/member/member-row/MemberTableRow.tsx
@@ -0,0 +1,217 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import ImageModal from '../../modal/imageModal'
+import EditableTextCell from './EditableTextCell'
+import SessionCell from './SessionCell'
+import RoleTag from '@/components/manager/common/RoleTag'
+ const partMap: Record = {
+ BACKEND: '백엔드',
+ FRONTEND: '프론트엔드',
+ DESIGN: '디자인',
+ PLANNING: '기획',
+ }
+ const reversePartMap: Record = {
+ '백엔드': 'BACKEND',
+ '프론트엔드': 'FRONTEND',
+ '디자인': 'DESIGN',
+ '기획': 'PLANNING',
+ }
+import { MemberApprovedResponse } from '@/types/manager/member/types'
+import { AppleIcon , KakaoIcon} from '@/assets/svgComponents/manager'
+import { useMemberTableStore } from '@/store/manager/useMemberTableStore'
+import { ManageImage } from '@/assets/svgComponents/manager'
+export default function MemberTableRow({
+ member,
+ index,
+ isEditMode = false,
+ gridTemplate,
+ revertToken,
+ editedValues,
+ onEdit,
+}: {
+ member: MemberApprovedResponse
+ index: number
+ isEditMode?: boolean
+ gridTemplate?: string
+ revertToken?: number
+ editedValues?: Partial
+ onEdit?: (patch: Partial) => void
+}) {
+ const [modalOpen, setModalOpen] = useState(false)
+ const [modalIndex, setModalIndex] = useState(0)
+ const [name, setName] = useState(editedValues?.name ?? member.name)
+ const [part, setPart] = useState(editedValues?.part ?? member.part)
+ const [school, setSchool] = useState(editedValues?.school ?? member.school)
+ const [major, setMajor] = useState(editedValues?.major ?? member.major)
+ const [phone, setPhone] = useState(editedValues?.phoneNumber ?? member.phoneNumber)
+ const isNameModified = name !== member.name
+ const isPartModified = part !== member.part
+ const isSchoolModified = school !== member.school
+ const isMajorModified = major !== member.major
+ const isPhoneModified = phone !== member.phoneNumber
+ useEffect(() => {
+ setName(editedValues?.name ?? member.name)
+ setPart(editedValues?.part ?? member.part)
+ setSchool(editedValues?.school ?? member.school)
+ setMajor(editedValues?.major ?? member.major)
+ setPhone(editedValues?.phoneNumber ?? member.phoneNumber)
+ }, [member, editedValues])
+
+ useEffect(() => {
+ setName(member.name)
+ setPart(member.part)
+ setSchool(member.school)
+ setMajor(member.major)
+ setPhone(member.phoneNumber)
+ }, [revertToken, member])
+
+ return (
+ <>
+
+
+ {
+ setName(v)
+ if (onEdit) onEdit({ name: v })
+ }}
+ className="w-full"
+ />
+
+
+
+ {
+ setModalIndex(0)
+ setModalOpen(true)
+ }}
+ className="bg-gray-100 body-lg-regular flex h-[40px] min-w-[119px] items-center justify-center rounded-[4px] border border-gray-200 px-4 text-center text-gray-800 hover:bg-gray-100 gap-2"
+ >
+
+
+
+ {member.profileImageUrl
+ ? member.profileImageUrl.split('/').pop()
+ : '사진없음'}
+
+
+
+
+
+
+ {isEditMode ? (
+
{
+ const engPart = reversePartMap[v] || v
+ setPart(engPart)
+ if (onEdit) onEdit({ part: engPart })
+ }}
+ className="w-full flex px-[12px]"
+ />
+ ) : (
+
+
+
+ )}
+
+
+
+ {
+ setSchool(v)
+ if (onEdit) onEdit({ school: v })
+ }}
+ className="w-full"
+ />
+
+
+
+ {
+ setMajor(v)
+ if (onEdit) onEdit({ major: v })
+ }}
+ className="w-full"
+ />
+
+
+
+ {
+ setPhone(v)
+ if (onEdit) onEdit({ phoneNumber: v })
+ }}
+ className="w-full"
+ />
+
+
+
+
+ {member.socialType=== 'APPLE' ? : }
+ {member.email}
+
+ {isEditMode && (
+
{
+ const { setPendingDeleteIndex, setIsDeleteModalOpen } = useMemberTableStore.getState()
+ setPendingDeleteIndex(index)
+ setIsDeleteModalOpen(true)
+ }}
+ className="text-primary-500 border border-primary-400 body-sm-semibold bg-primary-50 w-[73px] rounded-[4px] py-2"
+ >
+ 삭제
+
+ )}
+
+
+ {modalOpen && (
+ setModalOpen(false)}
+ customClassName="px-[60px] gap-[60px]"
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/member/member-row/SessionCell.tsx b/src/components/manager/member/member-row/SessionCell.tsx
new file mode 100644
index 0000000..e7ee2ca
--- /dev/null
+++ b/src/components/manager/member/member-row/SessionCell.tsx
@@ -0,0 +1,55 @@
+'use client'
+
+import React, { useEffect, useState } from 'react'
+import Dropdown from '../../common/ManagerdropDown'
+import { PointupIcon, PointdownIcon } from '@/assets/svgComponents/manager'
+import { MEMBER_OPTIONS } from '@/types/manager/member/types'
+
+interface SessionCellProps {
+ isEditMode: boolean
+ value: string
+ isModified?: boolean
+ onChange?: (value: string) => void
+ className?: string
+}
+
+export default function SessionCell({
+ isEditMode,
+ value,
+ isModified = false,
+ onChange,
+ className = '',
+}: SessionCellProps) {
+ const [selectedLocal, setSelectedLocal] = useState(value)
+
+ useEffect(() => {
+ setSelectedLocal(value)
+ }, [value])
+
+ const handleChange = (v: string) => {
+ if (onChange) onChange(v)
+ setSelectedLocal(v)
+ }
+
+ return (
+
+ {isEditMode ? (
+
+
}
+ rightIconActive={
}
+ />
+
+ ) : (
+
{value || ''}
+ )}
+
+ )
+}
diff --git a/src/components/manager/modal/MemberSelectModal.tsx b/src/components/manager/modal/MemberSelectModal.tsx
new file mode 100644
index 0000000..3dd03b4
--- /dev/null
+++ b/src/components/manager/modal/MemberSelectModal.tsx
@@ -0,0 +1,97 @@
+'use client'
+
+import React, { useState } from 'react'
+import type { Member } from '@/types/manager/member/mockData'
+import { ModalXIcon } from '@/assets/svgComponents/manager'
+
+export default function MemberSelectModal({
+ open,
+ title = '',
+ members = [],
+ onClose,
+ onSave,
+}: {
+ open: boolean
+ title?: string
+ members?: Member[]
+ onClose?: () => void
+ onSave?: (selected: Member[]) => void
+}) {
+ const [selectedIds, setSelectedIds] = useState>(() => {
+ const initial: Record = {}
+ members.forEach((m, i) => {
+ // 운영진(role이 'manager' 또는 '운영진')이거나 checked가 true면 체크
+ if (m.role === 'manager' || m.role === '운영진' || !!m.checked) initial[i] = true
+ })
+ return initial
+ })
+
+ if (!open) return null
+
+ const toggle = (idx: number) => {
+ setSelectedIds((s) => ({ ...s, [idx]: !s[idx] }))
+ }
+
+ const handleSave = () => {
+ const selected = members.filter((_, i) => selectedIds[i])
+ onSave?.(selected)
+ onClose?.()
+ }
+
+ return (
+
+
+
+
+
{title}
+
삭제하려면 선택을 해제한 후 저장해 주세요
+
+
onClose?.()}
+ className="absolute right-0 text-gray-500 hover:text-gray-700"
+ >
+
+
+
+
+
+
+
+
+
+ {members.map((m, i) => (
+
+
+ toggle(i)} type="checkbox" />
+
+
{m.name}
+
{m.part}
+
{m.school}
+
+ ))}
+
+
+
+
+
+
+ 저장하기
+
+
+
+
+ )
+}
diff --git a/src/components/manager/modal/ProfileModal.tsx b/src/components/manager/modal/ProfileModal.tsx
new file mode 100644
index 0000000..79e1061
--- /dev/null
+++ b/src/components/manager/modal/ProfileModal.tsx
@@ -0,0 +1,66 @@
+'use client'
+import { LogOut } from '@/assets/svgComponents/manager'
+import { useRouter } from 'next/navigation'
+import { PhoneIcon } from '@/assets/svgComponents/manager'
+import { handleLogoutAction } from '@/lib/member/actions/auth' // 추가
+
+export default function ProfileModal({
+ name = '김운영',
+ email = 'qwerqwer@gmail.com',
+ onLogout,
+ onMobileView,
+}: {
+ name?: string
+ email?: string
+ onLogout?: () => void
+ onMobileView?: () => void
+}) {
+ const router = useRouter()
+ const handleMobileView = () => {
+ if (onMobileView) {
+ onMobileView()
+ } else {
+ router.push('/home')
+ }
+ }
+
+ const handleLogout = async () => {
+ if (onLogout) {
+ onLogout()
+ } else {
+ await handleLogoutAction()
+ }
+ }
+
+ return (
+
+
+
+
+
+ 모바일 화면으로 보기
+
+
+
+ 로그아웃
+
+
+
+ )
+}
diff --git a/src/components/manager/modal/imageModal.tsx b/src/components/manager/modal/imageModal.tsx
new file mode 100644
index 0000000..6fb5284
--- /dev/null
+++ b/src/components/manager/modal/imageModal.tsx
@@ -0,0 +1,55 @@
+'use client'
+
+import { CancleIcon } from '@/assets/svgComponents/manager'
+import { ImageModalProps } from '@/types/manager/check-document/types'
+import { useState } from 'react'
+
+export default function ImageModal({
+ title = '',
+ titles,
+ images,
+ footerText = '',
+ onClose,
+ customClassName,
+ initialIndex = 0,
+}: ImageModalProps & { initialIndex?: number }) {
+ const [current, setCurrent] = useState(initialIndex)
+
+ if (!images || images.length === 0) return null
+
+ return (
+
+
+
+
+ {titles && titles[current] ? titles[current] : title || '사진'}
+
+
onClose?.()}
+ className="absolute top-1/2 right-0 -translate-y-1/2 text-gray-500 hover:text-gray-700"
+ >
+
+
+
+
+
+
+ {footerText &&
{footerText}
}
+
+
+
+
+ )
+}
diff --git a/src/components/manager/point/PointHeader.tsx b/src/components/manager/point/PointHeader.tsx
new file mode 100644
index 0000000..112c775
--- /dev/null
+++ b/src/components/manager/point/PointHeader.tsx
@@ -0,0 +1,50 @@
+'use client'
+
+import ManagerButton from '../common/ManagerButton'
+import { usePointStore } from '@/store/manager/usePointStore'
+import { usePointTableStore } from '@/store/manager/usePointTableStore'
+import { HeaderArrowRight } from '@/assets/svgComponents/manager'
+
+export default function PointHeader() {
+ const { isEditMode, toggleEditMode } = usePointStore()
+ const { resetToOriginal } = usePointTableStore()
+
+ const handleReset = () => {
+ resetToOriginal()
+ }
+
+ return (
+
+ {isEditMode ? (
+ <>
+ {/* 수정 모드 - 브레드크럼 */}
+
+ 상벌점 조회
+
+ 수정하기
+
+ {/* 수정 모드 - 초기화/저장하기 버튼 */}
+
+
+ 초기화
+
+
+ 저장하기
+
+
+ >
+ ) : (
+ <>
+ {/* 일반 모드 */}
+
상벌점 조회
+
+ 수정하기
+
+ >
+ )}
+
+ )
+}
diff --git a/src/components/manager/point/PointTable.tsx b/src/components/manager/point/PointTable.tsx
new file mode 100644
index 0000000..211141d
--- /dev/null
+++ b/src/components/manager/point/PointTable.tsx
@@ -0,0 +1,113 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import { usePointTableStore } from '@/store/manager/usePointTableStore'
+import { getOverviewClient, getMonthlyClient } from '@/lib/manager/client/points'
+import { useSessionScheduleStore } from '@/store/manager/useSessionScheduleStore'
+import { getClientSessionSchedule } from '@/lib/manager/client/session'
+import PointTableHeader from './PointTableHeader'
+import PointTableBody from './PointTableBody'
+import useScrollSync from '@/utils/manager/useScrollSync'
+import { MonthlyAttendanceResult } from '@/types/manager/point/types'
+import { getKupickMonths } from '@/utils/manager/kupick'
+
+export default function PointTable() {
+ const { collapsedMonths, toggleCollapsedMonth } = usePointTableStore()
+ const setMembers = usePointTableStore((s) => s.setMembers)
+ const setOriginalMembers = usePointTableStore((s) => s.setOriginalMembers)
+ const { getAllSessionDates, setSessions, sessions } = useSessionScheduleStore()
+ const { containerRef, headerScrollRef, isScrolled, isHorizScrolled } = useScrollSync()
+
+ // 월별 데이터 상태 추가
+ const [monthlyData, setMonthlyData] = useState>({})
+ const pointMonth = getKupickMonths()
+
+ const toggleMonth = (month: string) => toggleCollapsedMonth(month)
+
+ // 세션 데이터 먼저 로드
+ useEffect(() => {
+ const loadSessionData = async () => {
+ if (sessions.length === 0) {
+ console.log('포인트 테이블: 세션 데이터 로드 중...')
+ const result = await getClientSessionSchedule()
+ if (result.success && result.data) {
+ setSessions(result.data)
+ console.log('포인트 테이블: 세션 데이터 로드 완료:', result.data)
+ }
+ }
+ }
+
+ loadSessionData()
+ }, [sessions.length, setSessions])
+
+ // 상벌점 조회 데이터 로드
+ useEffect(() => {
+ const fetchData = async () => {
+ const res = await getOverviewClient()
+ if (res.success && res.data) {
+ const membersData = res.data?.map((d) => ({
+ memberId: d.memberId,
+ name: d.name,
+ part: d.part,
+ phoneNumber: d.phoneNumber,
+ school: d.school,
+ major: d.major,
+ isTf: d.isTf,
+ isStaff: d.isStaff,
+ attendanceMonthlyTotals: d.attendanceMonthlyTotals,
+ kupickParticipation: d.kupickParticipation,
+ kuportersPoints: d.kuportersPoints,
+ memo: d.memo,
+ }))
+
+ setMembers(membersData)
+ setOriginalMembers(membersData) // 원본 데이터 저장
+ }
+ }
+
+ fetchData()
+ }, [setMembers, setOriginalMembers])
+
+ // 월별 출결 데이터 로드
+ useEffect(() => {
+ const fetchAllMonthlyData = async () => {
+ const allMonthData: Record = {}
+ const sessionDates = getAllSessionDates()
+
+ console.log('포인트 테이블: 스토어에서 가져온 세션 날짜 키:', Object.keys(sessionDates))
+
+ for (const month of pointMonth) {
+ const result = await getMonthlyClient(month)
+ if (result.success && result.data) {
+ allMonthData[month] = {
+ ...result.data,
+ sessionDates: sessionDates[month] || [],
+ }
+ }
+ }
+
+ setMonthlyData(allMonthData)
+ }
+
+ if (pointMonth.length > 0 && sessions.length > 0 && Object.keys(monthlyData).length === 0) {
+ fetchAllMonthlyData()
+ }
+ }, [sessions.length, pointMonth.length])
+
+ return (
+
+ )
+}
diff --git a/src/components/manager/point/PointTableBody.tsx b/src/components/manager/point/PointTableBody.tsx
new file mode 100644
index 0000000..f1d9ba6
--- /dev/null
+++ b/src/components/manager/point/PointTableBody.tsx
@@ -0,0 +1,139 @@
+'use client'
+
+import React, { useEffect, useRef } from 'react'
+import PointTableRow from './point-row/PointTableRow'
+import BottomToast, { DEFAULT_SHIFT_WHEEL_MESSAGE } from '@/components/manager/common/BottomToast'
+import ManagerModal from '@/components/manager/common/ManagerModal'
+import { usePointTableStore } from '@/store/manager/usePointTableStore'
+import { useSessionScheduleStore } from '@/store/manager/useSessionScheduleStore'
+import usePointStatusHandlers from '@/hooks/manager/point/usePointStatusHandlers'
+import { usePointStore } from '@/store/manager/usePointStore'
+import { computeGridTemplate, computeMinWidth } from '@/utils/manager/computePointTable'
+import type { PointMemberStatus, MonthlyAttendanceResult } from '@/types/manager/point/types'
+import usePointTableActions from '@/hooks/manager/point/usePointTableActions'
+import { getOptimalVisibleDates } from '@/utils/manager/sessionDataConverter'
+
+type Props = {
+ containerRef?: React.RefObject
+ isHorizScrolled?: boolean
+ monthlyData: Record
+}
+
+export default function PointTableBody({ containerRef, isHorizScrolled, monthlyData }: Props) {
+ const {
+ members,
+ setMembers,
+ modifiedCells,
+ setModifiedCells,
+ collapsedMonths,
+ isManagerModalOpen,
+ setIsManagerModalOpen,
+ showToastOnce,
+ setShowToastOnce,
+ feedbackMessage,
+ setFeedbackMessage,
+ } = usePointTableStore()
+
+ const { sessions } = useSessionScheduleStore()
+
+ console.log('모든 월별 데이터:', Object.keys(monthlyData).length, '개월')
+ console.log('바디에서 받은 세션 데이터:', sessions?.length || 0, '개')
+
+ const { isEditMode, setEditMode } = usePointStore()
+ const originalMembersRef = useRef(null)
+
+ const visibleDates = getOptimalVisibleDates(sessions, monthlyData, collapsedMonths)
+
+ const gridTemplate = computeGridTemplate(visibleDates)
+ const contentMinWidth = computeMinWidth(gridTemplate)
+
+ console.log('바디에서 사용할 데이터 타입:', sessions && sessions.length > 0 ? '세션 데이터' : '월별 데이터')
+
+ const handlers = usePointStatusHandlers({
+ members,
+ setMembers,
+ modifiedCells,
+ setModifiedCells,
+ setIsManagerModalOpen,
+ })
+
+ const {
+ handleQportersChange,
+ handleTfChange,
+ handleQpickChange,
+ handleSessionChange,
+ handleNoteChange,
+ handleStaffChange,
+ handleMonthlyAttendanceChange,
+ handleSave,
+ } = handlers
+
+ const prevEditRef = useRef(isEditMode)
+
+ useEffect(() => {
+ if (!prevEditRef.current && isEditMode) {
+ originalMembersRef.current = members.map((m) => ({ ...m }))
+ }
+
+ if (prevEditRef.current && !isEditMode) {
+ handleSave()
+ }
+ prevEditRef.current = isEditMode
+ }, [isEditMode, handleSave])
+
+ useEffect(() => {
+ if (!showToastOnce) return
+ const t = setTimeout(() => setShowToastOnce(false), 3400)
+ return () => clearTimeout(t)
+ }, [showToastOnce, setShowToastOnce])
+ const { confirmSave, cancelSave } = usePointTableActions({
+ members,
+ originalMembersRef,
+ setMembers,
+ setModifiedCells,
+ setEditMode,
+ setIsManagerModalOpen,
+ setFeedbackMessage,
+ })
+
+ return (
+
+ {showToastOnce &&
}
+
+
+ {members.map((member, memberIndex) => (
+
+ ))}
+
+
+
+ {feedbackMessage && (
+
{}}
+ onCancel={() => {}}
+ onConfirm={() => {}}
+ />
+ )}
+
+ )
+}
diff --git a/src/components/manager/point/PointTableHeader.tsx b/src/components/manager/point/PointTableHeader.tsx
new file mode 100644
index 0000000..ed9d994
--- /dev/null
+++ b/src/components/manager/point/PointTableHeader.tsx
@@ -0,0 +1,90 @@
+import { MonthlyAttendanceResult } from '@/types/manager/point/types'
+import { DropLIcon, DropRIcon } from '@/assets/svgComponents/manager'
+import { computeGridTemplate, computeMinWidth } from '@/utils/manager/computePointTable'
+import { useSessionScheduleStore } from '@/store/manager/useSessionScheduleStore'
+import { getOptimalVisibleDates } from '@/utils/manager/sessionDataConverter'
+
+type Props = {
+ collapsedMonths: Set
+ onToggleMonth: (m: string) => void
+ isScrolled: boolean
+ isHorizScrolled?: boolean
+ headerScrollRef: React.RefObject
+ monthlyData: Record
+}
+
+export default function PointTableHeader({
+ collapsedMonths,
+ onToggleMonth,
+ isScrolled,
+ isHorizScrolled,
+ headerScrollRef,
+ monthlyData,
+}: Props) {
+ const { sessions } = useSessionScheduleStore()
+
+ console.log('헤더에서 받은 세션 데이터:', sessions?.length || 0, '개')
+ console.log('헤더에서 받은 월별 데이터:', Object.keys(monthlyData).length, '개월')
+
+ const visibleDates = getOptimalVisibleDates(sessions, monthlyData, collapsedMonths)
+
+ const gridTemplate = computeGridTemplate(visibleDates)
+ const contentMinWidth = computeMinWidth(gridTemplate)
+
+ console.log('사용할 데이터 타입:', sessions && sessions.length > 0 ? '세션 데이터' : '월별 데이터')
+ console.log('visibleDates:', visibleDates)
+
+ return (
+
+
+
+
+
+ 이름
+
+
상벌점
+
파트
+ {visibleDates.map((item, index) => (
+
+ {item.month ? (
+
onToggleMonth(item.month!)} className="flex cursor-pointer items-center">
+
+ {item.month}
+
+ {collapsedMonths.has(item.month) ? (
+
+ ) : (
+
+ )}
+
+ ) : (
+
{item.date}
+ )}
+
+ ))}
+ {['9월 큐픽', '10월 큐픽', '11월 큐픽', 'TF', '큐포터즈', '운영진', '메모', '전화번호', '학교', '학과'].map(
+ (label, i) => (
+
+ {label}
+
+ )
+ )}
+
+
+
+
+ )
+}
diff --git a/src/components/manager/point/point-row/CheckboxCell.tsx b/src/components/manager/point/point-row/CheckboxCell.tsx
new file mode 100644
index 0000000..50754bd
--- /dev/null
+++ b/src/components/manager/point/point-row/CheckboxCell.tsx
@@ -0,0 +1,29 @@
+'use client'
+
+interface CheckboxCellProps {
+ isEditMode: boolean
+ checked: boolean
+ onChange?: (checked: boolean) => void
+ display?: string | number | null
+ className?: string
+}
+
+export default function CheckboxCell({ isEditMode, checked, onChange, display, className = '' }: CheckboxCellProps) {
+ const handleChange = (e: React.ChangeEvent) => {
+ if (onChange) {
+ onChange(e.target.checked)
+ }
+ }
+
+ return (
+
+ {isEditMode ? (
+
+
+
+ ) : (
+
{display}
+ )}
+
+ )
+}
diff --git a/src/components/manager/point/point-row/EditableTextCell.tsx b/src/components/manager/point/point-row/EditableTextCell.tsx
new file mode 100644
index 0000000..be1044b
--- /dev/null
+++ b/src/components/manager/point/point-row/EditableTextCell.tsx
@@ -0,0 +1,35 @@
+'use client'
+
+interface EditableTextCellProps {
+ isEditMode: boolean
+ value: string
+ isModified?: boolean
+ onChange?: (v: string) => void
+ className?: string
+}
+
+export default function EditableTextCell({
+ isEditMode,
+ value,
+ isModified = false,
+ onChange,
+ className = '',
+}: EditableTextCellProps) {
+ return (
+
+ {isEditMode ? (
+
{
+ if (onChange) {
+ onChange(e.target.value)
+ }
+ }}
+ />
+ ) : (
+
{value}
+ )}
+
+ )
+}
diff --git a/src/components/manager/point/point-row/PointTableRow.tsx b/src/components/manager/point/point-row/PointTableRow.tsx
new file mode 100644
index 0000000..ad9337b
--- /dev/null
+++ b/src/components/manager/point/point-row/PointTableRow.tsx
@@ -0,0 +1,417 @@
+'use client'
+
+import { useState } from 'react'
+import { ATTENDANCE_OPTIONS } from '@/constants/manager/point'
+import { usePointTableStore } from '@/store/manager/usePointTableStore'
+import { PointMemberStatus, VisibleDate, MonthlyAttendanceResult } from '@/types/manager/point/types'
+import CheckboxCell from './CheckboxCell'
+import EditableTextCell from './EditableTextCell'
+import SessionCell from './SessionCell'
+import { getPartName } from '@/utils/manager/attendance'
+import RoleTag from '../../common/RoleTag'
+
+interface PointTableRowProps {
+ member: PointMemberStatus
+ memberIndex: number
+ visibleDates: VisibleDate[]
+ isEditMode: boolean
+ onQportersChange: (memberIndex: number, value: string) => void
+ onSessionChange: (memberIndex: number, date: string, value: string) => void
+ modifiedCells: Record
+ onTfChange?: (memberIndex: number, checked: boolean) => void
+ onStaffChange?: (memberIndex: number, checked: boolean) => void
+ onQpickChange?: (memberIndex: number, monthKey: 'september' | 'october' | 'november', checked: boolean) => void
+ onNoteChange?: (memberIndex: number, value: string) => void
+ onMonthlyAttendanceChange?: (memberIndex: number, attendanceId: number, newStatus: string, date: string) => void
+ gridTemplate: string
+ collapsedMonths: Set
+ isHorizScrolled?: boolean
+ monthlyData: Record
+}
+
+export default function PointTableRow({
+ member,
+ memberIndex,
+ visibleDates,
+ isEditMode,
+ onQportersChange,
+ onSessionChange,
+ modifiedCells,
+ onTfChange,
+ onQpickChange,
+ onStaffChange,
+ onNoteChange,
+ onMonthlyAttendanceChange,
+ gridTemplate,
+ collapsedMonths,
+ isHorizScrolled,
+ monthlyData,
+}: PointTableRowProps) {
+ const pendingAttendanceChanges = usePointTableStore((s) => s.pendingAttendanceChanges)
+ const [showMemoTooltip, setShowMemoTooltip] = useState(false)
+ const baseBg = memberIndex % 2 === 0 ? 'bg-white' : 'bg-background1'
+ const isQportersModified = Boolean(modifiedCells && modifiedCells[`${memberIndex}-qporters`])
+ const isNoteModified = Boolean(modifiedCells && modifiedCells[`${memberIndex}-note`])
+
+ // 월별 데이터에서 해당 회원의 출결 정보 추출
+ // console.log('월별 데이터:', monthlyData)
+ // console.log('현재 회원:', member.name, member.memberId)
+
+ // API 데이터에서 회원별 출결 정보를 가져오는 함수
+ const getMemberAttendanceData = (date: string) => {
+ const [monthStr, dayStr] = date.split('/')
+ const month = parseInt(monthStr)
+ const day = parseInt(dayStr)
+
+ const monthData = monthlyData[month]
+ if (!monthData?.members?.data) {
+ return null
+ }
+
+ // 해당 회원 찾기
+ const memberData = monthData.members.data.find((m) => m.memberId === member.memberId)
+ if (!memberData) {
+ return null
+ }
+
+ // 해당 날짜의 출결 기록 찾기 - 여러 형식 시도
+ const currentYear = new Date().getFullYear()
+ const targetDateStr1 = `${currentYear}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`
+ const targetDateStr2 = `${month}/${day}`
+ const targetDateStr3 = `${month.toString().padStart(2, '0')}/${day.toString().padStart(2, '0')}`
+
+ let record = memberData.records.find(
+ (r) => r.date === targetDateStr1 || r.date === targetDateStr2 || r.date === targetDateStr3
+ )
+
+ // 해당 일자의 모든 기록을 찾아서 가장 최근 기록 또는 포인트가 있는 기록 사용
+ const dayRecords = memberData.records.filter((r) => {
+ const recordDate = new Date(r.date)
+ return recordDate.getMonth() + 1 === month && recordDate.getDate() === day
+ })
+
+ if (dayRecords.length > 0) {
+ // 포인트가 0이 아닌 기록을 우선하거나, 없으면 마지막 기록
+ record = dayRecords.find((r) => r.point !== 0) || dayRecords[dayRecords.length - 1]
+ }
+
+ return record
+ }
+
+ // 월별 출석 점수 계산 (API 데이터 기반)
+ const getMonthlyScore = (month: number) => {
+ const monthData = monthlyData[month]
+ if (!monthData?.members?.data) return 0
+
+ const memberData = monthData.members.data.find((m) => m.memberId === member.memberId)
+ if (!memberData) return 0
+
+ // 해당 월의 모든 출결 기록의 점수 합계
+ const totalScore = memberData.records.reduce((sum, record) => {
+ return sum + (record.point || 0)
+ }, 0)
+
+ return totalScore
+ }
+
+ type QpickCol = {
+ key: string
+ value?: boolean | number
+ type: 'qpick' | 'tf'
+ month?: 'september' | 'october' | 'november'
+ }
+ const qpickCols: QpickCol[] = [
+ { key: 'qpick_september', value: member.kupickParticipation?.[9], type: 'qpick', month: 'september' },
+ { key: 'qpick_october', value: member.kupickParticipation?.[10], type: 'qpick', month: 'october' },
+ { key: 'qpick_november', value: member.kupickParticipation?.[11], type: 'qpick', month: 'november' },
+ { key: 'tf', value: member.isTf ? 2 : 0, type: 'tf' },
+ ]
+
+ // 모든 월의 출석 점수 합산
+ const attendanceTotal =
+ Object.values(member.attendanceMonthlyTotals || {}).reduce((s, n) => s + (n || 0), 0)
+
+ // 큐픽 참여 점수 (9, 10, 11월)
+ const kupickPoints =
+ (member.kupickParticipation?.[9] ? 2 : 0) +
+ (member.kupickParticipation?.[10] ? 2 : 0) +
+ (member.kupickParticipation?.[11] ? 2 : 0)
+
+ // TF 점수
+ const tfPoints = member.isTf ? 2 : 0
+
+ // 큐포터즈 점수 (입력값)
+ const kuportersPoints = Number(member.kuportersPoints) || 0
+
+ // 운영진/학회원 점수
+ const staffPoints = member.isStaff ? 1 : 0
+
+ // 모든 점수 합산
+ const totalPoints =
+ attendanceTotal + kupickPoints + tfPoints + kuportersPoints + staffPoints
+
+ return (
+
+
+
+
+ {totalPoints}
+
+
+
+
+
+
+ {visibleDates.map((item, dateIndex) => {
+ if (item.month) {
+ const monthMap: Record
= {
+ '8월': 8,
+ '9월': 9,
+ '10월': 10,
+ '11월': 11,
+ '12월': 12,
+ }
+ const monthKey = monthMap[item.month]
+ const monthScore = monthKey ? getMonthlyScore(monthKey) : 0
+
+ const isCollapsed = collapsedMonths.has(item.month)
+ return (
+
+
+ {isCollapsed ? monthScore : ''}
+
+
+ )
+ }
+
+ const date = item.date
+ // API 데이터에서 해당 날짜의 출결 정보 가져오기
+ const attendanceRecord = getMemberAttendanceData(date)
+
+ // 셀 표시값: 수정 중이면 파란색, 저장 후에는 검정색
+ const attendanceChangeKey = attendanceRecord?.attendanceId ? String(attendanceRecord.attendanceId) : undefined
+ let value = ''
+ let displayClass = ''
+ let isRecordExists = false
+ const pendingChange = attendanceChangeKey ? pendingAttendanceChanges[attendanceChangeKey] : undefined
+ if (isEditMode && pendingChange) {
+ // 수정 중: 변경사항이 있으면 드롭다운 label로 파란색 표시
+ const opt = ATTENDANCE_OPTIONS.find((o) => o.value === pendingChange.status)
+ value = opt ? opt.label : pendingChange.status
+ displayClass = 'text-primary-500'
+ isRecordExists = true
+ } else if (attendanceRecord) {
+ // 저장 후: 항상 attendanceRecord 기준 검정색 표시
+ isRecordExists = true
+ const status = attendanceRecord.status
+ switch (status) {
+ case 'PRESENT':
+ if (attendanceRecord.point === 0) {
+ value = '출석(0)'
+ } else if (attendanceRecord.point === 1) {
+ value = '출석(1)'
+ } else {
+ value = `출석(${attendanceRecord.point})`
+ }
+ displayClass = 'text-gray-900'
+ break
+ case 'ABSENT':
+ case 'ABSENT_WITH_DOC':
+ case 'ABSENT_WITHOUT_DOC':
+ case 'ABSENT_NO_SUBMISSION':
+ if (attendanceRecord.point === -2) {
+ value = '결석(사유 -2)'
+ } else if (attendanceRecord.point === -2) {
+ value = '결석(무단 -2)'
+ } else if (attendanceRecord.point === -3) {
+ value = '결석(미제출 -3)'
+ } else {
+ value = `결석(${attendanceRecord.point})`
+ }
+ displayClass = 'text-gray-900'
+ break
+ case 'LATE':
+ value = '지각(-1)'
+ displayClass = 'text-gray-900'
+ break
+ case 'EARLY_LEAVE':
+ value = '조퇴(-1)'
+ displayClass = 'text-gray-900'
+ break
+ default:
+ value = '미기록'
+ displayClass = 'text-gray-300'
+ isRecordExists = false
+ }
+ } else {
+ value = '미기록'
+ displayClass = 'text-gray-300'
+ isRecordExists = false
+ }
+
+ const keyId = `${memberIndex}-${date}`
+ const isModified = Boolean((modifiedCells && modifiedCells[keyId]) || false)
+ // 월별 출석 변경사항이 있는지 추가로 확인
+
+ const isPendingAttendanceChange = !!(attendanceChangeKey && pendingAttendanceChanges[attendanceChangeKey])
+ const isCellModified = isModified || isPendingAttendanceChange
+
+ // 월별 출결 데이터를 위한 핸들러
+ const handleAttendanceChange = async (newStatus: string) => {
+ if (attendanceRecord?.attendanceId && onMonthlyAttendanceChange) {
+ try {
+ onMonthlyAttendanceChange(memberIndex, attendanceRecord.attendanceId, newStatus, date)
+ } catch (error) {
+ console.error('Failed to update monthly attendance:', error)
+ }
+ } else {
+ // 기존 세션 데이터 처리
+ onSessionChange(memberIndex, date, newStatus)
+ }
+ }
+
+ return (
+
+
+
+ )
+ })}
+
+ {qpickCols.map((col) => {
+ const checked = Boolean(col.value)
+ let displayText = ''
+ if (col.type === 'qpick') displayText = col.value ? '참여' : '미참여'
+ else if (col.type === 'tf') displayText = String(col.value)
+ else displayText = col.value ? 'TF' : ''
+
+ const handleChange = (checked: boolean) => {
+ if (col.type === 'qpick') {
+ if (onQpickChange && col.month) {
+ onQpickChange(memberIndex, col.month as 'september' | 'october' | 'november', checked)
+ }
+ } else if (col.type === 'tf') {
+ if (onTfChange) {
+ onTfChange(memberIndex, checked)
+ }
+ }
+ }
+
+ return (
+
+ )
+ })}
+
+ {(
+ [
+ {
+ key: 'qporters',
+ value: member.kuportersPoints ? String(member.kuportersPoints) : '',
+ isModified: isQportersModified,
+ onChange: (v: string) => onQportersChange(memberIndex, v),
+ },
+ ] as const
+ ).map((col) => (
+ col.onChange(v)}
+ className={`body-lg-medium flex h-[52px] items-center justify-end border-r border-gray-200 px-[13px] text-end text-gray-900 ${baseBg} focus-within:border-primary-500 group-hover:bg-gray-100 focus-within:border-2`}
+ />
+ ))}
+
+ {
+ if (onStaffChange) {
+ onStaffChange(memberIndex, checked)
+ }
+ }}
+ display={member.isStaff ? '운영진(1)' : '학회원'}
+ className={`body-lg-medium flex h-[52px] items-center justify-end border-r border-gray-200 px-[13px] text-end text-gray-900 ${baseBg} group-hover:bg-gray-100`}
+ />
+
+
+
{
+ const memoText = member.memo ?? ''
+ if (memoText.length > 20) {
+ setShowMemoTooltip(!showMemoTooltip)
+ }
+ }}
+ className="cursor-pointer"
+ >
+ onNoteChange && onNoteChange(memberIndex, v)}
+ className={`body-lg-medium flex h-[52px] w-[340px] items-center justify-end overflow-hidden border-r border-gray-200 px-[13px] text-start text-ellipsis whitespace-nowrap text-gray-900 group-hover:bg-gray-100 ${baseBg}`}
+ />
+
+ {showMemoTooltip && (member.memo ?? '').length > 20 && (
+
+ )}
+
+
+
+ {member.phoneNumber}
+
+
+
+ {member.school}
+
+
+
+ {member.major}
+
+
+ )
+}
diff --git a/src/components/manager/point/point-row/SessionCell.tsx b/src/components/manager/point/point-row/SessionCell.tsx
new file mode 100644
index 0000000..a6c73d6
--- /dev/null
+++ b/src/components/manager/point/point-row/SessionCell.tsx
@@ -0,0 +1,52 @@
+'use client'
+
+import Dropdown from '../../common/ManagerdropDown'
+import { PointupIcon, PointdownIcon } from '@/assets/svgComponents/manager'
+import { ATTENDANCE_OPTIONS } from '@/constants/manager/point'
+
+interface SessionCellProps {
+ isEditMode: boolean
+ value: string
+ isModified?: boolean
+ onChange?: (value: string) => void
+ className?: string
+ disabled?: boolean
+}
+
+export default function SessionCell({
+ isEditMode,
+ value,
+ isModified = false,
+ onChange,
+ className = '',
+ disabled = false,
+}: SessionCellProps) {
+ const selectedLabel = ATTENDANCE_OPTIONS.find((opt) => opt.value === value)?.label || value || ''
+ return (
+
+ {isEditMode && !disabled ? (
+
+
onChange && onChange(v)}
+ size="lg"
+ rightIcon={ }
+ rightIconActive={ }
+ />
+
+ ) : (
+
+ {selectedLabel}
+
+ )}
+
+ )
+}
diff --git a/src/components/manager/session-schedule/SessionNone.tsx b/src/components/manager/session-schedule/SessionNone.tsx
new file mode 100644
index 0000000..85393c1
--- /dev/null
+++ b/src/components/manager/session-schedule/SessionNone.tsx
@@ -0,0 +1,33 @@
+'use client'
+import { useRouter } from 'next/navigation'
+import { SessionNoneIcon } from '@/assets/svgComponents/manager'
+import SessionHeader from './session-table/SessionHeader'
+
+export default function SessionNone() {
+ const router = useRouter()
+
+ const handleAdd = () => {
+ router.push('/session-schedule/add')
+ }
+
+ return (
+ <>
+
+
+
+
+
+
세션 일정이 아직 등록되지 않았어요
+
아래 버튼을 눌러 세션을 등록해주세요
+
+
+ 등록하기
+
+
+
+ >
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/AddBody.tsx b/src/components/manager/session-schedule/add-post/AddBody.tsx
new file mode 100644
index 0000000..4d32740
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/AddBody.tsx
@@ -0,0 +1,194 @@
+'use client'
+
+import { useEditor, EditorContent } from '@tiptap/react'
+import StarterKit from '@tiptap/starter-kit'
+import Link from '@tiptap/extension-link'
+import Heading from '@tiptap/extension-heading'
+import { useState, useEffect } from 'react'
+
+import {
+ Tiptap1Icon,
+ Tiptap2Icon,
+ Tiptap3Icon,
+ Tiptap4Icon,
+ Tiptap5Icon,
+ Tiptap6Icon,
+ Tiptap7Icon,
+} from '@/assets/svgComponents/manager'
+
+type Button = {
+ name: string
+ icon: React.ComponentType<{ width: number; height: number }>
+ command: 'link' | ((editor: NonNullable>) => void)
+}
+
+const BUTTONS: Button[] = [
+ { name: 'Bold', command: (e) => e.chain().focus().toggleBold().run(), icon: Tiptap1Icon },
+ { name: 'H1', command: (e) => e.chain().focus().toggleHeading({ level: 1 }).run(), icon: Tiptap2Icon },
+ { name: 'H2', command: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(), icon: Tiptap3Icon },
+ { name: 'H3', command: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(), icon: Tiptap4Icon },
+ { name: 'BulletList', command: (e) => e.chain().focus().toggleBulletList().run(), icon: Tiptap5Icon },
+ { name: 'OrderedList', command: (e) => e.chain().focus().toggleOrderedList().run(), icon: Tiptap6Icon },
+ { name: 'Link', command: 'link', icon: Tiptap7Icon },
+]
+
+type AddBodyProps = {
+ content: string
+ setContent: (v: string) => void
+ error?: boolean
+}
+
+export default function AddBody({ content, setContent, error }: AddBodyProps) {
+ const [isEmpty, setIsEmpty] = useState(true)
+ const [isMounted, setIsMounted] = useState(false)
+
+ // 클라이언트에서만 렌더링
+ useEffect(() => {
+ setIsMounted(true)
+ }, [])
+
+ const editor = useEditor({
+ extensions: [
+ StarterKit.configure({ heading: false }),
+ Heading.configure({ levels: [1, 2, 3] }),
+ Link.configure({
+ openOnClick: true,
+ autolink: true,
+ linkOnPaste: true,
+ HTMLAttributes: {
+ class: 'text-blue-600 underline cursor-pointer',
+ target: '_blank',
+ rel: 'noopener noreferrer',
+ },
+ }),
+ ],
+ content: isMounted ? content : '', // 클라이언트에서만 content 적용
+ immediatelyRender: false,
+ onUpdate: ({ editor }) => {
+ setContent(editor.getHTML())
+ setIsEmpty(editor.isEmpty)
+ },
+ })
+
+ // content가 변경될 때 isEmpty 상태 업데이트
+ useEffect(() => {
+ if (editor && content) {
+ editor.commands.setContent(content) // 수정 모드에서 content 적용
+ const tempDiv = document.createElement('div')
+ tempDiv.innerHTML = content
+ const textContent = tempDiv.textContent || tempDiv.innerText || ''
+ setIsEmpty(textContent.trim().length === 0)
+ }
+ }, [content, editor])
+
+ if (!isMounted || !editor) return null
+
+ const handleClick = (button: Button) => {
+ editor.chain().focus()
+
+ if (button.command === 'link') {
+ const prev = editor.getAttributes('link').href
+ const url = window.prompt('URL을 입력하세요:', prev || '')
+ if (url === null) return
+ if (url === '') {
+ editor.chain().focus().unsetLink().run()
+ } else {
+ editor.chain().focus().setLink({ href: url }).run()
+ }
+ } else {
+ button.command(editor)
+ }
+ }
+
+ const isActive = (name: string) => {
+ if (name.startsWith('H')) {
+ const level = parseInt(name.slice(1))
+ return editor.isActive('heading', { level })
+ }
+ if (name === 'Link') return editor.isActive('link')
+ return editor.isActive(name.toLowerCase())
+ }
+
+ return (
+
+
+
+ {BUTTONS.map((b) => {
+ const Icon = b.icon
+ const active = isActive(b.name)
+ return (
+ e.preventDefault()}
+ onClick={() => handleClick(b)}
+ className={`p-[7px] transition-colors ${
+ active ? 'text-primary-600 bg-gray-200' : 'text-gray-700 hover:bg-gray-100'
+ } border-r border-gray-200`}
+ >
+
+
+ )
+ })}
+
+
+ {isEmpty && (
+
+ 내용을 입력해 주세요...
+
+ )}
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/AddHeader.tsx b/src/components/manager/session-schedule/add-post/AddHeader.tsx
new file mode 100644
index 0000000..40bf6c3
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/AddHeader.tsx
@@ -0,0 +1,28 @@
+'use client'
+
+import SessionHeader from './SessionHeader'
+import { SessionImage } from '@/types/manager/session/type'
+
+type AddHeaderProps = {
+ place: string
+ setPlace: (v: string) => void
+ editImage?: SessionImage[]
+ setEditImage?: (images: SessionImage[]) => void
+ startTime?: string
+ endTime?: string
+ setStartTime: (v: string) => void
+ setEndTime: (v: string) => void
+ date?: string | null
+ files?: File[]
+ setFiles?: (files: File[] | ((prev: File[]) => File[])) => void
+ error?: boolean
+}
+
+export default function AddHeader({ editImage,setEditImage, files = [], setFiles = () => {}, ...props }: AddHeaderProps) {
+ console.log('editImage in AddHeader:', editImage)
+ return (
+
+
+
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/ImageUpload.tsx b/src/components/manager/session-schedule/add-post/ImageUpload.tsx
new file mode 100644
index 0000000..aaf3e86
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/ImageUpload.tsx
@@ -0,0 +1,196 @@
+'use client'
+
+import { useRef, useCallback } from 'react'
+import { CancleIcon, AddPhotoIcon } from '@/assets/svgComponents/manager'
+import { SessionImage } from '@/types/manager/session/type'
+import { deleteDetailImage } from '@/lib/manager/client/session'
+
+type ImageUploadProps = {
+ type?: 'post' | 'session'
+ files: File[]
+ setFiles: (files: File[] | ((prev: File[]) => File[])) => void
+ editImage?: SessionImage[]
+ setEditImage?: (images: SessionImage[]) => void
+}
+
+export default function ImageUpload({
+ files,
+ setFiles,
+ type = 'session',
+ editImage = [],
+ setEditImage,
+}: ImageUploadProps) {
+ const fileInputRef = useRef(null)
+
+ const handleClick = () => fileInputRef.current?.click()
+
+ const validateFiles = (files: File[]): { validFiles: File[]; invalidFiles: File[] } => {
+ // pdf도 허용
+ const allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'pdf']
+ const maxSize = 10 * 1024 * 1024 // 10MB
+
+ const validFiles: File[] = []
+ const invalidFiles: File[] = []
+
+ files.forEach((file) => {
+ const extension = file.name.split('.').pop()?.toLowerCase()
+
+ if (!extension || !allowedExtensions.includes(extension)) {
+ invalidFiles.push(file)
+ return
+ }
+
+ if (file.size > maxSize) {
+ invalidFiles.push(file)
+ return
+ }
+
+ validFiles.push(file)
+ })
+
+ return { validFiles, invalidFiles }
+ }
+
+ const handleFiles = useCallback(
+ (fileList: FileList) => {
+ const newFiles = Array.from(fileList)
+ const { validFiles, invalidFiles } = validateFiles(newFiles)
+
+ if (invalidFiles.length > 0) {
+ const invalidNames = invalidFiles.map((f) => f.name).join(', ')
+ alert(
+ `다음 파일들이 올바르지 않은 형식이거나 크기가 너무 큽니다:\n${invalidNames}\n\n허용된 형식: JPG, JPEG, PNG, GIF, WEBP\n최대 크기: 10MB`
+ )
+ }
+
+ if (validFiles.length > 0) {
+ setFiles((prev) => [...prev, ...validFiles])
+ }
+
+ if (fileInputRef.current) fileInputRef.current.value = ''
+ },
+ [setFiles]
+ )
+
+ const handleFileChange = (e: React.ChangeEvent) => {
+ if (e.target.files) handleFiles(e.target.files)
+ }
+
+ const handleDrop = (e: React.DragEvent) => {
+ e.preventDefault()
+ handleFiles(e.dataTransfer.files)
+ }
+
+ const handleDragOver = (e: React.DragEvent) => e.preventDefault()
+
+ const handleRemove = (index: number) => setFiles((prev) => prev.filter((_, i) => i !== index))
+
+ // 기존 이미지 삭제
+ const handleRemoveEditImage = async (index: number) => {
+ if (!setEditImage) return
+ const image = editImage[index]
+ if (!image) return
+
+ try {
+ await deleteDetailImage(image.sessionImageId)
+ setEditImage(editImage.filter((_, i) => i !== index))
+ } catch (e) {
+ alert('이미지 삭제에 실패했습니다.')
+ }
+ }
+
+ const formatFileSize = (bytes: number) => `${(bytes / (1024 * 1024)).toFixed(1)}MB`
+
+ // 기존 이미지와 새 파일 모두 없으면 안내 문구
+ const isEmpty = (!editImage || editImage.length === 0) && files.length === 0
+
+ return (
+
+
+ {type === 'post' ? '파일 첨부' : '이미지 첨부'}
+
+ 내 PC
+
+
+
+
+ {isEmpty ? (
+
+ ) : (
+
+
+
+ {/* 기존 이미지(수정모드) */}
+ {editImage &&
+ editImage.map((img, i) => (
+
+
+ {setEditImage && (
+
handleRemoveEditImage(i)}
+ className="mr-[10px] text-gray-400 hover:text-red-500"
+ >
+
+
+ )}
+
+
{img.sessionOriginalFileName}
+
+
-
+
+ ))}
+ {/* 새로 추가된 파일 */}
+ {files.map((file, i) => {
+ const extension = file.name.split('.').pop()?.toLowerCase()
+ const isImage = extension && ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(extension)
+ return (
+
+
+
handleRemove(i)}
+ className="mr-[10px] text-gray-400 hover:text-red-500"
+ >
+
+
+ {isImage && (
+
URL.revokeObjectURL((e.target as HTMLImageElement).src)}
+ />
+ )}
+
{file.name}
+
+
+ {formatFileSize(file.size)}
+
+
+ )
+ })}
+
+
+ )}
+
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/InputField.tsx b/src/components/manager/session-schedule/add-post/InputField.tsx
new file mode 100644
index 0000000..7e519ee
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/InputField.tsx
@@ -0,0 +1,28 @@
+'use client'
+
+type InputFieldProps = {
+ label: React.ReactNode
+ placeholder?: string
+ children?: React.ReactNode
+ value?: string
+ onChange?: (v: string) => void
+}
+
+export default function InputField({ label, placeholder, children, value, onChange }: InputFieldProps) {
+ return (
+
+ {label}
+ {children ? (
+ children
+ ) : (
+ onChange?.(e.target.value)}
+ />
+ )}
+
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/SessionHeader.tsx b/src/components/manager/session-schedule/add-post/SessionHeader.tsx
new file mode 100644
index 0000000..8732f44
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/SessionHeader.tsx
@@ -0,0 +1,164 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+import Dropdown from '../../common/ManagerdropDown'
+import { PointupIcon, PointdownIcon } from '@/assets/svgComponents/manager'
+import InputField from './InputField'
+import ImageUpload from './ImageUpload'
+import { useSessionScheduleStore } from '@/store/manager/useSessionScheduleStore'
+import { SessionImage } from '@/types/manager/session/type'
+
+type SessionHeaderProps = {
+ place: string
+ setPlace: (v: string) => void
+ editImage?: SessionImage[]
+ setEditImage?: (images: SessionImage[]) => void
+ startTime?: string
+ endTime?: string
+ setStartTime: (v: string) => void
+ setEndTime: (v: string) => void
+ date?: string | null
+ files: File[]
+ setFiles: (files: File[] | ((prev: File[]) => File[])) => void
+ error?: boolean
+}
+
+export default function SessionHeader({
+ place,
+ setPlace,
+ startTime,
+ endTime,
+ setStartTime,
+ setEndTime,
+ date,
+ editImage,
+ setEditImage,
+ files,
+ setFiles,
+ error = false,
+}: SessionHeaderProps) {
+ const hourOptions = Array.from({ length: 13 }, (_, i) => ({
+ label: String(11 + i).padStart(2, '0'),
+ value: String(11 + i).padStart(2, '0'),
+ }))
+ const minuteOptions = ['00', '10', '20', '30', '40', '50'].map((v) => ({
+ label: v,
+ value: v,
+ }))
+
+ console.log('SessionHeader - startTime:', editImage)
+ // 기존 시간 값이 있으면 파싱해서 초기값 설정
+ const parseTime = (timeString: string) => {
+ if (!timeString) return ['', '']
+ const [hour, minute] = timeString.split(':')
+ return [hour || '', minute || '']
+ }
+
+ const [selectedHours, setSelectedHours] = useState(() => {
+ const startHourMinute = parseTime(startTime || '')
+ const endHourMinute = parseTime(endTime || '')
+ return [startHourMinute[0], endHourMinute[0]]
+ })
+
+ const [selectedMinutes, setSelectedMinutes] = useState(() => {
+ const startHourMinute = parseTime(startTime || '')
+ const endHourMinute = parseTime(endTime || '')
+ return [startHourMinute[1], endHourMinute[1]]
+ })
+
+ // 초기 시간 값이 변경될 때 상태 업데이트
+ useEffect(() => {
+ if (startTime || endTime) {
+ const startHourMinute = parseTime(startTime || '')
+ const endHourMinute = parseTime(endTime || '')
+ setSelectedHours([startHourMinute[0], endHourMinute[0]])
+ setSelectedMinutes([startHourMinute[1], endHourMinute[1]])
+ }
+ }, [startTime, endTime])
+
+ useEffect(() => {
+ const s = `${selectedHours[0]}:${selectedMinutes[0]}:00`
+ const e = `${selectedHours[1]}:${selectedMinutes[1]}:00`
+ if (selectedHours[0] && selectedMinutes[0]) setStartTime(s)
+ if (selectedHours[1] && selectedMinutes[1]) setEndTime(e)
+ }, [selectedHours, selectedMinutes, setStartTime, setEndTime])
+
+ // error prop으로 상태 제어
+
+ const selectedSessionName = useSessionScheduleStore(
+ (state: import('@/store/manager/useSessionScheduleStore').SessionScheduleStore) => state.selectedSessionName
+ )
+ return (
+
+
{selectedSessionName || '세션이름없음'}
+
장소 {error && !place && 필수 항목입니다 }}
+ placeholder="세션 장소를 입력해 주세요"
+ >
+ setPlace(e.target.value)}
+ />
+
+
+
+ 일시{' '}
+ {error && (!selectedHours[0] || !selectedMinutes[0] || !selectedHours[1] || !selectedMinutes[1]) && (
+ 필수 항목입니다
+ )}
+
+ }
+ >
+
+
+ {date}
+
+ {['시작', '종료'].map((t, idx) => (
+
+ {idx === 1 &&
~ }
+
+
setSelectedHours((prev) => prev.map((p, j) => (j === idx ? v : p)))}
+ triggerClassName={
+ selectedHours[idx] ? 'body-lg-semibold text-primary-500' : 'text-gray-600 body-lg-medium'
+ }
+ rightIcon={ }
+ rightIconActive={ }
+ placeholder="11"
+ />
+
+
:
+
+
setSelectedMinutes((prev) => prev.map((p, j) => (j === idx ? v : p)))}
+ triggerClassName={
+ selectedMinutes[idx] ? 'body-lg-semibold text-primary-500' : 'text-gray-600 body-lg-medium'
+ }
+ rightIcon={ }
+ rightIconActive={ }
+ placeholder="00"
+ />
+
+
+ ))}
+
+
+
+
+
+ )
+}
diff --git a/src/components/manager/session-schedule/add-post/WriteHeader.tsx b/src/components/manager/session-schedule/add-post/WriteHeader.tsx
new file mode 100644
index 0000000..133c2f6
--- /dev/null
+++ b/src/components/manager/session-schedule/add-post/WriteHeader.tsx
@@ -0,0 +1,100 @@
+'use client'
+
+import { useState } from 'react'
+import { useRouter, usePathname } from 'next/navigation'
+import ManagerButton from '../../common/ManagerButton'
+import { ArrowLeftIcon } from '@/assets/svgComponents/manager'
+import { useSessionEdit } from '@/components/manager/session-schedule/session-table/SessionEditContext'
+import { useSessionScheduleStore } from '@/store/manager/useSessionScheduleStore'
+import ManagerModal from '../../common/ManagerModal'
+
+export default function WriteHeader() {
+ const router = useRouter()
+ const pathname = usePathname() || '' // pathname이 undefined일 경우 빈 문자열로 처리
+ const { runSaveHandlers, isEditing, setEditing } = useSessionEdit()
+ const selectedSessionName = useSessionScheduleStore((state) => state.selectedSessionName)
+ const [saving, setSaving] = useState(false)
+
+ // 항상 문자열에서 includes를 사용하도록 보장
+ const isDetailAddPage = pathname.includes('/detail-add')
+ const isEditMode = isDetailAddPage || isEditing
+
+ const handleButtonClick = async () => {
+ if (!isEditMode) {
+ setEditing(true)
+ return
+ }
+
+ setSaving(true)
+ try {
+ const ok = await runSaveHandlers()
+ if (ok) {
+ console.log('WriteHeader: 저장 성공!')
+ if (!isDetailAddPage) {
+ setEditing(false)
+ }
+ } else {
+ console.log('WriteHeader: 저장 실패')
+ }
+ } finally {
+ setSaving(false)
+ }
+ }
+
+ const [showModal, setShowModal] = useState(false)
+ const handleBackClick = () => {
+ if (isEditMode) {
+ setShowModal(true)
+ } else {
+ router.push('/session-schedule/edit')
+ }
+ }
+
+ const handleModalCancel = () => {
+ setShowModal(false)
+ }
+ const handleModalConfirm = () => {
+ setEditing(false)
+ setShowModal(false)
+ router.push('/session-schedule/edit')
+ }
+
+ return (
+ <>
+
+
+
+ 세션 일정
+
+
+
{selectedSessionName || '세션이름없음'}
+
+ {saving ? '저장중...' : isEditMode ? '저장하기' : '수정하기'}
+
+
+
+ {showModal && (
+
+ 작성중인 글을 취소하겠습니까?
+
+ 작성 취소 선택 시, 작성된 글은 저장되지 않습니다.
+
+
+ }
+ confirmLabel="작성 취소"
+ onConfirm={handleModalConfirm}
+ cancelLabel="계속 작성하기"
+ onCancel={handleModalCancel}
+ />
+ )}
+ >
+ )
+}
diff --git a/src/components/manager/session-schedule/session-add/SessionAdd.tsx b/src/components/manager/session-schedule/session-add/SessionAdd.tsx
new file mode 100644
index 0000000..4c20246
--- /dev/null
+++ b/src/components/manager/session-schedule/session-add/SessionAdd.tsx
@@ -0,0 +1,22 @@
+'use client'
+
+import { useState } from 'react'
+import SessionAddForm from './SessionAddForm'
+import SessionAddTable from './SessionAddTable'
+
+export default function SessionAdd() {
+ const [weeks, setWeeks] = useState(null)
+ const [firstDate, setFirstDate] = useState('')
+
+ const handleGenerate = (w: number, d: string) => {
+ setWeeks(w)
+ setFirstDate(d)
+ }
+
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/manager/session-schedule/session-add/SessionAddForm.tsx b/src/components/manager/session-schedule/session-add/SessionAddForm.tsx
new file mode 100644
index 0000000..67dd3f5
--- /dev/null
+++ b/src/components/manager/session-schedule/session-add/SessionAddForm.tsx
@@ -0,0 +1,96 @@
+'use client'
+
+import { useState } from 'react'
+import ManagerButton from '../../common/ManagerButton'
+import ManagerInput from '../../common/ManagerInput'
+import SessionCalendar from './SessionCalendar'
+
+type Props = {
+ initialWeeks?: number
+ initialDate?: string
+ onGenerate: (weeks: number, firstDate: string) => void
+}
+
+export default function SessionAddForm({ initialWeeks, initialDate = '', onGenerate }: Props) {
+ const [weeks, setWeeks] = useState(initialWeeks != null ? String(initialWeeks) : '')
+ const [firstDate, setFirstDate] = useState(initialDate)
+ const [errors, setErrors] = useState<{ weeks?: string; firstDate?: string }>({})
+ const [locked, setLocked] = useState(false)
+
+ const validate = () => {
+ const e: typeof errors = {}
+ const w = Number(weeks)
+ if (!weeks || Number.isNaN(w) || w <= 0) e.weeks = '올바른 주차를 입력해 주세요'
+ if (!firstDate) e.firstDate = '정확한 일자를 입력해 주세요'
+ setErrors(e)
+ return Object.keys(e).length === 0
+ }
+
+ const handleConfirm = () => {
+ if (!validate()) return
+ onGenerate(Number(weeks), firstDate)
+ setLocked(true)
+ }
+
+ const handleReset = () => {
+ setLocked(false)
+ }
+
+ return (
+
+
+
전체 주차
+
{
+ if (locked) return
+ const v = e.target.value
+ if (v === '' || /^\d+$/.test(v)) {
+ if (errors.weeks) setErrors((prev) => ({ ...prev, weeks: undefined }))
+ } else {
+ setErrors((prev) => ({ ...prev, weeks: '숫자만 입력해주세요' }))
+ }
+ setWeeks(v)
+ }}
+ placeholder="'숫자만' 입력해주세요"
+ inputBoxStyle={errors.weeks ? 'error' : 'default'}
+ errorMessage={errors.weeks}
+ className="w-full rounded-[8px] text-sm"
+ size="sm"
+ />
+
+
+
+
첫 세션 날짜
+
{
+ if (locked) return
+ setFirstDate(d)
+ if (errors.firstDate) setErrors((prev) => ({ ...prev, firstDate: undefined }))
+ }}
+ error={errors.firstDate}
+ />
+
+
+
+ {locked ? (
+
+ 재설정
+
+ ) : (
+
+ 확인
+
+ )}
+
+
+ )
+}
diff --git a/src/components/manager/session-schedule/session-add/SessionAddTable.tsx b/src/components/manager/session-schedule/session-add/SessionAddTable.tsx
new file mode 100644
index 0000000..7a3580a
--- /dev/null
+++ b/src/components/manager/session-schedule/session-add/SessionAddTable.tsx
@@ -0,0 +1,125 @@
+'use client'
+
+import { useMemo, useState, useEffect, useCallback } from 'react'
+import { useSessionEdit } from '../session-table/SessionEditContext'
+import SessionTable from '../session-table/SessionTable'
+import { SessionScheduleRequest } from '@/types/manager/session/type'
+import { postClientSessionSchedule } from '@/lib/manager/client/session'
+
+type Row = { weekLabel: string; date: string; name: string; type: string; isHoliday?: boolean }
+
+type Props = {
+ weeks: number | null
+ firstDate?: string
+}
+
+function formatMMDD(d: Date) {
+ const mm = String(d.getMonth() + 1).padStart(2, '0')
+ const dd = String(d.getDate()).padStart(2, '0')
+ return `${mm}/${dd}`
+}
+
+export default function SessionAddTable({ weeks, firstDate }: Props) {
+ const [rows, setRows] = useState([])
+
+ const generated = useMemo(() => {
+ if (!firstDate || weeks == null || weeks <= 0) return []
+ const d0 = new Date(firstDate)
+ return Array.from({ length: weeks }, (_, i) => {
+ const d = new Date(d0)
+ d.setDate(d0.getDate() + i * 7)
+ return { weekLabel: `${i + 1}주차`, date: formatMMDD(d), name: '', type: '선택', isHoliday: false }
+ })
+ }, [weeks, firstDate])
+
+ useEffect(() => setRows(generated), [generated])
+
+ // 모든 입력값이 채워졌는지 체크해서 window에 상태 저장 및 이벤트 dispatch
+ useEffect(() => {
+ const allFilled =
+ rows.length > 0 &&
+ rows.every((r) => r.name && r.name.trim() !== '' && r.type && r.type !== '선택') &&
+ weeks != null &&
+ weeks > 0 &&
+ firstDate
+ window.__sessionAddAllFilled = allFilled
+ window.dispatchEvent(new Event('sessionAddFilledChange'))
+ }, [rows, weeks, firstDate])
+
+ const formatYYYYMMDD = (d: Date) => {
+ const yyyy = d.getFullYear()
+ const mm = String(d.getMonth() + 1).padStart(2, '0')
+ const dd = String(d.getDate()).padStart(2, '0')
+ return `${yyyy}-${mm}-${dd}`
+ }
+
+ const handleSave = useCallback(async () => {
+ if (!firstDate) return false
+ const d0 = new Date(firstDate)
+ const mapCategory = (label: string) => {
+ if (label === '기업프로젝트') return 'CORPORATE_PROJECT'
+ if (label === '네트워킹') return 'NETWORKING'
+ if (label === '밋업프로젝트') return 'MEETUP_PROJECT'
+ if (label === '휴회') return 'REST'
+ if (label === '선택') return 'NONE'
+ return label
+ }
+
+ const allowedCategories = new Set(['CORPORATE_PROJECT', 'NETWORKING', 'MEETUP_PROJECT', 'REST', 'STUDY', 'NONE'])
+
+ for (let i = 0; i < rows.length; i++) {
+ const r = rows[i]
+ if (!r.name || r.name.trim() === '') {
+ return false
+ }
+ const mapped = mapCategory(r.type)
+ if (!allowedCategories.has(mapped)) {
+ return false
+ }
+ }
+
+ const payload: SessionScheduleRequest = rows.map((r, i) => {
+ const d = new Date(d0)
+ d.setDate(d0.getDate() + i * 7)
+ return {
+ week: i + 1,
+ sessionDate: formatYYYYMMDD(d),
+ title: r.name,
+ category: mapCategory(r.type),
+ isHoliday: Boolean(r.isHoliday),
+ }
+ })
+
+ try {
+ const res = await postClientSessionSchedule(payload)
+ if (res.success) {
+ return true
+ } else {
+ return false
+ }
+ } catch {
+ return false
+ }
+ return false
+ }, [firstDate, rows])
+
+ const { registerSaveHandler } = useSessionEdit()
+
+ useEffect(() => {
+ const unregister = registerSaveHandler(handleSave)
+ return unregister
+ }, [handleSave, registerSaveHandler])
+
+ return (
+
+ setRows((prev) => prev.map((r, idx) => (idx === i ? { ...r, name: v } : r)))}
+ onTypeChange={(i, v) => setRows((prev) => prev.map((r, idx) => (idx === i ? { ...r, type: v } : r)))}
+ onHolidayChange={(i, v) => setRows((prev) => prev.map((r, idx) => (idx === i ? { ...r, isHoliday: v } : r)))}
+ />
+
+ )
+}
diff --git a/src/components/manager/session-schedule/session-add/SessionCalendar.tsx b/src/components/manager/session-schedule/session-add/SessionCalendar.tsx
new file mode 100644
index 0000000..b18d9ba
--- /dev/null
+++ b/src/components/manager/session-schedule/session-add/SessionCalendar.tsx
@@ -0,0 +1,131 @@
+'use client'
+
+import { useState, useMemo } from 'react'
+import { ChevronLeft, ChevronRight, CalendarIcon, CalendarOnIcon } from '@/assets/svgComponents/manager'
+
+type Props = {
+ value?: string
+ onChange: (dateString: string) => void
+ error?: string
+}
+
+function getDaysInMonth(date: Date) {
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
+}
+
+function getFirstDayOfMonth(date: Date) {
+ return new Date(date.getFullYear(), date.getMonth(), 1).getDay()
+}
+
+export default function SessionCalendar({ value, onChange, error }: Props) {
+ const [showCalendar, setShowCalendar] = useState(false)
+ const initial = value ? new Date(value) : new Date()
+ const [calendarDate, setCalendarDate] = useState(initial)
+
+ const generateCalendarDays = useMemo(() => {
+ const daysInMonth = getDaysInMonth(calendarDate)
+ const firstDay = getFirstDayOfMonth(calendarDate)
+ const days: Array = []
+ for (let i = 0; i < firstDay; i++) days.push(null)
+ for (let i = 1; i <= daysInMonth; i++) days.push(i)
+ return days
+ }, [calendarDate])
+
+ const handleDateClick = (day: number) => {
+ const year = calendarDate.getFullYear()
+ const month = String(calendarDate.getMonth() + 1).padStart(2, '0')
+ const date = String(day).padStart(2, '0')
+ const dateString = `${year}-${month}-${date}`
+ onChange(dateString)
+ setShowCalendar(false)
+ }
+
+ const handlePrevMonth = () => setCalendarDate(new Date(calendarDate.getFullYear(), calendarDate.getMonth() - 1))
+ const handleNextMonth = () => setCalendarDate(new Date(calendarDate.getFullYear(), calendarDate.getMonth() + 1))
+
+ const formatDateForDisplay = (dateStr?: string) => {
+ if (!dateStr) return ''
+ const date = new Date(dateStr)
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const year = date.getFullYear()
+ return `${month}/${day}/${year}`
+ }
+
+ const dayLabels = ['일', '월', '화', '수', '목', '금', '토']
+
+ return (
+