├── .github └── workflows │ ├── ci.yml │ └── vrt.yml ├── CLAUDE.md ├── README.md ├── api ├── README.md ├── api │ └── index.go ├── go.mod └── go.sum ├── docs └── screenshot.png └── web ├── .env.local.sample ├── .gitignore ├── .node-version ├── README.md ├── biome.json ├── next.config.js ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── postcss.config.js ├── src ├── __vrt__ │ └── vrt.test.ts └── app │ ├── _auth │ ├── getServerSession.ts │ └── options.ts │ ├── _components │ ├── Alert.tsx │ ├── Button.tsx │ ├── Footer.tsx │ ├── GitHubStarButton.tsx │ ├── forms │ │ ├── Input.tsx │ │ ├── Label.tsx │ │ ├── Textarea.tsx │ │ └── index.ts │ └── index.ts │ ├── _features │ ├── CopyToClipboardButton │ │ ├── CopyToClipboardButton.tsx │ │ ├── Tooltip.tsx │ │ ├── index.ts │ │ └── useSuccessTooltip.tsx │ ├── GitHubNippouMain │ │ ├── DateInput.tsx │ │ ├── GistIdInput.tsx │ │ ├── GitHubNippouDescription.tsx │ │ ├── GitHubNippouForm.tsx │ │ ├── GitHubNippouMain.tsx │ │ ├── SubmitButton.tsx │ │ └── index.ts │ └── Header │ │ ├── Header.tsx │ │ ├── HeaderPresenter.tsx │ │ └── UserInfo.tsx │ ├── api │ ├── auth │ │ └── [...nextauth] │ │ │ └── route.ts │ └── nippou │ │ └── route.ts │ ├── favicon.ico │ ├── globals.css │ ├── layout.tsx │ ├── page.tsx │ ├── types.ts │ └── types │ ├── global.d.ts │ └── next-auth.d.ts ├── tailwind.config.ts └── tsconfig.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | 6 | concurrency: 7 | group: ${{ github.workflow }}-${{ github.ref }} 8 | cancel-in-progress: true 9 | 10 | jobs: 11 | web-lint: 12 | runs-on: ubuntu-latest 13 | defaults: 14 | run: 15 | working-directory: web 16 | steps: 17 | - uses: actions/checkout@v4 18 | - uses: MH4GF/shared-config/.github/composite-actions/setup-pnpm@main 19 | with: 20 | working-directory: web 21 | - run: pnpm lint 22 | 23 | api-lint: 24 | runs-on: ubuntu-latest 25 | defaults: 26 | run: 27 | working-directory: api 28 | steps: 29 | - uses: actions/checkout@v4 30 | - uses: actions/setup-go@v4 31 | with: 32 | go-version-file: './api/go.mod' 33 | - run: go vet ./... 34 | - uses: dominikh/staticcheck-action@v1.3.0 35 | with: 36 | version: "2023.1.3" 37 | working-directory: ./api 38 | install-go: false 39 | -------------------------------------------------------------------------------- /.github/workflows/vrt.yml: -------------------------------------------------------------------------------- 1 | name: VRT 2 | 3 | on: 4 | deployment_status: 5 | 6 | concurrency: 7 | group: ${{ github.workflow }}-${{ github.ref }} 8 | cancel-in-progress: false 9 | 10 | jobs: 11 | screenshots: 12 | if: github.event_name == 'deployment_status' && github.event.deployment_status.state == 'success' && github.event.deployment_status.environment == 'Preview – github-nippou-web' 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 30 15 | permissions: 16 | contents: read 17 | 18 | container: 19 | image: mcr.microsoft.com/playwright:v1.52.0-focal 20 | 21 | defaults: 22 | run: 23 | working-directory: web 24 | 25 | steps: 26 | - uses: actions/checkout@v4 27 | 28 | - uses: MH4GF/shared-config/.github/composite-actions/setup-pnpm@main 29 | with: 30 | working-directory: web 31 | 32 | - run: pnpm i 33 | 34 | - run: pnpm test:vrt:screenshots 35 | env: 36 | BASE_URL: https://github-nippou-web.vercel.app/ 37 | 38 | - run: pnpm test:vrt:compare 39 | env: 40 | BASE_URL: ${{ github.event.deployment_status.environment_url }} 41 | 42 | - name: Upload failed screenshots 43 | if: failure() 44 | uses: actions/upload-artifact@v4 45 | with: 46 | name: vrt-failed-screenshots-${{ github.sha }} 47 | path: web/test-results 48 | -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | # CLAUDE.md 2 | 3 | This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 | 5 | ## Commands 6 | - Build: `pnpm build` 7 | - Dev server: `pnpm dev` 8 | - Production server: `pnpm start` 9 | - Linting: `pnpm lint` (runs both Biome and TypeScript checks) 10 | - Linting (Biome only): `pnpm lint:biome` 11 | - Linting (TypeScript only): `pnpm lint:tsc` 12 | - Formatting: `pnpm format` 13 | - Tests: `pnpm test:vrt:compare` 14 | - Single test: `pnpm test:vrt:compare --grep="test name"` 15 | - Update test snapshots: `pnpm test:vrt:screenshots` 16 | 17 | ## Style Guide 18 | - Uses TypeScript in strict mode with path alias `@/*` → `./src/*` 19 | - Package manager: pnpm 10.9.0 20 | - Biome config: Extends `@mh4gf/configs/biome` 21 | - Next.js App Router structure with _features, _components folders 22 | - TypeScript Promise handling in event handlers needs checksVoidReturn attributes:false 23 | - Uses Tailwind CSS v4 for styling -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # github-nippou-web 2 | 3 | https://github.com/masutaka/github-nippou のWebアプリです。 4 | 5 | ![Screenshot](./docs/screenshot.png) 6 | -------------------------------------------------------------------------------- /api/README.md: -------------------------------------------------------------------------------- 1 | # github-nippou-web / api 2 | 3 | Go製のAPIサーバーです。 https://vercel.com/ のServerless Functionsで動作します。 4 | -------------------------------------------------------------------------------- /api/api/index.go: -------------------------------------------------------------------------------- 1 | package handler 2 | 3 | import ( 4 | "encoding/json" 5 | "net/http" 6 | 7 | "github.com/masutaka/github-nippou/v4/lib" 8 | "golang.org/x/exp/slog" 9 | ) 10 | 11 | func logging(r *http.Request) { 12 | queryParams := r.URL.Query() 13 | user := queryParams.Get("user") 14 | 15 | slog.Info( 16 | "logging", 17 | slog.String("path", r.URL.Path), 18 | slog.String("method", r.Method), 19 | slog.String("user", user), 20 | ) 21 | } 22 | 23 | type ResponseBody struct { 24 | Result string `json:"result"` 25 | } 26 | 27 | func Handler(w http.ResponseWriter, r *http.Request) { 28 | logging(r) 29 | 30 | queryParams := r.URL.Query() 31 | user := queryParams.Get("user") 32 | token := queryParams.Get("token") 33 | settingsGistId := queryParams.Get("settings_gist_id") 34 | debug := false 35 | sinceDate := queryParams.Get("since_date") 36 | untilDate := queryParams.Get("until_date") 37 | 38 | list := lib.NewList(sinceDate, untilDate, user, token, settingsGistId, debug) 39 | lines, err := list.Collect() 40 | if err != nil { 41 | slog.Error(err.Error()) 42 | http.Error(w, err.Error(), http.StatusInternalServerError) 43 | return 44 | } 45 | body := ResponseBody{Result: lines} 46 | 47 | jsonData, err := json.Marshal(body) 48 | if err != nil { 49 | http.Error(w, err.Error(), http.StatusInternalServerError) 50 | return 51 | } 52 | 53 | // レスポンスヘッダーの設定 54 | w.Header().Set("Content-Type", "application/json") 55 | w.Header().Set("Cache-Control", "max-age=60") 56 | 57 | // JSONデータをクライアントに送信 58 | w.Write(jsonData) 59 | } 60 | -------------------------------------------------------------------------------- /api/go.mod: -------------------------------------------------------------------------------- 1 | module MH4GF/github-nippou-web 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/masutaka/github-nippou/v4 v4.2.9 7 | golang.org/x/exp v0.0.0-20231006140011-7918f672742d 8 | ) 9 | 10 | require ( 11 | github.com/golang/protobuf v1.5.3 // indirect 12 | github.com/google/go-github/v56 v56.0.0 // indirect 13 | github.com/google/go-querystring v1.1.0 // indirect 14 | github.com/kr/text v0.2.0 // indirect 15 | github.com/rakyll/statik v0.1.7 // indirect 16 | github.com/skratchdot/open-golang v0.0.0-20190402232053-79abb63cd66e // indirect 17 | golang.org/x/net v0.17.0 // indirect 18 | golang.org/x/oauth2 v0.13.0 // indirect 19 | google.golang.org/appengine v1.6.7 // indirect 20 | google.golang.org/protobuf v1.31.0 // indirect 21 | gopkg.in/yaml.v3 v3.0.1 // indirect 22 | ) 23 | -------------------------------------------------------------------------------- /api/go.sum: -------------------------------------------------------------------------------- 1 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 2 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 3 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 4 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= 5 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 6 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 7 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 8 | github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 9 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 10 | github.com/google/go-github/v56 v56.0.0 h1:TysL7dMa/r7wsQi44BjqlwaHvwlFlqkK8CtBWCX3gb4= 11 | github.com/google/go-github/v56 v56.0.0/go.mod h1:D8cdcX98YWJvi7TLo7zM4/h8ZTx6u6fwGEkCdisopo0= 12 | github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 13 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 14 | github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= 15 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 16 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 17 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 18 | github.com/masutaka/github-nippou/v4 v4.2.9 h1:Xc872zcNjz8Q8tu2wHvQiEHPgWVRtYClqwU/ib8g6t8= 19 | github.com/masutaka/github-nippou/v4 v4.2.9/go.mod h1:JMHKOucZK5xUSAsML5bAKuFiS6Txp8zjineJEbi0N0E= 20 | github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= 21 | github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= 22 | github.com/skratchdot/open-golang v0.0.0-20190402232053-79abb63cd66e h1:VAzdS5Nw68fbf5RZ8RDVlUvPXNU6Z3jtPCK/qvm4FoQ= 23 | github.com/skratchdot/open-golang v0.0.0-20190402232053-79abb63cd66e/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= 24 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 25 | golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= 26 | golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= 27 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 28 | golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= 29 | golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 30 | golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= 31 | golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= 32 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 33 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 34 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 35 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 36 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 37 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 38 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 39 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 40 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 41 | google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= 42 | google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 43 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 44 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= 45 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 46 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 47 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 48 | -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MH4GF/github-nippou-web/d977571ed0d5c188275f421f9f01a4572b43d487/docs/screenshot.png -------------------------------------------------------------------------------- /web/.env.local.sample: -------------------------------------------------------------------------------- 1 | NEXTAUTH_URL=http://localhost:3000 2 | API_URL=http://localhost:8080 3 | NEXTAUTH_SECRET=next-authが利用する秘密鍵。openssl rand -base64 32で生成した文字列に置き換えてください。 4 | GITHUB_OAUTH_APP_CLIENT_ID=ローカル開発用のGitHub OAuth AppのClient ID。@MH4GFに聞いてください。 5 | GITHUB_OAUTH_APP_CLIENT_SECRET=ローカル開発用のGitHub OAuth AppのClient Secret。@MH4GFに聞いてください。 6 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | 37 | public/main.wasm 38 | /test-results/ 39 | /playwright-report/ 40 | /blob-report/ 41 | /playwright/.cache/ 42 | -------------------------------------------------------------------------------- /web/.node-version: -------------------------------------------------------------------------------- 1 | 22.14.0 -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # github-nippou-web / web 2 | 3 | Next.js製のWebアプリです。 https://vercel.com/ のHobbyプランでホスティングしています。 4 | 5 | ## Getting Started 6 | 7 | 環境変数を設定。秘匿情報は @MH4GF に聞いてください。 8 | 9 | ``` 10 | cp .env.local.sample .env.local 11 | ``` 12 | 13 | pnpmで開発サーバーを起動 14 | 15 | ``` 16 | corepack enable 17 | corepack prepare 18 | pnpm i 19 | pnpm dev 20 | ``` 21 | -------------------------------------------------------------------------------- /web/biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", 3 | "extends": [ 4 | "./node_modules/@mh4gf/configs/biome/index.jsonc", 5 | "./node_modules/@mh4gf/configs/biome/react.jsonc" 6 | ], 7 | "linter": { 8 | "rules": { 9 | "correctness": { 10 | "useImportExtensions": "off" 11 | }, 12 | "performance": { 13 | "noBarrelFile": "off", 14 | "noReExportAll": "off" 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /web/next.config.js: -------------------------------------------------------------------------------- 1 | const pattycake = require('pattycake') 2 | 3 | /** @type {import('next').NextConfig} */ 4 | const nextConfig = { 5 | images: { 6 | remotePatterns: [ 7 | { 8 | protocol: 'https', 9 | hostname: 'avatars.githubusercontent.com', 10 | port: '', 11 | pathname: '/**', 12 | }, 13 | ], 14 | }, 15 | } 16 | 17 | module.exports = pattycake.next(nextConfig) 18 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-nippou-web", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev", 8 | "format": "biome format --write .", 9 | "lint": "concurrently \"pnpm lint:biome\" \"pnpm lint:tsc\"", 10 | "lint:biome": "biome check .", 11 | "lint:tsc": "tsc --noEmit", 12 | "start": "next start", 13 | "test:vrt:compare": "playwright test", 14 | "test:vrt:screenshots": "playwright test --update-snapshots" 15 | }, 16 | "dependencies": { 17 | "@tailwindcss/forms": "^0.5.10", 18 | "ahooks": "^3.8.4", 19 | "clsx": "^2.1.1", 20 | "next": "15.3.1", 21 | "next-auth": "^4.24.11", 22 | "pattycake": "^0.0.2", 23 | "react": "^19.1.0", 24 | "react-dom": "^19.1.0", 25 | "react-github-btn": "^1.4.0", 26 | "server-only": "^0.0.1", 27 | "ts-pattern": "^5.7.0", 28 | "valibot": "^1.0.0" 29 | }, 30 | "devDependencies": { 31 | "@biomejs/biome": "1.9.4", 32 | "@mh4gf/configs": "^0.4.5", 33 | "@playwright/test": "^1.52.0", 34 | "@tailwindcss/postcss": "4.1.4", 35 | "@types/node": "^22.14.1", 36 | "@types/react": "^19.1.2", 37 | "@types/react-dom": "^19.1.2", 38 | "autoprefixer": "^10.4.21", 39 | "concurrently": "^9.1.2", 40 | "postcss": "^8.5.3", 41 | "tailwindcss": "^4.1.4", 42 | "typescript": "^5.8.3" 43 | }, 44 | "packageManager": "pnpm@10.9.0" 45 | } 46 | -------------------------------------------------------------------------------- /web/playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from '@playwright/test' 2 | 3 | // biome-ignore lint/style/noDefaultExport: playwright requires default export 4 | export default defineConfig({ 5 | testDir: './src/__vrt__', 6 | testMatch: 'vrt.test.ts', 7 | fullyParallel: true, 8 | forbidOnly: !!process.env.CI, 9 | retries: process.env.CI ? 2 : 0, 10 | workers: process.env.CI ? 1 : undefined, 11 | reporter: 'html', 12 | use: { 13 | baseURL: process.env.BASE_URL, 14 | trace: 'on-first-retry', 15 | }, 16 | projects: [ 17 | { 18 | name: 'chromium', 19 | use: { ...devices['Desktop Chrome'] }, 20 | }, 21 | { 22 | name: 'webkit', 23 | use: { ...devices['Desktop Safari'] }, 24 | }, 25 | { 26 | name: 'Mobile Chrome', 27 | use: { ...devices['Pixel 5'] }, 28 | }, 29 | { 30 | name: 'Mobile Safari', 31 | use: { ...devices['iPhone 12'] }, 32 | }, 33 | ], 34 | }) 35 | -------------------------------------------------------------------------------- /web/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tailwindcss/forms': 12 | specifier: ^0.5.10 13 | version: 0.5.10(tailwindcss@4.1.4) 14 | ahooks: 15 | specifier: ^3.8.4 16 | version: 3.8.4(react@19.1.0) 17 | clsx: 18 | specifier: ^2.1.1 19 | version: 2.1.1 20 | next: 21 | specifier: 15.3.1 22 | version: 15.3.1(@babel/core@7.26.10)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 23 | next-auth: 24 | specifier: ^4.24.11 25 | version: 4.24.11(next@15.3.1(@babel/core@7.26.10)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 26 | pattycake: 27 | specifier: ^0.0.2 28 | version: 0.0.2 29 | react: 30 | specifier: ^19.1.0 31 | version: 19.1.0 32 | react-dom: 33 | specifier: ^19.1.0 34 | version: 19.1.0(react@19.1.0) 35 | react-github-btn: 36 | specifier: ^1.4.0 37 | version: 1.4.0(react@19.1.0) 38 | server-only: 39 | specifier: ^0.0.1 40 | version: 0.0.1 41 | ts-pattern: 42 | specifier: ^5.7.0 43 | version: 5.7.0 44 | valibot: 45 | specifier: ^1.0.0 46 | version: 1.0.0(typescript@5.8.3) 47 | devDependencies: 48 | '@biomejs/biome': 49 | specifier: 1.9.4 50 | version: 1.9.4 51 | '@mh4gf/configs': 52 | specifier: ^0.4.5 53 | version: 0.4.5(@tsconfig/strictest@2.0.5) 54 | '@playwright/test': 55 | specifier: ^1.52.0 56 | version: 1.52.0 57 | '@tailwindcss/postcss': 58 | specifier: 4.1.4 59 | version: 4.1.4 60 | '@types/node': 61 | specifier: ^22.14.1 62 | version: 22.15.0 63 | '@types/react': 64 | specifier: ^19.1.2 65 | version: 19.1.2 66 | '@types/react-dom': 67 | specifier: ^19.1.2 68 | version: 19.1.2(@types/react@19.1.2) 69 | autoprefixer: 70 | specifier: ^10.4.21 71 | version: 10.4.21(postcss@8.5.3) 72 | concurrently: 73 | specifier: ^9.1.2 74 | version: 9.1.2 75 | postcss: 76 | specifier: ^8.5.3 77 | version: 8.5.3 78 | tailwindcss: 79 | specifier: ^4.1.4 80 | version: 4.1.4 81 | typescript: 82 | specifier: ^5.8.3 83 | version: 5.8.3 84 | 85 | packages: 86 | 87 | '@alloc/quick-lru@5.2.0': 88 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 89 | engines: {node: '>=10'} 90 | 91 | '@ampproject/remapping@2.3.0': 92 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 93 | engines: {node: '>=6.0.0'} 94 | 95 | '@babel/code-frame@7.26.2': 96 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 97 | engines: {node: '>=6.9.0'} 98 | 99 | '@babel/compat-data@7.26.8': 100 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 101 | engines: {node: '>=6.9.0'} 102 | 103 | '@babel/core@7.26.10': 104 | resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 105 | engines: {node: '>=6.9.0'} 106 | 107 | '@babel/generator@7.27.0': 108 | resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} 109 | engines: {node: '>=6.9.0'} 110 | 111 | '@babel/helper-compilation-targets@7.27.0': 112 | resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} 113 | engines: {node: '>=6.9.0'} 114 | 115 | '@babel/helper-module-imports@7.25.9': 116 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 117 | engines: {node: '>=6.9.0'} 118 | 119 | '@babel/helper-module-transforms@7.26.0': 120 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 121 | engines: {node: '>=6.9.0'} 122 | peerDependencies: 123 | '@babel/core': ^7.0.0 124 | 125 | '@babel/helper-plugin-utils@7.26.5': 126 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 127 | engines: {node: '>=6.9.0'} 128 | 129 | '@babel/helper-string-parser@7.25.9': 130 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 131 | engines: {node: '>=6.9.0'} 132 | 133 | '@babel/helper-validator-identifier@7.25.9': 134 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 135 | engines: {node: '>=6.9.0'} 136 | 137 | '@babel/helper-validator-option@7.25.9': 138 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 139 | engines: {node: '>=6.9.0'} 140 | 141 | '@babel/helpers@7.27.0': 142 | resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} 143 | engines: {node: '>=6.9.0'} 144 | 145 | '@babel/parser@7.27.0': 146 | resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} 147 | engines: {node: '>=6.0.0'} 148 | hasBin: true 149 | 150 | '@babel/plugin-syntax-jsx@7.25.9': 151 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 152 | engines: {node: '>=6.9.0'} 153 | peerDependencies: 154 | '@babel/core': ^7.0.0-0 155 | 156 | '@babel/plugin-syntax-typescript@7.25.9': 157 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 158 | engines: {node: '>=6.9.0'} 159 | peerDependencies: 160 | '@babel/core': ^7.0.0-0 161 | 162 | '@babel/runtime@7.27.0': 163 | resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} 164 | engines: {node: '>=6.9.0'} 165 | 166 | '@babel/template@7.27.0': 167 | resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} 168 | engines: {node: '>=6.9.0'} 169 | 170 | '@babel/traverse@7.27.0': 171 | resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} 172 | engines: {node: '>=6.9.0'} 173 | 174 | '@babel/types@7.27.0': 175 | resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} 176 | engines: {node: '>=6.9.0'} 177 | 178 | '@biomejs/biome@1.9.4': 179 | resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 180 | engines: {node: '>=14.21.3'} 181 | hasBin: true 182 | 183 | '@biomejs/cli-darwin-arm64@1.9.4': 184 | resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 185 | engines: {node: '>=14.21.3'} 186 | cpu: [arm64] 187 | os: [darwin] 188 | 189 | '@biomejs/cli-darwin-x64@1.9.4': 190 | resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 191 | engines: {node: '>=14.21.3'} 192 | cpu: [x64] 193 | os: [darwin] 194 | 195 | '@biomejs/cli-linux-arm64-musl@1.9.4': 196 | resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 197 | engines: {node: '>=14.21.3'} 198 | cpu: [arm64] 199 | os: [linux] 200 | 201 | '@biomejs/cli-linux-arm64@1.9.4': 202 | resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 203 | engines: {node: '>=14.21.3'} 204 | cpu: [arm64] 205 | os: [linux] 206 | 207 | '@biomejs/cli-linux-x64-musl@1.9.4': 208 | resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 209 | engines: {node: '>=14.21.3'} 210 | cpu: [x64] 211 | os: [linux] 212 | 213 | '@biomejs/cli-linux-x64@1.9.4': 214 | resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 215 | engines: {node: '>=14.21.3'} 216 | cpu: [x64] 217 | os: [linux] 218 | 219 | '@biomejs/cli-win32-arm64@1.9.4': 220 | resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 221 | engines: {node: '>=14.21.3'} 222 | cpu: [arm64] 223 | os: [win32] 224 | 225 | '@biomejs/cli-win32-x64@1.9.4': 226 | resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 227 | engines: {node: '>=14.21.3'} 228 | cpu: [x64] 229 | os: [win32] 230 | 231 | '@emnapi/runtime@1.4.3': 232 | resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} 233 | 234 | '@img/sharp-darwin-arm64@0.34.1': 235 | resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} 236 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 237 | cpu: [arm64] 238 | os: [darwin] 239 | 240 | '@img/sharp-darwin-x64@0.34.1': 241 | resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} 242 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 243 | cpu: [x64] 244 | os: [darwin] 245 | 246 | '@img/sharp-libvips-darwin-arm64@1.1.0': 247 | resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} 248 | cpu: [arm64] 249 | os: [darwin] 250 | 251 | '@img/sharp-libvips-darwin-x64@1.1.0': 252 | resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} 253 | cpu: [x64] 254 | os: [darwin] 255 | 256 | '@img/sharp-libvips-linux-arm64@1.1.0': 257 | resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} 258 | cpu: [arm64] 259 | os: [linux] 260 | 261 | '@img/sharp-libvips-linux-arm@1.1.0': 262 | resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} 263 | cpu: [arm] 264 | os: [linux] 265 | 266 | '@img/sharp-libvips-linux-ppc64@1.1.0': 267 | resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} 268 | cpu: [ppc64] 269 | os: [linux] 270 | 271 | '@img/sharp-libvips-linux-s390x@1.1.0': 272 | resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} 273 | cpu: [s390x] 274 | os: [linux] 275 | 276 | '@img/sharp-libvips-linux-x64@1.1.0': 277 | resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} 278 | cpu: [x64] 279 | os: [linux] 280 | 281 | '@img/sharp-libvips-linuxmusl-arm64@1.1.0': 282 | resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} 283 | cpu: [arm64] 284 | os: [linux] 285 | 286 | '@img/sharp-libvips-linuxmusl-x64@1.1.0': 287 | resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} 288 | cpu: [x64] 289 | os: [linux] 290 | 291 | '@img/sharp-linux-arm64@0.34.1': 292 | resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} 293 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 294 | cpu: [arm64] 295 | os: [linux] 296 | 297 | '@img/sharp-linux-arm@0.34.1': 298 | resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} 299 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 300 | cpu: [arm] 301 | os: [linux] 302 | 303 | '@img/sharp-linux-s390x@0.34.1': 304 | resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} 305 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 306 | cpu: [s390x] 307 | os: [linux] 308 | 309 | '@img/sharp-linux-x64@0.34.1': 310 | resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} 311 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 312 | cpu: [x64] 313 | os: [linux] 314 | 315 | '@img/sharp-linuxmusl-arm64@0.34.1': 316 | resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} 317 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 318 | cpu: [arm64] 319 | os: [linux] 320 | 321 | '@img/sharp-linuxmusl-x64@0.34.1': 322 | resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} 323 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 324 | cpu: [x64] 325 | os: [linux] 326 | 327 | '@img/sharp-wasm32@0.34.1': 328 | resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} 329 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 330 | cpu: [wasm32] 331 | 332 | '@img/sharp-win32-ia32@0.34.1': 333 | resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} 334 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 335 | cpu: [ia32] 336 | os: [win32] 337 | 338 | '@img/sharp-win32-x64@0.34.1': 339 | resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} 340 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 341 | cpu: [x64] 342 | os: [win32] 343 | 344 | '@jridgewell/gen-mapping@0.3.8': 345 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 346 | engines: {node: '>=6.0.0'} 347 | 348 | '@jridgewell/resolve-uri@3.1.2': 349 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 350 | engines: {node: '>=6.0.0'} 351 | 352 | '@jridgewell/set-array@1.2.1': 353 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 354 | engines: {node: '>=6.0.0'} 355 | 356 | '@jridgewell/sourcemap-codec@1.5.0': 357 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 358 | 359 | '@jridgewell/trace-mapping@0.3.25': 360 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 361 | 362 | '@mh4gf/configs@0.4.5': 363 | resolution: {integrity: sha512-tAk0YVt+ndC7UVw72HcBLDV2UThEN5OR5JBhdKQ/ntTi9af5QTyDHQCel+02VhyfgKlVobRX7aCXaf8iKACKJg==} 364 | peerDependencies: 365 | '@tsconfig/strictest': ^2 366 | 367 | '@next/env@15.3.1': 368 | resolution: {integrity: sha512-cwK27QdzrMblHSn9DZRV+DQscHXRuJv6MydlJRpFSqJWZrTYMLzKDeyueJNN9MGd8NNiUKzDQADAf+dMLXX7YQ==} 369 | 370 | '@next/swc-darwin-arm64@15.3.1': 371 | resolution: {integrity: sha512-hjDw4f4/nla+6wysBL07z52Gs55Gttp5Bsk5/8AncQLJoisvTBP0pRIBK/B16/KqQyH+uN4Ww8KkcAqJODYH3w==} 372 | engines: {node: '>= 10'} 373 | cpu: [arm64] 374 | os: [darwin] 375 | 376 | '@next/swc-darwin-x64@15.3.1': 377 | resolution: {integrity: sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g==} 378 | engines: {node: '>= 10'} 379 | cpu: [x64] 380 | os: [darwin] 381 | 382 | '@next/swc-linux-arm64-gnu@15.3.1': 383 | resolution: {integrity: sha512-wBQ+jGUI3N0QZyWmmvRHjXjTWFy8o+zPFLSOyAyGFI94oJi+kK/LIZFJXeykvgXUk1NLDAEFDZw/NVINhdk9FQ==} 384 | engines: {node: '>= 10'} 385 | cpu: [arm64] 386 | os: [linux] 387 | 388 | '@next/swc-linux-arm64-musl@15.3.1': 389 | resolution: {integrity: sha512-IIxXEXRti/AulO9lWRHiCpUUR8AR/ZYLPALgiIg/9ENzMzLn3l0NSxVdva7R/VDcuSEBo0eGVCe3evSIHNz0Hg==} 390 | engines: {node: '>= 10'} 391 | cpu: [arm64] 392 | os: [linux] 393 | 394 | '@next/swc-linux-x64-gnu@15.3.1': 395 | resolution: {integrity: sha512-bfI4AMhySJbyXQIKH5rmLJ5/BP7bPwuxauTvVEiJ/ADoddaA9fgyNNCcsbu9SlqfHDoZmfI6g2EjzLwbsVTr5A==} 396 | engines: {node: '>= 10'} 397 | cpu: [x64] 398 | os: [linux] 399 | 400 | '@next/swc-linux-x64-musl@15.3.1': 401 | resolution: {integrity: sha512-FeAbR7FYMWR+Z+M5iSGytVryKHiAsc0x3Nc3J+FD5NVbD5Mqz7fTSy8CYliXinn7T26nDMbpExRUI/4ekTvoiA==} 402 | engines: {node: '>= 10'} 403 | cpu: [x64] 404 | os: [linux] 405 | 406 | '@next/swc-win32-arm64-msvc@15.3.1': 407 | resolution: {integrity: sha512-yP7FueWjphQEPpJQ2oKmshk/ppOt+0/bB8JC8svPUZNy0Pi3KbPx2Llkzv1p8CoQa+D2wknINlJpHf3vtChVBw==} 408 | engines: {node: '>= 10'} 409 | cpu: [arm64] 410 | os: [win32] 411 | 412 | '@next/swc-win32-x64-msvc@15.3.1': 413 | resolution: {integrity: sha512-3PMvF2zRJAifcRNni9uMk/gulWfWS+qVI/pagd+4yLF5bcXPZPPH2xlYRYOsUjmCJOXSTAC2PjRzbhsRzR2fDQ==} 414 | engines: {node: '>= 10'} 415 | cpu: [x64] 416 | os: [win32] 417 | 418 | '@panva/hkdf@1.2.1': 419 | resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} 420 | 421 | '@playwright/test@1.52.0': 422 | resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} 423 | engines: {node: '>=18'} 424 | hasBin: true 425 | 426 | '@swc/counter@0.1.3': 427 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 428 | 429 | '@swc/helpers@0.5.15': 430 | resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} 431 | 432 | '@tailwindcss/forms@0.5.10': 433 | resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} 434 | peerDependencies: 435 | tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' 436 | 437 | '@tailwindcss/node@4.1.4': 438 | resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} 439 | 440 | '@tailwindcss/oxide-android-arm64@4.1.4': 441 | resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} 442 | engines: {node: '>= 10'} 443 | cpu: [arm64] 444 | os: [android] 445 | 446 | '@tailwindcss/oxide-darwin-arm64@4.1.4': 447 | resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} 448 | engines: {node: '>= 10'} 449 | cpu: [arm64] 450 | os: [darwin] 451 | 452 | '@tailwindcss/oxide-darwin-x64@4.1.4': 453 | resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} 454 | engines: {node: '>= 10'} 455 | cpu: [x64] 456 | os: [darwin] 457 | 458 | '@tailwindcss/oxide-freebsd-x64@4.1.4': 459 | resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} 460 | engines: {node: '>= 10'} 461 | cpu: [x64] 462 | os: [freebsd] 463 | 464 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': 465 | resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} 466 | engines: {node: '>= 10'} 467 | cpu: [arm] 468 | os: [linux] 469 | 470 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': 471 | resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} 472 | engines: {node: '>= 10'} 473 | cpu: [arm64] 474 | os: [linux] 475 | 476 | '@tailwindcss/oxide-linux-arm64-musl@4.1.4': 477 | resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} 478 | engines: {node: '>= 10'} 479 | cpu: [arm64] 480 | os: [linux] 481 | 482 | '@tailwindcss/oxide-linux-x64-gnu@4.1.4': 483 | resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} 484 | engines: {node: '>= 10'} 485 | cpu: [x64] 486 | os: [linux] 487 | 488 | '@tailwindcss/oxide-linux-x64-musl@4.1.4': 489 | resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} 490 | engines: {node: '>= 10'} 491 | cpu: [x64] 492 | os: [linux] 493 | 494 | '@tailwindcss/oxide-wasm32-wasi@4.1.4': 495 | resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} 496 | engines: {node: '>=14.0.0'} 497 | cpu: [wasm32] 498 | bundledDependencies: 499 | - '@napi-rs/wasm-runtime' 500 | - '@emnapi/core' 501 | - '@emnapi/runtime' 502 | - '@tybys/wasm-util' 503 | - '@emnapi/wasi-threads' 504 | - tslib 505 | 506 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': 507 | resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} 508 | engines: {node: '>= 10'} 509 | cpu: [arm64] 510 | os: [win32] 511 | 512 | '@tailwindcss/oxide-win32-x64-msvc@4.1.4': 513 | resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} 514 | engines: {node: '>= 10'} 515 | cpu: [x64] 516 | os: [win32] 517 | 518 | '@tailwindcss/oxide@4.1.4': 519 | resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} 520 | engines: {node: '>= 10'} 521 | 522 | '@tailwindcss/postcss@4.1.4': 523 | resolution: {integrity: sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==} 524 | 525 | '@tsconfig/strictest@2.0.5': 526 | resolution: {integrity: sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==} 527 | 528 | '@types/node@22.15.0': 529 | resolution: {integrity: sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==} 530 | 531 | '@types/react-dom@19.1.2': 532 | resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} 533 | peerDependencies: 534 | '@types/react': ^19.0.0 535 | 536 | '@types/react@19.1.2': 537 | resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} 538 | 539 | acorn@8.14.1: 540 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 541 | engines: {node: '>=0.4.0'} 542 | hasBin: true 543 | 544 | ahooks@3.8.4: 545 | resolution: {integrity: sha512-39wDEw2ZHvypaT14EpMMk4AzosHWt0z9bulY0BeDsvc9PqJEV+Kjh/4TZfftSsotBMq52iYIOFPd3PR56e0ZJg==} 546 | engines: {node: '>=8.0.0'} 547 | peerDependencies: 548 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 549 | 550 | ansi-regex@5.0.1: 551 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 552 | engines: {node: '>=8'} 553 | 554 | ansi-styles@4.3.0: 555 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 556 | engines: {node: '>=8'} 557 | 558 | autoprefixer@10.4.21: 559 | resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} 560 | engines: {node: ^10 || ^12 || >=14} 561 | hasBin: true 562 | peerDependencies: 563 | postcss: ^8.1.0 564 | 565 | browserslist@4.24.4: 566 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 567 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 568 | hasBin: true 569 | 570 | busboy@1.6.0: 571 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 572 | engines: {node: '>=10.16.0'} 573 | 574 | caniuse-lite@1.0.30001715: 575 | resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} 576 | 577 | chalk@4.1.2: 578 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 579 | engines: {node: '>=10'} 580 | 581 | client-only@0.0.1: 582 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 583 | 584 | cliui@8.0.1: 585 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 586 | engines: {node: '>=12'} 587 | 588 | clsx@2.1.1: 589 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 590 | engines: {node: '>=6'} 591 | 592 | color-convert@2.0.1: 593 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 594 | engines: {node: '>=7.0.0'} 595 | 596 | color-name@1.1.4: 597 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 598 | 599 | color-string@1.9.1: 600 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 601 | 602 | color@4.2.3: 603 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 604 | engines: {node: '>=12.5.0'} 605 | 606 | concurrently@9.1.2: 607 | resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} 608 | engines: {node: '>=18'} 609 | hasBin: true 610 | 611 | convert-source-map@2.0.0: 612 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 613 | 614 | cookie@0.7.2: 615 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 616 | engines: {node: '>= 0.6'} 617 | 618 | csstype@3.1.3: 619 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 620 | 621 | dayjs@1.11.13: 622 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 623 | 624 | debug@4.4.0: 625 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 626 | engines: {node: '>=6.0'} 627 | peerDependencies: 628 | supports-color: '*' 629 | peerDependenciesMeta: 630 | supports-color: 631 | optional: true 632 | 633 | detect-libc@2.0.4: 634 | resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 635 | engines: {node: '>=8'} 636 | 637 | electron-to-chromium@1.5.142: 638 | resolution: {integrity: sha512-Ah2HgkTu/9RhTDNThBtzu2Wirdy4DC9b0sMT1pUhbkZQ5U/iwmE+PHZX1MpjD5IkJCc2wSghgGG/B04szAx07w==} 639 | 640 | emoji-regex@8.0.0: 641 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 642 | 643 | enhanced-resolve@5.18.1: 644 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 645 | engines: {node: '>=10.13.0'} 646 | 647 | escalade@3.2.0: 648 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 649 | engines: {node: '>=6'} 650 | 651 | fraction.js@4.3.7: 652 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 653 | 654 | fsevents@2.3.2: 655 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 656 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 657 | os: [darwin] 658 | 659 | gensync@1.0.0-beta.2: 660 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 661 | engines: {node: '>=6.9.0'} 662 | 663 | get-caller-file@2.0.5: 664 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 665 | engines: {node: 6.* || 8.* || >= 10.*} 666 | 667 | github-buttons@2.29.1: 668 | resolution: {integrity: sha512-TV3YgAKda5hPz75n7QXmGCsSzgVya1vvmBieebg3EB5ScmashTZ0FldViG1aU2d4V5rcAGrtQ7k5uAaCo0A4PA==} 669 | 670 | globals@11.12.0: 671 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 672 | engines: {node: '>=4'} 673 | 674 | graceful-fs@4.2.11: 675 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 676 | 677 | has-flag@4.0.0: 678 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 679 | engines: {node: '>=8'} 680 | 681 | intersection-observer@0.12.2: 682 | resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} 683 | 684 | is-arrayish@0.3.2: 685 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 686 | 687 | is-fullwidth-code-point@3.0.0: 688 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 689 | engines: {node: '>=8'} 690 | 691 | jiti@2.4.2: 692 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 693 | hasBin: true 694 | 695 | jose@4.15.9: 696 | resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} 697 | 698 | js-cookie@3.0.5: 699 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 700 | engines: {node: '>=14'} 701 | 702 | js-tokens@4.0.0: 703 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 704 | 705 | jsesc@3.1.0: 706 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 707 | engines: {node: '>=6'} 708 | hasBin: true 709 | 710 | json5@2.2.3: 711 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 712 | engines: {node: '>=6'} 713 | hasBin: true 714 | 715 | lightningcss-darwin-arm64@1.29.2: 716 | resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} 717 | engines: {node: '>= 12.0.0'} 718 | cpu: [arm64] 719 | os: [darwin] 720 | 721 | lightningcss-darwin-x64@1.29.2: 722 | resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} 723 | engines: {node: '>= 12.0.0'} 724 | cpu: [x64] 725 | os: [darwin] 726 | 727 | lightningcss-freebsd-x64@1.29.2: 728 | resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} 729 | engines: {node: '>= 12.0.0'} 730 | cpu: [x64] 731 | os: [freebsd] 732 | 733 | lightningcss-linux-arm-gnueabihf@1.29.2: 734 | resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} 735 | engines: {node: '>= 12.0.0'} 736 | cpu: [arm] 737 | os: [linux] 738 | 739 | lightningcss-linux-arm64-gnu@1.29.2: 740 | resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} 741 | engines: {node: '>= 12.0.0'} 742 | cpu: [arm64] 743 | os: [linux] 744 | 745 | lightningcss-linux-arm64-musl@1.29.2: 746 | resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} 747 | engines: {node: '>= 12.0.0'} 748 | cpu: [arm64] 749 | os: [linux] 750 | 751 | lightningcss-linux-x64-gnu@1.29.2: 752 | resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} 753 | engines: {node: '>= 12.0.0'} 754 | cpu: [x64] 755 | os: [linux] 756 | 757 | lightningcss-linux-x64-musl@1.29.2: 758 | resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} 759 | engines: {node: '>= 12.0.0'} 760 | cpu: [x64] 761 | os: [linux] 762 | 763 | lightningcss-win32-arm64-msvc@1.29.2: 764 | resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} 765 | engines: {node: '>= 12.0.0'} 766 | cpu: [arm64] 767 | os: [win32] 768 | 769 | lightningcss-win32-x64-msvc@1.29.2: 770 | resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} 771 | engines: {node: '>= 12.0.0'} 772 | cpu: [x64] 773 | os: [win32] 774 | 775 | lightningcss@1.29.2: 776 | resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} 777 | engines: {node: '>= 12.0.0'} 778 | 779 | lodash@4.17.21: 780 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 781 | 782 | lru-cache@5.1.1: 783 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 784 | 785 | lru-cache@6.0.0: 786 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 787 | engines: {node: '>=10'} 788 | 789 | mini-svg-data-uri@1.4.4: 790 | resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 791 | hasBin: true 792 | 793 | ms@2.1.3: 794 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 795 | 796 | nanoid@3.3.11: 797 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 798 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 799 | hasBin: true 800 | 801 | next-auth@4.24.11: 802 | resolution: {integrity: sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==} 803 | peerDependencies: 804 | '@auth/core': 0.34.2 805 | next: ^12.2.5 || ^13 || ^14 || ^15 806 | nodemailer: ^6.6.5 807 | react: ^17.0.2 || ^18 || ^19 808 | react-dom: ^17.0.2 || ^18 || ^19 809 | peerDependenciesMeta: 810 | '@auth/core': 811 | optional: true 812 | nodemailer: 813 | optional: true 814 | 815 | next@15.3.1: 816 | resolution: {integrity: sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g==} 817 | engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} 818 | hasBin: true 819 | peerDependencies: 820 | '@opentelemetry/api': ^1.1.0 821 | '@playwright/test': ^1.41.2 822 | babel-plugin-react-compiler: '*' 823 | react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 824 | react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 825 | sass: ^1.3.0 826 | peerDependenciesMeta: 827 | '@opentelemetry/api': 828 | optional: true 829 | '@playwright/test': 830 | optional: true 831 | babel-plugin-react-compiler: 832 | optional: true 833 | sass: 834 | optional: true 835 | 836 | node-releases@2.0.19: 837 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 838 | 839 | normalize-range@0.1.2: 840 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 841 | engines: {node: '>=0.10.0'} 842 | 843 | oauth@0.9.15: 844 | resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} 845 | 846 | object-hash@2.2.0: 847 | resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} 848 | engines: {node: '>= 6'} 849 | 850 | oidc-token-hash@5.1.0: 851 | resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} 852 | engines: {node: ^10.13.0 || >=12.0.0} 853 | 854 | openid-client@5.7.1: 855 | resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} 856 | 857 | pattycake@0.0.2: 858 | resolution: {integrity: sha512-87WKWLPVIGl+yUBprIo08O+VHYMyszZKoYldUK5+73Ie/4XRKBRZOzDgkzcFYax76rXlkbEitsTkNLGeQWqSZg==} 859 | 860 | picocolors@1.1.1: 861 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 862 | 863 | playwright-core@1.52.0: 864 | resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} 865 | engines: {node: '>=18'} 866 | hasBin: true 867 | 868 | playwright@1.52.0: 869 | resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} 870 | engines: {node: '>=18'} 871 | hasBin: true 872 | 873 | postcss-value-parser@4.2.0: 874 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 875 | 876 | postcss@8.4.31: 877 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 878 | engines: {node: ^10 || ^12 || >=14} 879 | 880 | postcss@8.5.3: 881 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 882 | engines: {node: ^10 || ^12 || >=14} 883 | 884 | preact-render-to-string@5.2.6: 885 | resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} 886 | peerDependencies: 887 | preact: '>=10' 888 | 889 | preact@10.26.5: 890 | resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} 891 | 892 | pretty-format@3.8.0: 893 | resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} 894 | 895 | react-dom@19.1.0: 896 | resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} 897 | peerDependencies: 898 | react: ^19.1.0 899 | 900 | react-fast-compare@3.2.2: 901 | resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} 902 | 903 | react-github-btn@1.4.0: 904 | resolution: {integrity: sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==} 905 | peerDependencies: 906 | react: '>=16.3.0' 907 | 908 | react@19.1.0: 909 | resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} 910 | engines: {node: '>=0.10.0'} 911 | 912 | regenerator-runtime@0.14.1: 913 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 914 | 915 | require-directory@2.1.1: 916 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 917 | engines: {node: '>=0.10.0'} 918 | 919 | resize-observer-polyfill@1.5.1: 920 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 921 | 922 | rxjs@7.8.2: 923 | resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} 924 | 925 | scheduler@0.26.0: 926 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} 927 | 928 | screenfull@5.2.0: 929 | resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} 930 | engines: {node: '>=0.10.0'} 931 | 932 | semver@6.3.1: 933 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 934 | hasBin: true 935 | 936 | semver@7.7.1: 937 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 938 | engines: {node: '>=10'} 939 | hasBin: true 940 | 941 | server-only@0.0.1: 942 | resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} 943 | 944 | sharp@0.34.1: 945 | resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} 946 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 947 | 948 | shell-quote@1.8.2: 949 | resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} 950 | engines: {node: '>= 0.4'} 951 | 952 | simple-swizzle@0.2.2: 953 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 954 | 955 | source-map-js@1.2.1: 956 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 957 | engines: {node: '>=0.10.0'} 958 | 959 | streamsearch@1.1.0: 960 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 961 | engines: {node: '>=10.0.0'} 962 | 963 | string-width@4.2.3: 964 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 965 | engines: {node: '>=8'} 966 | 967 | strip-ansi@6.0.1: 968 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 969 | engines: {node: '>=8'} 970 | 971 | styled-jsx@5.1.6: 972 | resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} 973 | engines: {node: '>= 12.0.0'} 974 | peerDependencies: 975 | '@babel/core': '*' 976 | babel-plugin-macros: '*' 977 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' 978 | peerDependenciesMeta: 979 | '@babel/core': 980 | optional: true 981 | babel-plugin-macros: 982 | optional: true 983 | 984 | supports-color@7.2.0: 985 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 986 | engines: {node: '>=8'} 987 | 988 | supports-color@8.1.1: 989 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 990 | engines: {node: '>=10'} 991 | 992 | tailwindcss@4.1.4: 993 | resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} 994 | 995 | tapable@2.2.1: 996 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 997 | engines: {node: '>=6'} 998 | 999 | tree-kill@1.2.2: 1000 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1001 | hasBin: true 1002 | 1003 | ts-pattern@5.7.0: 1004 | resolution: {integrity: sha512-0/FvIG4g3kNkYgbNwBBW5pZBkfpeYQnH+2AA3xmjkCAit/DSDPKmgwC3fKof4oYUq6gupClVOJlFl+939VRBMg==} 1005 | 1006 | tslib@2.8.1: 1007 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1008 | 1009 | typescript@5.8.3: 1010 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1011 | engines: {node: '>=14.17'} 1012 | hasBin: true 1013 | 1014 | undici-types@6.21.0: 1015 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1016 | 1017 | unplugin@1.16.1: 1018 | resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} 1019 | engines: {node: '>=14.0.0'} 1020 | 1021 | update-browserslist-db@1.1.3: 1022 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1023 | hasBin: true 1024 | peerDependencies: 1025 | browserslist: '>= 4.21.0' 1026 | 1027 | uuid@8.3.2: 1028 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 1029 | hasBin: true 1030 | 1031 | valibot@1.0.0: 1032 | resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} 1033 | peerDependencies: 1034 | typescript: '>=5' 1035 | peerDependenciesMeta: 1036 | typescript: 1037 | optional: true 1038 | 1039 | webpack-virtual-modules@0.6.2: 1040 | resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} 1041 | 1042 | wrap-ansi@7.0.0: 1043 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1044 | engines: {node: '>=10'} 1045 | 1046 | y18n@5.0.8: 1047 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1048 | engines: {node: '>=10'} 1049 | 1050 | yallist@3.1.1: 1051 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1052 | 1053 | yallist@4.0.0: 1054 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1055 | 1056 | yargs-parser@21.1.1: 1057 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1058 | engines: {node: '>=12'} 1059 | 1060 | yargs@17.7.2: 1061 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1062 | engines: {node: '>=12'} 1063 | 1064 | snapshots: 1065 | 1066 | '@alloc/quick-lru@5.2.0': {} 1067 | 1068 | '@ampproject/remapping@2.3.0': 1069 | dependencies: 1070 | '@jridgewell/gen-mapping': 0.3.8 1071 | '@jridgewell/trace-mapping': 0.3.25 1072 | 1073 | '@babel/code-frame@7.26.2': 1074 | dependencies: 1075 | '@babel/helper-validator-identifier': 7.25.9 1076 | js-tokens: 4.0.0 1077 | picocolors: 1.1.1 1078 | 1079 | '@babel/compat-data@7.26.8': {} 1080 | 1081 | '@babel/core@7.26.10': 1082 | dependencies: 1083 | '@ampproject/remapping': 2.3.0 1084 | '@babel/code-frame': 7.26.2 1085 | '@babel/generator': 7.27.0 1086 | '@babel/helper-compilation-targets': 7.27.0 1087 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 1088 | '@babel/helpers': 7.27.0 1089 | '@babel/parser': 7.27.0 1090 | '@babel/template': 7.27.0 1091 | '@babel/traverse': 7.27.0 1092 | '@babel/types': 7.27.0 1093 | convert-source-map: 2.0.0 1094 | debug: 4.4.0 1095 | gensync: 1.0.0-beta.2 1096 | json5: 2.2.3 1097 | semver: 6.3.1 1098 | transitivePeerDependencies: 1099 | - supports-color 1100 | 1101 | '@babel/generator@7.27.0': 1102 | dependencies: 1103 | '@babel/parser': 7.27.0 1104 | '@babel/types': 7.27.0 1105 | '@jridgewell/gen-mapping': 0.3.8 1106 | '@jridgewell/trace-mapping': 0.3.25 1107 | jsesc: 3.1.0 1108 | 1109 | '@babel/helper-compilation-targets@7.27.0': 1110 | dependencies: 1111 | '@babel/compat-data': 7.26.8 1112 | '@babel/helper-validator-option': 7.25.9 1113 | browserslist: 4.24.4 1114 | lru-cache: 5.1.1 1115 | semver: 6.3.1 1116 | 1117 | '@babel/helper-module-imports@7.25.9': 1118 | dependencies: 1119 | '@babel/traverse': 7.27.0 1120 | '@babel/types': 7.27.0 1121 | transitivePeerDependencies: 1122 | - supports-color 1123 | 1124 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': 1125 | dependencies: 1126 | '@babel/core': 7.26.10 1127 | '@babel/helper-module-imports': 7.25.9 1128 | '@babel/helper-validator-identifier': 7.25.9 1129 | '@babel/traverse': 7.27.0 1130 | transitivePeerDependencies: 1131 | - supports-color 1132 | 1133 | '@babel/helper-plugin-utils@7.26.5': {} 1134 | 1135 | '@babel/helper-string-parser@7.25.9': {} 1136 | 1137 | '@babel/helper-validator-identifier@7.25.9': {} 1138 | 1139 | '@babel/helper-validator-option@7.25.9': {} 1140 | 1141 | '@babel/helpers@7.27.0': 1142 | dependencies: 1143 | '@babel/template': 7.27.0 1144 | '@babel/types': 7.27.0 1145 | 1146 | '@babel/parser@7.27.0': 1147 | dependencies: 1148 | '@babel/types': 7.27.0 1149 | 1150 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': 1151 | dependencies: 1152 | '@babel/core': 7.26.10 1153 | '@babel/helper-plugin-utils': 7.26.5 1154 | 1155 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': 1156 | dependencies: 1157 | '@babel/core': 7.26.10 1158 | '@babel/helper-plugin-utils': 7.26.5 1159 | 1160 | '@babel/runtime@7.27.0': 1161 | dependencies: 1162 | regenerator-runtime: 0.14.1 1163 | 1164 | '@babel/template@7.27.0': 1165 | dependencies: 1166 | '@babel/code-frame': 7.26.2 1167 | '@babel/parser': 7.27.0 1168 | '@babel/types': 7.27.0 1169 | 1170 | '@babel/traverse@7.27.0': 1171 | dependencies: 1172 | '@babel/code-frame': 7.26.2 1173 | '@babel/generator': 7.27.0 1174 | '@babel/parser': 7.27.0 1175 | '@babel/template': 7.27.0 1176 | '@babel/types': 7.27.0 1177 | debug: 4.4.0 1178 | globals: 11.12.0 1179 | transitivePeerDependencies: 1180 | - supports-color 1181 | 1182 | '@babel/types@7.27.0': 1183 | dependencies: 1184 | '@babel/helper-string-parser': 7.25.9 1185 | '@babel/helper-validator-identifier': 7.25.9 1186 | 1187 | '@biomejs/biome@1.9.4': 1188 | optionalDependencies: 1189 | '@biomejs/cli-darwin-arm64': 1.9.4 1190 | '@biomejs/cli-darwin-x64': 1.9.4 1191 | '@biomejs/cli-linux-arm64': 1.9.4 1192 | '@biomejs/cli-linux-arm64-musl': 1.9.4 1193 | '@biomejs/cli-linux-x64': 1.9.4 1194 | '@biomejs/cli-linux-x64-musl': 1.9.4 1195 | '@biomejs/cli-win32-arm64': 1.9.4 1196 | '@biomejs/cli-win32-x64': 1.9.4 1197 | 1198 | '@biomejs/cli-darwin-arm64@1.9.4': 1199 | optional: true 1200 | 1201 | '@biomejs/cli-darwin-x64@1.9.4': 1202 | optional: true 1203 | 1204 | '@biomejs/cli-linux-arm64-musl@1.9.4': 1205 | optional: true 1206 | 1207 | '@biomejs/cli-linux-arm64@1.9.4': 1208 | optional: true 1209 | 1210 | '@biomejs/cli-linux-x64-musl@1.9.4': 1211 | optional: true 1212 | 1213 | '@biomejs/cli-linux-x64@1.9.4': 1214 | optional: true 1215 | 1216 | '@biomejs/cli-win32-arm64@1.9.4': 1217 | optional: true 1218 | 1219 | '@biomejs/cli-win32-x64@1.9.4': 1220 | optional: true 1221 | 1222 | '@emnapi/runtime@1.4.3': 1223 | dependencies: 1224 | tslib: 2.8.1 1225 | optional: true 1226 | 1227 | '@img/sharp-darwin-arm64@0.34.1': 1228 | optionalDependencies: 1229 | '@img/sharp-libvips-darwin-arm64': 1.1.0 1230 | optional: true 1231 | 1232 | '@img/sharp-darwin-x64@0.34.1': 1233 | optionalDependencies: 1234 | '@img/sharp-libvips-darwin-x64': 1.1.0 1235 | optional: true 1236 | 1237 | '@img/sharp-libvips-darwin-arm64@1.1.0': 1238 | optional: true 1239 | 1240 | '@img/sharp-libvips-darwin-x64@1.1.0': 1241 | optional: true 1242 | 1243 | '@img/sharp-libvips-linux-arm64@1.1.0': 1244 | optional: true 1245 | 1246 | '@img/sharp-libvips-linux-arm@1.1.0': 1247 | optional: true 1248 | 1249 | '@img/sharp-libvips-linux-ppc64@1.1.0': 1250 | optional: true 1251 | 1252 | '@img/sharp-libvips-linux-s390x@1.1.0': 1253 | optional: true 1254 | 1255 | '@img/sharp-libvips-linux-x64@1.1.0': 1256 | optional: true 1257 | 1258 | '@img/sharp-libvips-linuxmusl-arm64@1.1.0': 1259 | optional: true 1260 | 1261 | '@img/sharp-libvips-linuxmusl-x64@1.1.0': 1262 | optional: true 1263 | 1264 | '@img/sharp-linux-arm64@0.34.1': 1265 | optionalDependencies: 1266 | '@img/sharp-libvips-linux-arm64': 1.1.0 1267 | optional: true 1268 | 1269 | '@img/sharp-linux-arm@0.34.1': 1270 | optionalDependencies: 1271 | '@img/sharp-libvips-linux-arm': 1.1.0 1272 | optional: true 1273 | 1274 | '@img/sharp-linux-s390x@0.34.1': 1275 | optionalDependencies: 1276 | '@img/sharp-libvips-linux-s390x': 1.1.0 1277 | optional: true 1278 | 1279 | '@img/sharp-linux-x64@0.34.1': 1280 | optionalDependencies: 1281 | '@img/sharp-libvips-linux-x64': 1.1.0 1282 | optional: true 1283 | 1284 | '@img/sharp-linuxmusl-arm64@0.34.1': 1285 | optionalDependencies: 1286 | '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 1287 | optional: true 1288 | 1289 | '@img/sharp-linuxmusl-x64@0.34.1': 1290 | optionalDependencies: 1291 | '@img/sharp-libvips-linuxmusl-x64': 1.1.0 1292 | optional: true 1293 | 1294 | '@img/sharp-wasm32@0.34.1': 1295 | dependencies: 1296 | '@emnapi/runtime': 1.4.3 1297 | optional: true 1298 | 1299 | '@img/sharp-win32-ia32@0.34.1': 1300 | optional: true 1301 | 1302 | '@img/sharp-win32-x64@0.34.1': 1303 | optional: true 1304 | 1305 | '@jridgewell/gen-mapping@0.3.8': 1306 | dependencies: 1307 | '@jridgewell/set-array': 1.2.1 1308 | '@jridgewell/sourcemap-codec': 1.5.0 1309 | '@jridgewell/trace-mapping': 0.3.25 1310 | 1311 | '@jridgewell/resolve-uri@3.1.2': {} 1312 | 1313 | '@jridgewell/set-array@1.2.1': {} 1314 | 1315 | '@jridgewell/sourcemap-codec@1.5.0': {} 1316 | 1317 | '@jridgewell/trace-mapping@0.3.25': 1318 | dependencies: 1319 | '@jridgewell/resolve-uri': 3.1.2 1320 | '@jridgewell/sourcemap-codec': 1.5.0 1321 | 1322 | '@mh4gf/configs@0.4.5(@tsconfig/strictest@2.0.5)': 1323 | dependencies: 1324 | '@tsconfig/strictest': 2.0.5 1325 | 1326 | '@next/env@15.3.1': {} 1327 | 1328 | '@next/swc-darwin-arm64@15.3.1': 1329 | optional: true 1330 | 1331 | '@next/swc-darwin-x64@15.3.1': 1332 | optional: true 1333 | 1334 | '@next/swc-linux-arm64-gnu@15.3.1': 1335 | optional: true 1336 | 1337 | '@next/swc-linux-arm64-musl@15.3.1': 1338 | optional: true 1339 | 1340 | '@next/swc-linux-x64-gnu@15.3.1': 1341 | optional: true 1342 | 1343 | '@next/swc-linux-x64-musl@15.3.1': 1344 | optional: true 1345 | 1346 | '@next/swc-win32-arm64-msvc@15.3.1': 1347 | optional: true 1348 | 1349 | '@next/swc-win32-x64-msvc@15.3.1': 1350 | optional: true 1351 | 1352 | '@panva/hkdf@1.2.1': {} 1353 | 1354 | '@playwright/test@1.52.0': 1355 | dependencies: 1356 | playwright: 1.52.0 1357 | 1358 | '@swc/counter@0.1.3': {} 1359 | 1360 | '@swc/helpers@0.5.15': 1361 | dependencies: 1362 | tslib: 2.8.1 1363 | 1364 | '@tailwindcss/forms@0.5.10(tailwindcss@4.1.4)': 1365 | dependencies: 1366 | mini-svg-data-uri: 1.4.4 1367 | tailwindcss: 4.1.4 1368 | 1369 | '@tailwindcss/node@4.1.4': 1370 | dependencies: 1371 | enhanced-resolve: 5.18.1 1372 | jiti: 2.4.2 1373 | lightningcss: 1.29.2 1374 | tailwindcss: 4.1.4 1375 | 1376 | '@tailwindcss/oxide-android-arm64@4.1.4': 1377 | optional: true 1378 | 1379 | '@tailwindcss/oxide-darwin-arm64@4.1.4': 1380 | optional: true 1381 | 1382 | '@tailwindcss/oxide-darwin-x64@4.1.4': 1383 | optional: true 1384 | 1385 | '@tailwindcss/oxide-freebsd-x64@4.1.4': 1386 | optional: true 1387 | 1388 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': 1389 | optional: true 1390 | 1391 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': 1392 | optional: true 1393 | 1394 | '@tailwindcss/oxide-linux-arm64-musl@4.1.4': 1395 | optional: true 1396 | 1397 | '@tailwindcss/oxide-linux-x64-gnu@4.1.4': 1398 | optional: true 1399 | 1400 | '@tailwindcss/oxide-linux-x64-musl@4.1.4': 1401 | optional: true 1402 | 1403 | '@tailwindcss/oxide-wasm32-wasi@4.1.4': 1404 | optional: true 1405 | 1406 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': 1407 | optional: true 1408 | 1409 | '@tailwindcss/oxide-win32-x64-msvc@4.1.4': 1410 | optional: true 1411 | 1412 | '@tailwindcss/oxide@4.1.4': 1413 | optionalDependencies: 1414 | '@tailwindcss/oxide-android-arm64': 4.1.4 1415 | '@tailwindcss/oxide-darwin-arm64': 4.1.4 1416 | '@tailwindcss/oxide-darwin-x64': 4.1.4 1417 | '@tailwindcss/oxide-freebsd-x64': 4.1.4 1418 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 1419 | '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 1420 | '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 1421 | '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 1422 | '@tailwindcss/oxide-linux-x64-musl': 4.1.4 1423 | '@tailwindcss/oxide-wasm32-wasi': 4.1.4 1424 | '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 1425 | '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 1426 | 1427 | '@tailwindcss/postcss@4.1.4': 1428 | dependencies: 1429 | '@alloc/quick-lru': 5.2.0 1430 | '@tailwindcss/node': 4.1.4 1431 | '@tailwindcss/oxide': 4.1.4 1432 | postcss: 8.5.3 1433 | tailwindcss: 4.1.4 1434 | 1435 | '@tsconfig/strictest@2.0.5': {} 1436 | 1437 | '@types/node@22.15.0': 1438 | dependencies: 1439 | undici-types: 6.21.0 1440 | 1441 | '@types/react-dom@19.1.2(@types/react@19.1.2)': 1442 | dependencies: 1443 | '@types/react': 19.1.2 1444 | 1445 | '@types/react@19.1.2': 1446 | dependencies: 1447 | csstype: 3.1.3 1448 | 1449 | acorn@8.14.1: {} 1450 | 1451 | ahooks@3.8.4(react@19.1.0): 1452 | dependencies: 1453 | '@babel/runtime': 7.27.0 1454 | dayjs: 1.11.13 1455 | intersection-observer: 0.12.2 1456 | js-cookie: 3.0.5 1457 | lodash: 4.17.21 1458 | react: 19.1.0 1459 | react-fast-compare: 3.2.2 1460 | resize-observer-polyfill: 1.5.1 1461 | screenfull: 5.2.0 1462 | tslib: 2.8.1 1463 | 1464 | ansi-regex@5.0.1: {} 1465 | 1466 | ansi-styles@4.3.0: 1467 | dependencies: 1468 | color-convert: 2.0.1 1469 | 1470 | autoprefixer@10.4.21(postcss@8.5.3): 1471 | dependencies: 1472 | browserslist: 4.24.4 1473 | caniuse-lite: 1.0.30001715 1474 | fraction.js: 4.3.7 1475 | normalize-range: 0.1.2 1476 | picocolors: 1.1.1 1477 | postcss: 8.5.3 1478 | postcss-value-parser: 4.2.0 1479 | 1480 | browserslist@4.24.4: 1481 | dependencies: 1482 | caniuse-lite: 1.0.30001715 1483 | electron-to-chromium: 1.5.142 1484 | node-releases: 2.0.19 1485 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 1486 | 1487 | busboy@1.6.0: 1488 | dependencies: 1489 | streamsearch: 1.1.0 1490 | 1491 | caniuse-lite@1.0.30001715: {} 1492 | 1493 | chalk@4.1.2: 1494 | dependencies: 1495 | ansi-styles: 4.3.0 1496 | supports-color: 7.2.0 1497 | 1498 | client-only@0.0.1: {} 1499 | 1500 | cliui@8.0.1: 1501 | dependencies: 1502 | string-width: 4.2.3 1503 | strip-ansi: 6.0.1 1504 | wrap-ansi: 7.0.0 1505 | 1506 | clsx@2.1.1: {} 1507 | 1508 | color-convert@2.0.1: 1509 | dependencies: 1510 | color-name: 1.1.4 1511 | 1512 | color-name@1.1.4: {} 1513 | 1514 | color-string@1.9.1: 1515 | dependencies: 1516 | color-name: 1.1.4 1517 | simple-swizzle: 0.2.2 1518 | optional: true 1519 | 1520 | color@4.2.3: 1521 | dependencies: 1522 | color-convert: 2.0.1 1523 | color-string: 1.9.1 1524 | optional: true 1525 | 1526 | concurrently@9.1.2: 1527 | dependencies: 1528 | chalk: 4.1.2 1529 | lodash: 4.17.21 1530 | rxjs: 7.8.2 1531 | shell-quote: 1.8.2 1532 | supports-color: 8.1.1 1533 | tree-kill: 1.2.2 1534 | yargs: 17.7.2 1535 | 1536 | convert-source-map@2.0.0: {} 1537 | 1538 | cookie@0.7.2: {} 1539 | 1540 | csstype@3.1.3: {} 1541 | 1542 | dayjs@1.11.13: {} 1543 | 1544 | debug@4.4.0: 1545 | dependencies: 1546 | ms: 2.1.3 1547 | 1548 | detect-libc@2.0.4: {} 1549 | 1550 | electron-to-chromium@1.5.142: {} 1551 | 1552 | emoji-regex@8.0.0: {} 1553 | 1554 | enhanced-resolve@5.18.1: 1555 | dependencies: 1556 | graceful-fs: 4.2.11 1557 | tapable: 2.2.1 1558 | 1559 | escalade@3.2.0: {} 1560 | 1561 | fraction.js@4.3.7: {} 1562 | 1563 | fsevents@2.3.2: 1564 | optional: true 1565 | 1566 | gensync@1.0.0-beta.2: {} 1567 | 1568 | get-caller-file@2.0.5: {} 1569 | 1570 | github-buttons@2.29.1: {} 1571 | 1572 | globals@11.12.0: {} 1573 | 1574 | graceful-fs@4.2.11: {} 1575 | 1576 | has-flag@4.0.0: {} 1577 | 1578 | intersection-observer@0.12.2: {} 1579 | 1580 | is-arrayish@0.3.2: 1581 | optional: true 1582 | 1583 | is-fullwidth-code-point@3.0.0: {} 1584 | 1585 | jiti@2.4.2: {} 1586 | 1587 | jose@4.15.9: {} 1588 | 1589 | js-cookie@3.0.5: {} 1590 | 1591 | js-tokens@4.0.0: {} 1592 | 1593 | jsesc@3.1.0: {} 1594 | 1595 | json5@2.2.3: {} 1596 | 1597 | lightningcss-darwin-arm64@1.29.2: 1598 | optional: true 1599 | 1600 | lightningcss-darwin-x64@1.29.2: 1601 | optional: true 1602 | 1603 | lightningcss-freebsd-x64@1.29.2: 1604 | optional: true 1605 | 1606 | lightningcss-linux-arm-gnueabihf@1.29.2: 1607 | optional: true 1608 | 1609 | lightningcss-linux-arm64-gnu@1.29.2: 1610 | optional: true 1611 | 1612 | lightningcss-linux-arm64-musl@1.29.2: 1613 | optional: true 1614 | 1615 | lightningcss-linux-x64-gnu@1.29.2: 1616 | optional: true 1617 | 1618 | lightningcss-linux-x64-musl@1.29.2: 1619 | optional: true 1620 | 1621 | lightningcss-win32-arm64-msvc@1.29.2: 1622 | optional: true 1623 | 1624 | lightningcss-win32-x64-msvc@1.29.2: 1625 | optional: true 1626 | 1627 | lightningcss@1.29.2: 1628 | dependencies: 1629 | detect-libc: 2.0.4 1630 | optionalDependencies: 1631 | lightningcss-darwin-arm64: 1.29.2 1632 | lightningcss-darwin-x64: 1.29.2 1633 | lightningcss-freebsd-x64: 1.29.2 1634 | lightningcss-linux-arm-gnueabihf: 1.29.2 1635 | lightningcss-linux-arm64-gnu: 1.29.2 1636 | lightningcss-linux-arm64-musl: 1.29.2 1637 | lightningcss-linux-x64-gnu: 1.29.2 1638 | lightningcss-linux-x64-musl: 1.29.2 1639 | lightningcss-win32-arm64-msvc: 1.29.2 1640 | lightningcss-win32-x64-msvc: 1.29.2 1641 | 1642 | lodash@4.17.21: {} 1643 | 1644 | lru-cache@5.1.1: 1645 | dependencies: 1646 | yallist: 3.1.1 1647 | 1648 | lru-cache@6.0.0: 1649 | dependencies: 1650 | yallist: 4.0.0 1651 | 1652 | mini-svg-data-uri@1.4.4: {} 1653 | 1654 | ms@2.1.3: {} 1655 | 1656 | nanoid@3.3.11: {} 1657 | 1658 | next-auth@4.24.11(next@15.3.1(@babel/core@7.26.10)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 1659 | dependencies: 1660 | '@babel/runtime': 7.27.0 1661 | '@panva/hkdf': 1.2.1 1662 | cookie: 0.7.2 1663 | jose: 4.15.9 1664 | next: 15.3.1(@babel/core@7.26.10)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 1665 | oauth: 0.9.15 1666 | openid-client: 5.7.1 1667 | preact: 10.26.5 1668 | preact-render-to-string: 5.2.6(preact@10.26.5) 1669 | react: 19.1.0 1670 | react-dom: 19.1.0(react@19.1.0) 1671 | uuid: 8.3.2 1672 | 1673 | next@15.3.1(@babel/core@7.26.10)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 1674 | dependencies: 1675 | '@next/env': 15.3.1 1676 | '@swc/counter': 0.1.3 1677 | '@swc/helpers': 0.5.15 1678 | busboy: 1.6.0 1679 | caniuse-lite: 1.0.30001715 1680 | postcss: 8.4.31 1681 | react: 19.1.0 1682 | react-dom: 19.1.0(react@19.1.0) 1683 | styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.1.0) 1684 | optionalDependencies: 1685 | '@next/swc-darwin-arm64': 15.3.1 1686 | '@next/swc-darwin-x64': 15.3.1 1687 | '@next/swc-linux-arm64-gnu': 15.3.1 1688 | '@next/swc-linux-arm64-musl': 15.3.1 1689 | '@next/swc-linux-x64-gnu': 15.3.1 1690 | '@next/swc-linux-x64-musl': 15.3.1 1691 | '@next/swc-win32-arm64-msvc': 15.3.1 1692 | '@next/swc-win32-x64-msvc': 15.3.1 1693 | '@playwright/test': 1.52.0 1694 | sharp: 0.34.1 1695 | transitivePeerDependencies: 1696 | - '@babel/core' 1697 | - babel-plugin-macros 1698 | 1699 | node-releases@2.0.19: {} 1700 | 1701 | normalize-range@0.1.2: {} 1702 | 1703 | oauth@0.9.15: {} 1704 | 1705 | object-hash@2.2.0: {} 1706 | 1707 | oidc-token-hash@5.1.0: {} 1708 | 1709 | openid-client@5.7.1: 1710 | dependencies: 1711 | jose: 4.15.9 1712 | lru-cache: 6.0.0 1713 | object-hash: 2.2.0 1714 | oidc-token-hash: 5.1.0 1715 | 1716 | pattycake@0.0.2: 1717 | dependencies: 1718 | '@babel/core': 7.26.10 1719 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 1720 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) 1721 | '@babel/types': 7.27.0 1722 | unplugin: 1.16.1 1723 | transitivePeerDependencies: 1724 | - supports-color 1725 | 1726 | picocolors@1.1.1: {} 1727 | 1728 | playwright-core@1.52.0: {} 1729 | 1730 | playwright@1.52.0: 1731 | dependencies: 1732 | playwright-core: 1.52.0 1733 | optionalDependencies: 1734 | fsevents: 2.3.2 1735 | 1736 | postcss-value-parser@4.2.0: {} 1737 | 1738 | postcss@8.4.31: 1739 | dependencies: 1740 | nanoid: 3.3.11 1741 | picocolors: 1.1.1 1742 | source-map-js: 1.2.1 1743 | 1744 | postcss@8.5.3: 1745 | dependencies: 1746 | nanoid: 3.3.11 1747 | picocolors: 1.1.1 1748 | source-map-js: 1.2.1 1749 | 1750 | preact-render-to-string@5.2.6(preact@10.26.5): 1751 | dependencies: 1752 | preact: 10.26.5 1753 | pretty-format: 3.8.0 1754 | 1755 | preact@10.26.5: {} 1756 | 1757 | pretty-format@3.8.0: {} 1758 | 1759 | react-dom@19.1.0(react@19.1.0): 1760 | dependencies: 1761 | react: 19.1.0 1762 | scheduler: 0.26.0 1763 | 1764 | react-fast-compare@3.2.2: {} 1765 | 1766 | react-github-btn@1.4.0(react@19.1.0): 1767 | dependencies: 1768 | github-buttons: 2.29.1 1769 | react: 19.1.0 1770 | 1771 | react@19.1.0: {} 1772 | 1773 | regenerator-runtime@0.14.1: {} 1774 | 1775 | require-directory@2.1.1: {} 1776 | 1777 | resize-observer-polyfill@1.5.1: {} 1778 | 1779 | rxjs@7.8.2: 1780 | dependencies: 1781 | tslib: 2.8.1 1782 | 1783 | scheduler@0.26.0: {} 1784 | 1785 | screenfull@5.2.0: {} 1786 | 1787 | semver@6.3.1: {} 1788 | 1789 | semver@7.7.1: 1790 | optional: true 1791 | 1792 | server-only@0.0.1: {} 1793 | 1794 | sharp@0.34.1: 1795 | dependencies: 1796 | color: 4.2.3 1797 | detect-libc: 2.0.4 1798 | semver: 7.7.1 1799 | optionalDependencies: 1800 | '@img/sharp-darwin-arm64': 0.34.1 1801 | '@img/sharp-darwin-x64': 0.34.1 1802 | '@img/sharp-libvips-darwin-arm64': 1.1.0 1803 | '@img/sharp-libvips-darwin-x64': 1.1.0 1804 | '@img/sharp-libvips-linux-arm': 1.1.0 1805 | '@img/sharp-libvips-linux-arm64': 1.1.0 1806 | '@img/sharp-libvips-linux-ppc64': 1.1.0 1807 | '@img/sharp-libvips-linux-s390x': 1.1.0 1808 | '@img/sharp-libvips-linux-x64': 1.1.0 1809 | '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 1810 | '@img/sharp-libvips-linuxmusl-x64': 1.1.0 1811 | '@img/sharp-linux-arm': 0.34.1 1812 | '@img/sharp-linux-arm64': 0.34.1 1813 | '@img/sharp-linux-s390x': 0.34.1 1814 | '@img/sharp-linux-x64': 0.34.1 1815 | '@img/sharp-linuxmusl-arm64': 0.34.1 1816 | '@img/sharp-linuxmusl-x64': 0.34.1 1817 | '@img/sharp-wasm32': 0.34.1 1818 | '@img/sharp-win32-ia32': 0.34.1 1819 | '@img/sharp-win32-x64': 0.34.1 1820 | optional: true 1821 | 1822 | shell-quote@1.8.2: {} 1823 | 1824 | simple-swizzle@0.2.2: 1825 | dependencies: 1826 | is-arrayish: 0.3.2 1827 | optional: true 1828 | 1829 | source-map-js@1.2.1: {} 1830 | 1831 | streamsearch@1.1.0: {} 1832 | 1833 | string-width@4.2.3: 1834 | dependencies: 1835 | emoji-regex: 8.0.0 1836 | is-fullwidth-code-point: 3.0.0 1837 | strip-ansi: 6.0.1 1838 | 1839 | strip-ansi@6.0.1: 1840 | dependencies: 1841 | ansi-regex: 5.0.1 1842 | 1843 | styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.1.0): 1844 | dependencies: 1845 | client-only: 0.0.1 1846 | react: 19.1.0 1847 | optionalDependencies: 1848 | '@babel/core': 7.26.10 1849 | 1850 | supports-color@7.2.0: 1851 | dependencies: 1852 | has-flag: 4.0.0 1853 | 1854 | supports-color@8.1.1: 1855 | dependencies: 1856 | has-flag: 4.0.0 1857 | 1858 | tailwindcss@4.1.4: {} 1859 | 1860 | tapable@2.2.1: {} 1861 | 1862 | tree-kill@1.2.2: {} 1863 | 1864 | ts-pattern@5.7.0: {} 1865 | 1866 | tslib@2.8.1: {} 1867 | 1868 | typescript@5.8.3: {} 1869 | 1870 | undici-types@6.21.0: {} 1871 | 1872 | unplugin@1.16.1: 1873 | dependencies: 1874 | acorn: 8.14.1 1875 | webpack-virtual-modules: 0.6.2 1876 | 1877 | update-browserslist-db@1.1.3(browserslist@4.24.4): 1878 | dependencies: 1879 | browserslist: 4.24.4 1880 | escalade: 3.2.0 1881 | picocolors: 1.1.1 1882 | 1883 | uuid@8.3.2: {} 1884 | 1885 | valibot@1.0.0(typescript@5.8.3): 1886 | optionalDependencies: 1887 | typescript: 5.8.3 1888 | 1889 | webpack-virtual-modules@0.6.2: {} 1890 | 1891 | wrap-ansi@7.0.0: 1892 | dependencies: 1893 | ansi-styles: 4.3.0 1894 | string-width: 4.2.3 1895 | strip-ansi: 6.0.1 1896 | 1897 | y18n@5.0.8: {} 1898 | 1899 | yallist@3.1.1: {} 1900 | 1901 | yallist@4.0.0: {} 1902 | 1903 | yargs-parser@21.1.1: {} 1904 | 1905 | yargs@17.7.2: 1906 | dependencies: 1907 | cliui: 8.0.1 1908 | escalade: 3.2.0 1909 | get-caller-file: 2.0.5 1910 | require-directory: 2.1.1 1911 | string-width: 4.2.3 1912 | y18n: 5.0.8 1913 | yargs-parser: 21.1.1 1914 | -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /web/src/__vrt__/vrt.test.ts: -------------------------------------------------------------------------------- 1 | import { type Page, type TestInfo, expect, test } from '@playwright/test' 2 | 3 | interface TargetPage { 4 | name: string 5 | path: string 6 | } 7 | 8 | const screenshot = async (page: Page, _testInfo: TestInfo, targetPage: TargetPage) => { 9 | await page.goto(targetPage.path) 10 | await expect(page).toHaveScreenshot({ fullPage: true }) 11 | } 12 | 13 | const targetPages: TargetPage[] = [ 14 | { 15 | name: 'home', 16 | path: '/', 17 | }, 18 | ] 19 | 20 | for (const targetPage of targetPages) { 21 | test(targetPage.name, async ({ page }, testInfo) => { 22 | await screenshot(page, testInfo, targetPage) 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /web/src/app/_auth/getServerSession.ts: -------------------------------------------------------------------------------- 1 | import { getServerSession as nextAuthGetServerSession } from 'next-auth' 2 | 3 | import { authOptions } from './options' 4 | 5 | export function getServerSession() { 6 | return nextAuthGetServerSession(authOptions) 7 | } 8 | -------------------------------------------------------------------------------- /web/src/app/_auth/options.ts: -------------------------------------------------------------------------------- 1 | import type { AuthOptions } from 'next-auth' 2 | import GithubProvider from 'next-auth/providers/github' 3 | 4 | export const authOptions: AuthOptions = { 5 | providers: [ 6 | GithubProvider({ 7 | clientId: process.env.GITHUB_OAUTH_APP_CLIENT_ID ?? '', 8 | clientSecret: process.env.GITHUB_OAUTH_APP_CLIENT_SECRET ?? '', 9 | authorization: { 10 | params: { 11 | scope: 'repo', 12 | }, 13 | }, 14 | }), 15 | ], 16 | callbacks: { 17 | session({ session, token }) { 18 | session.user.accessToken = token.accessToken 19 | session.user.login = token.login 20 | 21 | return session 22 | }, 23 | jwt({ token, account, profile }) { 24 | if (account) { 25 | token.accessToken = account.access_token 26 | // @ts-expect-error ... GitHubProfile 27 | token.login = profile?.login 28 | } 29 | return token 30 | }, 31 | }, 32 | } 33 | -------------------------------------------------------------------------------- /web/src/app/_components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import type { FC, PropsWithChildren } from 'react' 2 | 3 | export const Alert: FC = ({ children }) => { 4 | return ( 5 |
6 |

{children}

7 |
8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /web/src/app/_components/Button.tsx: -------------------------------------------------------------------------------- 1 | import { clsx } from 'clsx' 2 | import type { ComponentProps, FC } from 'react' 3 | import { match } from 'ts-pattern' 4 | 5 | type Variant = 'primary' | 'secondary' 6 | 7 | type BaseProps = Omit, 'className'> & { 8 | variant?: Variant 9 | } 10 | 11 | const BaseButton: FC = ({ variant = 'primary', disabled, ...props }) => { 12 | const disabledColors = match(variant) 13 | .with('primary', () => 'bg-slate-400 text-white') 14 | .with('secondary', () => 'text-slate-400 border-2 border-slate-700 hover:bg-slate-200') 15 | .exhaustive() 16 | const colors = match(variant) 17 | .with('primary', () => 'bg-slate-700 hover:bg-slate-800 text-white') 18 | .with('secondary', () => 'text-slate-700 border-2 border-slate-700 hover:bg-slate-200') 19 | .exhaustive() 20 | 21 | return ( 22 |