diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..8438403af --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,148 @@ +name: Create Release + +on: + push: + branches: + - main + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get latest tag + id: get_latest_tag + run: | + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") + echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT + echo "Latest tag: $LATEST_TAG" + + - name: Check for changes + id: check_changes + run: | + LATEST_TAG=${{ steps.get_latest_tag.outputs.latest_tag }} + + if [ "$LATEST_TAG" = "v0.0.0" ]; then + COMMIT_COUNT=$(git rev-list --count HEAD) + else + COMMIT_COUNT=$(git rev-list --count $LATEST_TAG..HEAD) + fi + + if [ "$COMMIT_COUNT" -eq 0 ]; then + echo "has_changes=false" >> $GITHUB_OUTPUT + echo "No changes since last tag" + else + echo "has_changes=true" >> $GITHUB_OUTPUT + echo "Found $COMMIT_COUNT commits since last tag" + fi + + - name: Calculate next version + id: next_version + if: steps.check_changes.outputs.has_changes == 'true' + run: | + LATEST_TAG=${{ steps.get_latest_tag.outputs.latest_tag }} + + VERSION=${LATEST_TAG#v} + IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION" + + # 커밋 메시지 분석 (release, deploy, merge 커밋 제외) + COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"%s" 2>/dev/null | grep -viE "^(release|deploy|Merge)" || echo "") + + if echo "$COMMITS" | grep -qiE "^(feat|feature)(\(.+\))?!:|BREAKING CHANGE"; then + MAJOR=$((MAJOR + 1)) + MINOR=0 + PATCH=0 + elif echo "$COMMITS" | grep -qiE "^(feat|feature)(\(.+\))?:"; then + MINOR=$((MINOR + 1)) + PATCH=0 + else + PATCH=$((PATCH + 1)) + fi + + NEW_VERSION="v${MAJOR}.${MINOR}.${PATCH}" + + # 중복 태그 확인 + if git tag -l | grep -q "^${NEW_VERSION}$"; then + echo "Tag $NEW_VERSION already exists, skipping" + echo "skip_release=true" >> $GITHUB_OUTPUT + else + echo "skip_release=false" >> $GITHUB_OUTPUT + fi + + echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT + echo "New version: $NEW_VERSION" + + - name: Generate changelog + id: changelog + if: steps.check_changes.outputs.has_changes == 'true' && steps.next_version.outputs.skip_release != 'true' + run: | + LATEST_TAG=${{ steps.get_latest_tag.outputs.latest_tag }} + + if [ "$LATEST_TAG" = "v0.0.0" ]; then + COMMITS=$(git log --pretty=format:"- %s (%h)" --reverse) + else + COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s (%h)" --reverse) + fi + + FEATURES="" + FIXES="" + CHORES="" + OTHERS="" + + while IFS= read -r line; do + # release, deploy, merge 커밋 제외 + if echo "$line" | grep -qiE "^- (release|deploy)(\(.+\))?:|^- Merge "; then + continue + elif echo "$line" | grep -qiE "^- (feat|feature)(\(.+\))?:"; then + FEATURES="$FEATURES$line"$'\n' + elif echo "$line" | grep -qiE "^- (fix|hotfix)(\(.+\))?:"; then + FIXES="$FIXES$line"$'\n' + elif echo "$line" | grep -qiE "^- (chore|docs|style|refactor|perf|test|ci)(\(.+\))?:"; then + CHORES="$CHORES$line"$'\n' + else + OTHERS="$OTHERS$line"$'\n' + fi + done <<< "$COMMITS" + + CHANGELOG="" + + if [ -n "$FEATURES" ]; then + CHANGELOG="$CHANGELOG## Features"$'\n'"$FEATURES"$'\n' + fi + + if [ -n "$FIXES" ]; then + CHANGELOG="$CHANGELOG## Bug Fixes"$'\n'"$FIXES"$'\n' + fi + + if [ -n "$CHORES" ]; then + CHANGELOG="$CHANGELOG## Chores"$'\n'"$CHORES"$'\n' + fi + + if [ -n "$OTHERS" ]; then + CHANGELOG="$CHANGELOG## Other Changes"$'\n'"$OTHERS"$'\n' + fi + + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + echo "changelog<<$EOF" >> $GITHUB_OUTPUT + echo "$CHANGELOG" >> $GITHUB_OUTPUT + echo "$EOF" >> $GITHUB_OUTPUT + + - name: Create Release + if: steps.check_changes.outputs.has_changes == 'true' && steps.next_version.outputs.skip_release != 'true' + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.next_version.outputs.new_version }} + name: Release ${{ steps.next_version.outputs.new_version }} + body: ${{ steps.changelog.outputs.changelog }} + draft: false + prerelease: false + generate_release_notes: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/api/package.json b/api/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/api/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/api/sentry-discord.ts b/api/sentry-discord.ts new file mode 100644 index 000000000..81daf00bc --- /dev/null +++ b/api/sentry-discord.ts @@ -0,0 +1,173 @@ +import type { VercelRequest, VercelResponse } from "@vercel/node"; + +// Sentry Webhook Payload 타입 +interface SentryIssue { + title: string; + culprit: string; + shortId: string; + metadata: { + type?: string; + value?: string; + }; + web_url?: string; +} + +interface SentryEvent { + title: string; + environment?: string; + tags: Array<[string, string]>; + web_url?: string; +} + +interface SentryWebhookPayload { + action: string; + data: { + issue?: SentryIssue; + event?: SentryEvent; + }; + actor?: { + name?: string; + }; + triggered_rule?: string; +} + +// 타입 가드 +const hasIssue = (payload: SentryWebhookPayload): boolean => + payload.data.issue !== undefined; + +const hasEvent = (payload: SentryWebhookPayload): boolean => + payload.data.event !== undefined; + +// 필터링 - production 환경의 중요한 알림만 허용 +const ALLOWED_ACTIONS = new Set(["created", "regressed", "triggered"]); + +function shouldSkip(payload: SentryWebhookPayload): boolean { + if (!ALLOWED_ACTIONS.has(payload.action)) { + return true; + } + + if (hasEvent(payload)) { + return payload.data.event?.environment !== "production"; + } + + return false; +} + +// Discord Embed 생성 +function createIssueEmbed(issue: SentryIssue, action: string, actorName: string) { + return { + embeds: [ + { + title: `[${action.toUpperCase()}] ${issue.title}`, + description: issue.culprit || "No culprit information", + color: getColorByAction(action), + ...(issue.web_url && { url: issue.web_url }), + fields: [ + { name: "Issue", value: issue.shortId, inline: true }, + { name: "Type", value: issue.metadata.type ?? "Unknown", inline: true }, + { name: "Triggered by", value: actorName, inline: true }, + { name: "Message", value: truncate(issue.metadata.value ?? "N/A", 200), inline: false }, + ], + timestamp: new Date().toISOString(), + footer: { text: "Sentry" }, + }, + ], + }; +} + +function createEventEmbed(event: SentryEvent, triggeredRule: string) { + const tags = Object.fromEntries(event.tags); + + return { + embeds: [ + { + title: `[ERROR] ${event.title}`, + description: triggeredRule ? `Rule: ${triggeredRule}` : "Sentry Alert", + color: 0xff0000, + ...(event.web_url && { url: event.web_url }), + fields: [ + { name: "Environment", value: event.environment ?? "Unknown", inline: true }, + { name: "Browser", value: tags.browser ?? "-", inline: true }, + { name: "OS", value: tags.os ?? "-", inline: true }, + ], + timestamp: new Date().toISOString(), + footer: { text: "Sentry" }, + }, + ], + }; +} + +function createDiscordPayload(payload: SentryWebhookPayload) { + if (hasIssue(payload) && payload.data.issue) { + return createIssueEmbed(payload.data.issue, payload.action, payload.actor?.name ?? "System"); + } + + if (hasEvent(payload) && payload.data.event) { + return createEventEmbed(payload.data.event, payload.triggered_rule ?? ""); + } + + // fallback + return { + embeds: [ + { + title: "[ALERT] Sentry Notification", + description: "Unknown payload type", + color: 0x9e9e9e, + timestamp: new Date().toISOString(), + }, + ], + }; +} + +//색상 유틸리티 +function getColorByAction(action: string): number { + const map: Record = { + created: 0xff0000, + regressed: 0xff6f00, + resolved: 0x00c853, + }; + return map[action] ?? 0x9e9e9e; +} + +function truncate(value: string, max: number) { + return value.length > max ? value.slice(0, max - 3) + "..." : value; +} + +// 핸들러 - Vercel이 Sentry로 부터 HTTP 요청을 받으면 수행됨 +export default async function handler(req: VercelRequest, res: VercelResponse) { + if (req.method !== "POST") { + return res.status(405).end(); + } + + if (!req.headers["sentry-hook-signature"]) { + return res.status(401).json({ error: "Invalid source" }); + } + + const webhookUrl = process.env.DISCORD_WEBHOOK_URL; + if (!webhookUrl) { + return res.status(500).json({ error: "Webhook not configured" }); + } + + const payload = req.body as unknown as SentryWebhookPayload; + if (!payload?.data) { + return res.status(400).json({ error: "Invalid payload" }); + } + + if (shouldSkip(payload)) { + return res.status(200).json({ skipped: true }); + } + + try { + const discordPayload = createDiscordPayload(payload); + + await fetch(webhookUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(discordPayload), + }); + } catch (error) { + console.error("Discord webhook failed:", error); + } + + return res.status(200).json({ ok: true }); +} diff --git a/api/tsconfig.json b/api/tsconfig.json new file mode 100644 index 000000000..b87d8f22d --- /dev/null +++ b/api/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "noEmit": true + }, + "include": ["."] +} diff --git a/apps/web/src/apis/apply/schemas.ts b/apps/web/src/apis/apply/schemas.ts index 0f1296ec1..2a4d7c4c7 100644 --- a/apps/web/src/apis/apply/schemas.ts +++ b/apps/web/src/apis/apply/schemas.ts @@ -68,6 +68,7 @@ export const interestedDomainSchema = z.enum([ export const memberMeResponseSchema = z.object({ id: z.number(), name: z.string(), + phoneNumber: z.string(), careerDetails: careerDetailsSchema, region: regionSchema, experiencePeriod: experiencePeriodSchema, diff --git a/apps/web/src/components/common/footer/Footer.tsx b/apps/web/src/components/common/footer/Footer.tsx index f7ea66cc8..61c772cfb 100644 --- a/apps/web/src/components/common/footer/Footer.tsx +++ b/apps/web/src/components/common/footer/Footer.tsx @@ -10,7 +10,7 @@ function Footer() { diff --git a/apps/web/src/components/gnb/GlobalNavigationBar.tsx b/apps/web/src/components/gnb/GlobalNavigationBar.tsx index 81f366889..f0d0775b2 100644 --- a/apps/web/src/components/gnb/GlobalNavigationBar.tsx +++ b/apps/web/src/components/gnb/GlobalNavigationBar.tsx @@ -118,20 +118,36 @@ const GlobalNavigationBar = () => { 지원하기 -
- {variant === "solid" && ( - - 라이트 - 다크 - - )} -
- - + + {!isMobile && variant === "solid" && ( +
+ + 라이트 + 다크 + +
+ )} + + {isMobile && ( + <> +
+ + 지원하기 + + +
+ + + )} ); diff --git a/apps/web/src/components/main/sections/JoinSection.tsx b/apps/web/src/components/main/sections/JoinSection.tsx index 6e7012d31..bebc502bd 100644 --- a/apps/web/src/components/main/sections/JoinSection.tsx +++ b/apps/web/src/components/main/sections/JoinSection.tsx @@ -3,11 +3,13 @@ import { useNavigate } from "react-router-dom"; import joinTeamMeetingImage from "@/assets/images/join-team-meeting.png"; import { PATH } from "@/constants/path"; +import { trackApplyStart } from "@/utils/analytics"; const JoinSection = () => { const navigate = useNavigate(); const handleApplyClick = () => { + trackApplyStart("home_join_section"); void navigate(PATH.applyList as string); }; diff --git a/apps/web/src/constants/applyMessages.tsx b/apps/web/src/constants/applyMessages.tsx index 32072aa73..998156576 100644 --- a/apps/web/src/constants/applyMessages.tsx +++ b/apps/web/src/constants/applyMessages.tsx @@ -17,7 +17,14 @@ export const APPLY_MESSAGE = { uploadFile: "파일을 업로드했어요", resetPin: "PIN을 다시 설정했어요", loadProfile: "프로필을 불러왔어요.", - continueWriting: "본인 확인 완료, 이제 지원서를 이어서 작성할 수 있어요.", + continueWriting: { + title: "본인 확인 완료", + body: "이제 지원서를 이어서 작성할 수 있어요.", + }, + pinResetComplete: { + title: "PIN 재설정 완료", + body: "새로운 PIN을 입력해 본인 확인을 다시 진행해주세요.", + }, }, fail: { pin: "PIN이 올바르지 않아요. 다시 확인해주세요.", @@ -26,6 +33,15 @@ export const APPLY_MESSAGE = { uploadFile: "네트워크 점검 후 파일을 다시 첨부해주세요", loadProfile: "프로필을 불러오는데 실패했습니다. 다시 시도해주세요.", saveProfile: "프로필 저장에 실패했습니다. 다시 시도해주세요.", + loadDraft: { + title: "지원서 불러오기가 실패했습니다", + body: "데이터베이스 관련 혹은 일시적인 오류로 인해 지원서 내용을 불러올 수 없습니다. 불편을 드려 죄송하고, 재작성 부탁드립니다.", + }, + checkApplyStatus: { + title: "지원 상태 확인을 실패했습니다", + body: "일시적 오류일 수 있으니 다시 시도해주세요. 같은 문제가 계속 발생한다면, jectofficial@ject.kr로 문의해주세요.", + }, + changeJobFamily: "파트 변경에 실패했습니다. 다시 시도해주세요.", }, conflict: { email: "이미 지원서 제출을 완료한 이메일이에요", diff --git a/apps/web/src/constants/dialog.tsx b/apps/web/src/constants/dialog.tsx index 915805c3c..33c1a878e 100644 --- a/apps/web/src/constants/dialog.tsx +++ b/apps/web/src/constants/dialog.tsx @@ -19,11 +19,17 @@ interface DialogContent { export const DIALOG_CONTENT = { submitAnswer: { header: "지원서를 최종 제출합니다", - body: "제출한 뒤에는 지원서를 수정하거나 지원을 취소할 수 없어요.\n지원 관련 도움이 필요하시다면 jectofficial@ject.kr 로 문의해주세요.", + body: ( + <> + 제출한 뒤에는 지원서를 수정하거나 지원을 취소할 수 없어요. +
+ 지원 관련 도움이 필요하시다면 jectofficial@ject.kr 로 문의해주세요. + + ), primaryLabel: "지원서 제출하기", secondaryLabel: "취소", }, -} as const; +}; export const dialogTypes: Record = { example: { diff --git a/apps/web/src/features/apply/ApplyFunnel.tsx b/apps/web/src/features/apply/ApplyFunnel.tsx index 7ddf4242d..b035eec71 100644 --- a/apps/web/src/features/apply/ApplyFunnel.tsx +++ b/apps/web/src/features/apply/ApplyFunnel.tsx @@ -1,5 +1,6 @@ import { Dialog } from "@ject/jds"; import { useFunnel } from "@use-funnel/react-router-dom"; +import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { @@ -14,6 +15,7 @@ import type { JobFamily } from "@/apis/apply"; import { PATH } from "@/constants/path"; import { useNavigationBlock } from "@/hooks/useNavigationBlock"; import type { ApplyFunnelSteps } from "@/types/funnel"; +import { trackApplyStepView, trackApplyStepComplete, trackApplyComplete, APPLY_STEPS } from "@/utils/analytics"; interface ApplyFunnelProps { jobFamily: JobFamily; @@ -35,6 +37,11 @@ export function ApplyFunnel({ jobFamily }: ApplyFunnelProps) { }, }); + // 단계 진입 시 트래킹 (이탈 지점 파악용) + useEffect(() => { + trackApplyStepView(funnel.step, jobFamily); + }, [funnel.step, jobFamily]); + const handleBack = () => { const targetPath = `${PATH.applyGuide}/${jobFamily}`; void navigate(targetPath); @@ -47,6 +54,7 @@ export function ApplyFunnel({ jobFamily }: ApplyFunnelProps) { events: { onVerified: (payload: { email: string; authCode: string }, { context, history }) => { // 신규 회원: 인증 성공 → PIN 설정으로 + trackApplyStepComplete(APPLY_STEPS.EMAIL_VERIFICATION, context.jobFamily); void history.push("PIN설정", { ...context, ...payload, @@ -69,6 +77,7 @@ export function ApplyFunnel({ jobFamily }: ApplyFunnelProps) { context={context} onNext={() => { // 회원가입 성공 → 지원자 정보 입력으로 + trackApplyStepComplete(APPLY_STEPS.PIN_SETUP, context.jobFamily); void history.push("지원자정보", { ...context, }); @@ -81,6 +90,7 @@ export function ApplyFunnel({ jobFamily }: ApplyFunnelProps) { context={context} onNext={() => { // 프로필 저장 성공 → 지원서 작성으로 + trackApplyStepComplete(APPLY_STEPS.APPLICANT_INFO, context.jobFamily); void history.push("지원서작성", { ...context, }); @@ -93,6 +103,8 @@ export function ApplyFunnel({ jobFamily }: ApplyFunnelProps) { context={context} onNext={() => { // 제출 성공 → 완료 + trackApplyStepComplete(APPLY_STEPS.REGISTRATION, context.jobFamily); + trackApplyComplete(context.jobFamily); void history.push("완료", { ...context, }); diff --git a/apps/web/src/features/apply/ContinueWritingFunnel.tsx b/apps/web/src/features/apply/ContinueWritingFunnel.tsx index d7af78938..dc3c5e239 100644 --- a/apps/web/src/features/apply/ContinueWritingFunnel.tsx +++ b/apps/web/src/features/apply/ContinueWritingFunnel.tsx @@ -1,5 +1,6 @@ import { Dialog } from "@ject/jds"; import { useFunnel } from "@use-funnel/react-router-dom"; +import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { @@ -12,6 +13,7 @@ import { import type { JobFamily } from "@/apis/apply"; import { useNavigationBlock } from "@/hooks/useNavigationBlock"; import type { ContinueWritingFunnelSteps } from "@/types/funnel"; +import { trackApplyStepView, trackApplyStepComplete, trackApplyComplete, APPLY_STEPS } from "@/utils/analytics"; interface ContinueWritingFunnelProps { jobFamily: JobFamily; @@ -33,6 +35,11 @@ export function ContinueWritingFunnel({ jobFamily }: ContinueWritingFunnelProps) }, }); + // 단계 진입 시 트래킹 (이탈 지점 파악용) + useEffect(() => { + trackApplyStepView(funnel.step, jobFamily); + }, [funnel.step, jobFamily]); + const handleBackToFirst = () => { void navigate(-1); }; @@ -68,6 +75,7 @@ export function ContinueWritingFunnel({ jobFamily }: ContinueWritingFunnelProps) { + trackApplyStepComplete(APPLY_STEPS.APPLICANT_INFO, context.jobFamily); void history.push("지원서작성", { jobFamily: context.jobFamily, email: context.email, @@ -81,6 +89,8 @@ export function ContinueWritingFunnel({ jobFamily }: ContinueWritingFunnelProps) { + trackApplyStepComplete(APPLY_STEPS.REGISTRATION, context.jobFamily); + trackApplyComplete(context.jobFamily); void history.push("완료", { ...context }); }} onBack={handleBackToFirst} diff --git a/apps/web/src/features/apply/steps/IdentityVerificationStep.tsx b/apps/web/src/features/apply/steps/IdentityVerificationStep.tsx index 42bc33ae1..fa0869a00 100644 --- a/apps/web/src/features/apply/steps/IdentityVerificationStep.tsx +++ b/apps/web/src/features/apply/steps/IdentityVerificationStep.tsx @@ -82,7 +82,10 @@ export function IdentityVerificationStep({ context, dispatch }: IdentityVerifica } // 2. 토스트 표시 - toastController.basic("PIN 재설정 완료", "새로운 PIN을 입력해 본인 확인을 다시 진행해주세요."); + toastController.basic( + APPLY_MESSAGE.success.pinResetComplete.title, + APPLY_MESSAGE.success.pinResetComplete.body, + ); // 3. URL 파라미터 정리 setSearchParams( @@ -133,19 +136,28 @@ export function IdentityVerificationStep({ context, dispatch }: IdentityVerifica } // 같은 파트 또는 draft 없음 → 이어서 작성 - toastController.positive(APPLY_MESSAGE.success.continueWriting); + toastController.positive( + APPLY_MESSAGE.success.continueWriting.title, + APPLY_MESSAGE.success.continueWriting.body, + ); dispatch("goToApply", userEmail); }) .catch((error: unknown) => { // draft 조회 실패 시에도 이어서 작성 가능 (빈 폼으로 시작) handleError(error, "임시저장 데이터 조회 실패"); - toastController.positive(APPLY_MESSAGE.success.continueWriting); + toastController.destructive( + APPLY_MESSAGE.fail.loadDraft.title, + APPLY_MESSAGE.fail.loadDraft.body, + ); dispatch("goToApply", userEmail); }); }, onError: error => { handleError(error, "지원 상태 확인 실패"); - toastController.destructive("지원 상태 확인에 실패했습니다. 다시 시도해주세요."); + toastController.destructive( + APPLY_MESSAGE.fail.checkApplyStatus.title, + APPLY_MESSAGE.fail.checkApplyStatus.body, + ); }, }); }; @@ -157,8 +169,8 @@ export function IdentityVerificationStep({ context, dispatch }: IdentityVerifica onError: error => { handleError(error, "PIN 로그인 실패"); setPinError("pin", { - type: "manual", - message: "이메일 또는 PIN이 올바르지 않습니다.", + type: "apiError", + message: "이메일 혹은 PIN이 올바르지 않습니다. 다시 확인 후 입력해주세요.", }); }, }); @@ -197,7 +209,7 @@ export function IdentityVerificationStep({ context, dispatch }: IdentityVerifica // 3. 프로필 복원 (새로운 jobFamily로) await updateProfileAsync({ name: profile.name, - phoneNumber: "01012345678", // TODO: getMe 응답에 phoneNumber가 없어서 임시 처리 + phoneNumber: profile.phoneNumber, careerDetails: profile.careerDetails, region: profile.region, experiencePeriod: profile.experiencePeriod, @@ -206,11 +218,14 @@ export function IdentityVerificationStep({ context, dispatch }: IdentityVerifica }); // 4. 지원서 작성으로 이동 - toastController.positive(APPLY_MESSAGE.success.continueWriting); + toastController.positive( + APPLY_MESSAGE.success.continueWriting.title, + APPLY_MESSAGE.success.continueWriting.body, + ); dispatch("goToApply", verifiedEmail); } catch (error) { handleError(error, "파트 변경 실패"); - toastController.destructive("파트 변경에 실패했습니다. 다시 시도해주세요."); + toastController.destructive(APPLY_MESSAGE.fail.changeJobFamily); } finally { setIsChangingJobFamily(false); } diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 1159abffc..825e40dd3 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -11,6 +11,8 @@ import "@/styles/global.css"; import App from "./App"; +import { initializeUTMTracking, initializeMetaPixel, isAnalyticsEnabled } from "@/utils/analytics"; + // 루트 페이지에서 새로고침 시 항상 최상단으로 이동 if (window.location.pathname === "/") { window.history.scrollRestoration = "manual"; @@ -19,11 +21,19 @@ if (window.location.pathname === "/") { gsap.registerPlugin(ScrollTrigger, ScrollToPlugin); -amplitude.init(import.meta.env.VITE_AMPLITUDE_API_KEY, undefined, { - autocapture: { elementInteractions: true }, -}); +// Analytics 초기화 - 운영 환경 또는 VITE_ANALYTICS_DEBUG=true일 때 활성화 +if (isAnalyticsEnabled()) { + amplitude.init(import.meta.env.VITE_AMPLITUDE_API_KEY, undefined, { + autocapture: { elementInteractions: true }, + }); + amplitude.add(sessionReplayPlugin({ sampleRate: 1 })); + + // Meta Pixel + initializeMetaPixel(); -amplitude.add(sessionReplayPlugin({ sampleRate: 1 })); + // UTM 파라미터 추적 초기화 (인스타그램 등 유입 경로 추적) + initializeUTMTracking(); +} createRoot(document.getElementById("root")!).render( diff --git a/apps/web/src/pages/Activity.tsx b/apps/web/src/pages/Activity.tsx index 1c46468a9..907d42527 100644 --- a/apps/web/src/pages/Activity.tsx +++ b/apps/web/src/pages/Activity.tsx @@ -40,10 +40,10 @@ function Activity() { {jectalks.map(jectalk => ( { const { jectalks, isError, isPending } = useJectalksQuery(); return ( -
-
+
+
라이브 세션 @@ -48,16 +48,16 @@ const LiveSession = () => { ))} diff --git a/apps/web/src/pages/MiniStudy.tsx b/apps/web/src/pages/MiniStudy.tsx index 3ed958246..7f0217eaf 100644 --- a/apps/web/src/pages/MiniStudy.tsx +++ b/apps/web/src/pages/MiniStudy.tsx @@ -8,10 +8,12 @@ const MiniStudy = () => { const { miniStudies, isError, isPending } = useMiniStudiesQuery(); return ( -
-
-
- 미니 스터디 +
+
+
+ + 미니 스터디 + 활동 중 팀 프로젝트와 병행할 수 있는, 성장을 위한 스터디입니다. @@ -33,14 +35,14 @@ const MiniStudy = () => {
) : ( -
+
{miniStudies.map(study => ( } className='min-w-[26.25rem] cursor-pointer' - onClick={() => - window.open("https://forms.gle/NB3bBYYgBVN9cV4M7", "_blank", "noopener,noreferrer") - } + onClick={() => { + trackRecruitmentAlertClick(GENERATION + 1); + window.open("https://forms.gle/NB3bBYYgBVN9cV4M7", "_blank", "noopener,noreferrer"); + }} > {`${GENERATION + 1}기 모집 알림 신청`} diff --git a/apps/web/src/types/apis/jectalk.ts b/apps/web/src/types/apis/jectalk.ts index 2c37e157d..4912351fb 100644 --- a/apps/web/src/types/apis/jectalk.ts +++ b/apps/web/src/types/apis/jectalk.ts @@ -2,9 +2,11 @@ import type { Sort } from "./sort"; export interface Jectalk { id: number; - name: string; - youtubeUrl: string; - imageUrl: string; + title: string; + description: string; + contentUrl: string; + contentType: string; + thumbnailUrl: string; summary: string; } diff --git a/apps/web/src/types/apis/miniStudy.ts b/apps/web/src/types/apis/miniStudy.ts index 67f57ea2e..3294932bc 100644 --- a/apps/web/src/types/apis/miniStudy.ts +++ b/apps/web/src/types/apis/miniStudy.ts @@ -6,6 +6,7 @@ export interface MiniStudy { linkUrl: string; imageUrl: string; summary: string; + tag: string; } export interface MiniStudiesResponse { diff --git a/apps/web/src/utils/analytics.ts b/apps/web/src/utils/analytics.ts new file mode 100644 index 000000000..e2c3f2587 --- /dev/null +++ b/apps/web/src/utils/analytics.ts @@ -0,0 +1,299 @@ +import * as amplitude from "@amplitude/analytics-browser"; + +// GTM dataLayer 및 Meta Pixel 타입 정의 +interface FacebookPixelFunction { + (...args: unknown[]): void; + callMethod?: (...args: unknown[]) => void; + queue: unknown[][]; + loaded: boolean; + version: string; + push: (...args: unknown[]) => void; +} + +declare global { + interface Window { + dataLayer: Record[]; + fbq: FacebookPixelFunction; + _fbq?: FacebookPixelFunction; + } +} + +const PRODUCTION_HOSTNAME = "ject.kr"; +const META_PIXEL_ID = import.meta.env.VITE_META_PIXEL_ID || "896133299624681"; +const isAnalyticsDebugEnabled = import.meta.env.VITE_ANALYTICS_DEBUG === "true"; + +export function isProductionEnvironment(): boolean { + return window.location.hostname === PRODUCTION_HOSTNAME; +} + +export function isAnalyticsEnabled(): boolean { + return isProductionEnvironment() || isAnalyticsDebugEnabled; +} + +export const ANALYTICS_EVENTS = { + PAGE_VIEW: "page_view", + RECRUITMENT_ALERT_CLICK: "recruitment_alert_click", + + // 지원 관련 + APPLY_START: "apply_start", // 지원하러 가기 버튼 클릭 + APPLY_STEP_VIEW: "apply_step_view", // 지원 단계 진입 (이탈 지점 파악용) + APPLY_STEP_COMPLETE: "apply_step_complete", // 지원 단계 완료 + APPLY_COMPLETE: "apply_complete", // 지원 완료 +} as const; + +export const APPLY_STEPS = { + EMAIL_VERIFICATION: "이메일인증", + PIN_SETUP: "PIN설정", + APPLICANT_INFO: "지원자정보", + REGISTRATION: "지원서작성", + COMPLETE: "완료", +} as const; + +interface TrackEventOptions { + isGTMEnabled?: boolean; + isAmplitudeEnabled?: boolean; +} + +//GTM dataLayer에 이벤트 푸시 +function pushToDataLayer(eventName: string, eventParams: Record = {}) { + window.dataLayer = window.dataLayer || []; + window.dataLayer.push({ + event: eventName, + ...eventParams, + }); +} + +//Amplitude에 이벤트 전송 +function trackAmplitude(eventName: string, eventProperties: Record = {}) { + amplitude.track(eventName, eventProperties); +} + +/** + * 통합 이벤트 트래킹 함수 + * GTM(dataLayer)과 Amplitude 모두에 이벤트를 전송합니다. + * QA 환경에서는 VITE_ANALYTICS_DEBUG=true일 때만 활성화됩니다. + */ +export function trackEvent( + eventName: string, + eventParams: Record = {}, + options: TrackEventOptions = { isGTMEnabled: true, isAmplitudeEnabled: true }, +) { + // Analytics가 비활성화된 환경에서는 스킵 + if (!isAnalyticsEnabled()) { + return; + } + + const { isGTMEnabled = true, isAmplitudeEnabled = true } = options; + + // UTM 파라미터 추가 + const utmParams = getStoredUTMParams(); + const enrichedParams = { + ...eventParams, + ...utmParams, + }; + + if (isGTMEnabled) { + pushToDataLayer(eventName, enrichedParams); + } + + if (isAmplitudeEnabled) { + trackAmplitude(eventName, enrichedParams); + } +} + +/** + * 모집 알림 신청 버튼 클릭 트래킹 + */ +export function trackRecruitmentAlertClick(generation: number) { + trackEvent(ANALYTICS_EVENTS.RECRUITMENT_ALERT_CLICK, { + generation, + button_text: `${generation}기 모집 알림 신청`, + }); + + // Meta Pixel - Lead 이벤트 (잠재 고객 확보) + if (isAnalyticsEnabled() && typeof window.fbq === "function") { + window.fbq("track", "Lead", { + content_name: `${generation}기 모집 알림 신청`, + }); + } +} + +/** + * 지원하러 가기 버튼 클릭 트래킹 + */ +export function trackApplyStart(source: string = "home") { + trackEvent(ANALYTICS_EVENTS.APPLY_START, { + source, + }); +} + +/** + * 지원 단계 진입 트래킹 (이탈 지점 파악용) + */ +export function trackApplyStepView(step: string, jobFamily: string) { + trackEvent(ANALYTICS_EVENTS.APPLY_STEP_VIEW, { + step, + job_family: jobFamily, + }); +} + +/** + * 지원 단계 완료 트래킹 + */ +export function trackApplyStepComplete(step: string, jobFamily: string) { + trackEvent(ANALYTICS_EVENTS.APPLY_STEP_COMPLETE, { + step, + job_family: jobFamily, + }); +} + +/** + * 지원 완료 트래킹 (전환 이벤트) + */ +export function trackApplyComplete(jobFamily: string) { + trackEvent(ANALYTICS_EVENTS.APPLY_COMPLETE, { + job_family: jobFamily, + conversion: true, + }); + + // Meta Pixel - CompleteRegistration 이벤트 (지원 완료 = 전환) + if (isAnalyticsEnabled() && typeof window.fbq === "function") { + window.fbq("track", "CompleteRegistration", { + content_name: "지원 완료", + content_category: jobFamily, + }); + } +} + +// ===== UTM 파라미터 관련 ===== + +const UTM_STORAGE_KEY = "ject_utm_params"; +const UTM_PARAMS = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"] as const; + +interface UTMParams { + utm_source?: string; + utm_medium?: string; + utm_campaign?: string; + utm_term?: string; + utm_content?: string; + [key: string]: string | undefined; +} + +/** + * URL에서 UTM 파라미터 추출 + */ +export function extractUTMParams(): UTMParams { + const params = new URLSearchParams(window.location.search); + const utmParams: UTMParams = {}; + + UTM_PARAMS.forEach(param => { + const value = params.get(param); + if (value) { + utmParams[param] = value; + } + }); + + return utmParams; +} + +/** + * UTM 파라미터를 sessionStorage에 저장 + */ +export function storeUTMParams(params: UTMParams) { + if (Object.keys(params).length > 0) { + sessionStorage.setItem(UTM_STORAGE_KEY, JSON.stringify(params)); + } +} + +/** + * 저장된 UTM 파라미터 조회 + */ +export function getStoredUTMParams(): UTMParams { + const stored = sessionStorage.getItem(UTM_STORAGE_KEY); + if (stored) { + try { + return JSON.parse(stored) as UTMParams; + } catch { + return {}; + } + } + return {}; +} + +/** + * UTM 파라미터 초기화 (앱 시작 시 호출) + * URL에 UTM 파라미터가 있으면 저장하고 Amplitude 사용자 속성에 설정 + */ +export function initializeUTMTracking() { + const utmParams = extractUTMParams(); + + if (Object.keys(utmParams).length > 0) { + // sessionStorage에 저장 (항상) + storeUTMParams(utmParams); + + // Analytics 활성화 시 외부 서비스로 전송 + if (isAnalyticsEnabled()) { + // Amplitude 사용자 속성에 설정 + const identify = new amplitude.Identify(); + Object.entries(utmParams).forEach(([key, value]) => { + if (value) { + identify.set(key, value); + } + }); + amplitude.identify(identify); + + // GTM에도 전송 + pushToDataLayer("utm_captured", utmParams); + } + } +} + +// ===== Meta Pixel 관련 ===== + +/** + * Meta Pixel 초기화 (앱 시작 시 호출) + * 스크립트를 동적으로 로드하고 PageView 이벤트를 전송합니다. + */ +export function initializeMetaPixel() { + // Analytics가 비활성화된 환경에서는 초기화하지 않음 + if (!isAnalyticsEnabled()) { + return; + } + + // 이미 로드된 경우 스킵 + if (typeof window.fbq === "function") { + return; + } + + // fbq 함수 초기화 + const fbq = function (...args: unknown[]) { + if (fbq.callMethod) { + fbq.callMethod(...args); + } else { + fbq.queue.push(args); + } + } as FacebookPixelFunction; + + if (!window._fbq) { + window._fbq = fbq; + } + + fbq.push = fbq; + fbq.loaded = true; + fbq.version = "2.0"; + fbq.queue = []; + window.fbq = fbq; + + // 스크립트 동적 로드 + const script = document.createElement("script"); + script.async = true; + script.src = "https://connect.facebook.net/en_US/fbevents.js"; + const firstScript = document.getElementsByTagName("script")[0]; + if (firstScript?.parentNode) { + firstScript.parentNode.insertBefore(script, firstScript); + } + + // 초기화 및 PageView 이벤트 + window.fbq("init", META_PIXEL_ID); + window.fbq("track", "PageView"); +} diff --git a/package-lock.json b/package-lock.json index 09739720b..0fb7f6d59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "config/*" ], "devDependencies": { + "@vercel/node": "^5.5.16", "prettier": "^3.4.2", "turbo": "^2.5.5", "typescript": "~5.6.2" @@ -103,9 +104,9 @@ "license": "MIT" }, "node_modules/@amplitude/analytics-browser": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-2.33.0.tgz", - "integrity": "sha512-7qrTIImI53o9Pnhun68kCY0Hhc3AaBG59wlr5A/lvD5fp6D85KZntz3whxmLqbKMGoudKqzhjdGKp1VNSNv28g==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-2.33.1.tgz", + "integrity": "sha512-93wZjuAFJ7QdyptF82i1pezm5jKuBWITHI++XshDgpks1RstJvJ9n11Ak8MnE4L2BGQ93XDN2aVEHfmQkt0/Pw==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.35.0", @@ -113,7 +114,7 @@ "@amplitude/plugin-network-capture-browser": "1.7.3", "@amplitude/plugin-page-url-enrichment-browser": "0.5.9", "@amplitude/plugin-page-view-tracking-browser": "2.6.6", - "@amplitude/plugin-web-vitals-browser": "1.1.3", + "@amplitude/plugin-web-vitals-browser": "1.1.4", "tslib": "^2.4.1" } }, @@ -203,9 +204,9 @@ } }, "node_modules/@amplitude/plugin-session-replay-browser": { - "version": "1.25.4", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-session-replay-browser/-/plugin-session-replay-browser-1.25.4.tgz", - "integrity": "sha512-t3+YmLc1MsjvCjt5GxlhxHKpfIWu8nQ3n46lQArARCp4Okfxp9HaTBAPf2JBBWNv6hh2iTyQS4HBwkR04yKUmQ==", + "version": "1.25.5", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-session-replay-browser/-/plugin-session-replay-browser-1.25.5.tgz", + "integrity": "sha512-8OIpI1A7EMGn0ecVBUi3HfaCRZFtxjiR3R7ijXAbxOWr2BdkH+2miQeRiGJjc36HSzAv4VZnpjTutSz0ked71A==", "license": "MIT", "dependencies": { "@amplitude/analytics-client-common": "2.4.19", @@ -217,14 +218,14 @@ } }, "node_modules/@amplitude/plugin-web-vitals-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-web-vitals-browser/-/plugin-web-vitals-browser-1.1.3.tgz", - "integrity": "sha512-dXtlmgjWBaQGQtWKy8wluF7JJJZ8cHJuUIajsQ6TvQtJvjV5E6B/kX9lDmGiyaVyQw9YmRf51DjfUfJhfAAyTg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-web-vitals-browser/-/plugin-web-vitals-browser-1.1.4.tgz", + "integrity": "sha512-XQXI9OjTNSz2yi0lXw2VYMensDzzSkMCfvXNniTb1LgnHwBcQ1JWPcTqHLPFrvvNckeIdOT78vjs7yA+c1FyzA==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.35.0", "tslib": "^2.4.1", - "web-vitals": "5.0.1" + "web-vitals": "5.1.0" } }, "node_modules/@amplitude/rrdom": { @@ -747,6 +748,83 @@ } } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@edge-runtime/format": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", + "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/node-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", + "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/ponyfill": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", + "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/primitives": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", + "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/vm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", + "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/primitives": "4.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -1362,9 +1440,9 @@ } }, "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==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1553,6 +1631,16 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", @@ -1696,6 +1784,29 @@ "node": ">=12" } }, + "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/@isaacs/fs-minipass/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/@ject/eslint-config": { "resolved": "config/eslint", "link": true @@ -1982,6 +2093,65 @@ "tslib": "2" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@mdx-js/react": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", @@ -2007,6 +2177,44 @@ "dev": true, "license": "MIT" }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3584,7 +3792,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.54.0", @@ -3597,7 +3806,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.54.0", @@ -3623,7 +3833,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.54.0", @@ -3636,7 +3847,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.54.0", @@ -3649,7 +3861,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.54.0", @@ -3662,7 +3875,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.54.0", @@ -3675,7 +3889,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.54.0", @@ -3688,7 +3903,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.54.0", @@ -3701,7 +3917,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.54.0", @@ -3714,7 +3931,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.54.0", @@ -3727,7 +3945,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.54.0", @@ -3740,7 +3959,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.54.0", @@ -3753,7 +3973,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.54.0", @@ -3766,7 +3987,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.53.2", @@ -3792,7 +4014,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.54.0", @@ -3805,7 +4028,8 @@ "optional": true, "os": [ "openharmony" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.54.0", @@ -3818,7 +4042,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.54.0", @@ -3831,7 +4056,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.54.0", @@ -3844,7 +4070,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.54.0", @@ -3857,7 +4084,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rtsao/scc": { "version": "1.1.0", @@ -4190,9 +4418,9 @@ "license": "MIT" }, "node_modules/@storybook/addon-a11y": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.1.10.tgz", - "integrity": "sha512-lXVFywCSdA39uCR0KEFz3F6WTjzoqSi5gQYtWrFelzaUiMH46uBLHPYaKlpUuNbTL/o9ctrhX1YNzegujrXSoQ==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.1.11.tgz", + "integrity": "sha512-3sr6HmcDgW1+TQAV9QtWBE3HlGyfFXVZY3RECTNLNH6fRC+rYQCItisvQIVxQpyftLSQ8EAMN9JQzs495MjWNg==", "dev": true, "license": "MIT", "dependencies": { @@ -4204,20 +4432,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.1.10" + "storybook": "^10.1.11" } }, "node_modules/@storybook/addon-docs": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.10.tgz", - "integrity": "sha512-PSJVtawnGNrEkeLJQn9TTdeqrtDij8onvmnFtfkDaFG5IaUdQaLX9ibJ4gfxYakq+BEtlCcYiWErNJcqDrDluQ==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.11.tgz", + "integrity": "sha512-Jwm291Fhim2eVcZIVlkG1B2skb0ZI9oru6nqMbJxceQZlvZmcIa4oxvS1oaMTKw2DJnCv97gLm57P/YvRZ8eUg==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "10.1.10", + "@storybook/csf-plugin": "10.1.11", "@storybook/icons": "^2.0.0", - "@storybook/react-dom-shim": "10.1.10", + "@storybook/react-dom-shim": "10.1.11", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -4227,13 +4455,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.1.10" + "storybook": "^10.1.11" } }, "node_modules/@storybook/addon-onboarding": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.1.10.tgz", - "integrity": "sha512-CtfoHqgdm63NsGyYBcr1UhJV6m213ckU3aKTYJRS+3NLkx18BIME9biJwiTiRK4Pm4jbc69V21JzLumFcaiJbw==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.1.11.tgz", + "integrity": "sha512-DNJv0IDl5XBrY+PPgwnMXLyp3omPkMOS6xe8ejG3csT71B6+3VueL6m7Qivh6739SnAV0QBU5SQlpMA0gQUcSA==", "dev": true, "license": "MIT", "funding": { @@ -4241,13 +4469,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.1.10" + "storybook": "^10.1.11" } }, "node_modules/@storybook/addon-vitest": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-10.1.10.tgz", - "integrity": "sha512-dh5ZesgvZY619nkweo9fbORQQSU0hIFQnqlcnU1DrGXumt9SzVHF3/2Lxe+HGHLHK6Sk8jZp/16BjZ/zxSG61Q==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-10.1.11.tgz", + "integrity": "sha512-YbZzeKO3v+Xr97/malT4DZIATkVZT5EHNYx3xzEfPVuk19dDETAVYXO+tzcqCQHsgdKQHkmd56vv8nN3J3/kvw==", "dev": true, "license": "MIT", "dependencies": { @@ -4262,7 +4490,7 @@ "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", - "storybook": "^10.1.10", + "storybook": "^10.1.11", "vitest": "^3.0.0 || ^4.0.0" }, "peerDependenciesMeta": { @@ -4281,13 +4509,13 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.10.tgz", - "integrity": "sha512-6m6zOyDhHLynv3lvkH70s1YoIkIFPhbpGsBKvHchRLrZLe8hCPeafIFLfZRPoD4yIPwBS6rWbjMsSvBMFlR+ag==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.11.tgz", + "integrity": "sha512-MMD09Ap7FyzDfWG961pkIMv/w684XXe1bBEi+wCEpHxvrgAd3j3A9w/Rqp9Am2uRDPCEdi1QgSzS3SGW3aGThQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.1.10", + "@storybook/csf-plugin": "10.1.11", "@vitest/mocker": "3.2.4", "ts-dedent": "^2.0.0" }, @@ -4296,14 +4524,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.1.10", + "storybook": "^10.1.11", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.10.tgz", - "integrity": "sha512-2dri4TRU8uuj/skmx/ZBw+GnnXf8EZHiMDMeijVRdBQtYFWPeoYzNIrGRpNfbuGpnDP0dcxrqti/TsedoxwFkA==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.11.tgz", + "integrity": "sha512-Ant0NhgqHKzQsseeVTSetZCuDHHs0W2HRkHt51Kg/sUl0T/sDtfVA+fWZT8nGzGZqYSFkxqYPWjauPmIhPtaRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4316,7 +4544,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.1.10", + "storybook": "^10.1.11", "vite": "*", "webpack": "*" }, @@ -4377,14 +4605,14 @@ } }, "node_modules/@storybook/react": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.10.tgz", - "integrity": "sha512-9Rpr8/wX0p5/EaulrxpqrjKjhGaA/Ab9HgxzTqs2Shz0gvMAQHoiRnTEp7RCCkP49ruFYnIp0yGRSovu03LakQ==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.11.tgz", + "integrity": "sha512-rmMGmEwBaM2YpB8oDk2moM0MNjNMqtwyoPPZxjyruY9WVhYca8EDPGKEdRzUlb4qZJsTgLi7VU4eqg6LD/mL3Q==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.1.10", + "@storybook/react-dom-shim": "10.1.11", "react-docgen": "^8.0.2" }, "funding": { @@ -4394,7 +4622,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.1.10", + "storybook": "^10.1.11", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -4404,9 +4632,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.10.tgz", - "integrity": "sha512-9pmUbEr1MeMHg9TG0c2jVUfHWr2AA86vqZGphY/nT6mbe/rGyWtBl5EnFLrz6WpI8mo3h+Kxs6p2oiuIYieRtw==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.11.tgz", + "integrity": "sha512-o8WPhRlZbORUWG9lAgDgJP0pi905VHJUFJr1Kp8980gHqtlemtnzjPxKy5vFwj6glNhAlK8SS8OOYzWP7hloTQ==", "dev": true, "license": "MIT", "funding": { @@ -4416,20 +4644,20 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.1.10" + "storybook": "^10.1.11" } }, "node_modules/@storybook/react-vite": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.10.tgz", - "integrity": "sha512-6kE4/88YuwO07P0DR6caKNDNvCB/VnpimPmj4Jv6qmqrBgnoOOiXHIKyHJD+EjNyrbbwv4ygG01RVEajpjQaDA==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.11.tgz", + "integrity": "sha512-qh1BCD25nIoiDfqwha+qBkl7pcG4WuzM+c8tsE63YEm8AFIbNKg5K8lVUoclF+4CpFz7IwBpWe61YUTDfp+91w==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.6.3", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.1.10", - "@storybook/react": "10.1.10", + "@storybook/builder-vite": "10.1.11", + "@storybook/react": "10.1.11", "empathic": "^2.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.0", @@ -4443,7 +4671,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.1.10", + "storybook": "^10.1.11", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, @@ -5069,9 +5297,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.90.14", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.14.tgz", - "integrity": "sha512-/6di2yNI+YxpVrH9Ig74Q+puKnkCE+D0LGyagJEGndJHJc6ahkcc/UqirHKy8zCYE/N9KLggxcQvzYCsUBWgdw==", + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz", + "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==", "license": "MIT", "funding": { "type": "github", @@ -5090,12 +5318,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.90.14", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.14.tgz", - "integrity": "sha512-JAMuULej09hrZ14W9+mxoRZ44rR2BuZfCd6oKTQVNfynQxCN3muH3jh3W46gqZNw5ZqY0ZVaS43Imb3dMr6tgw==", + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz", + "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.90.14" + "@tanstack/query-core": "5.90.16" }, "funding": { "type": "github", @@ -5195,6 +5423,71 @@ "node": ">=10.13.0" } }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -5371,20 +5664,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", - "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", + "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/type-utils": "8.50.1", - "@typescript-eslint/utils": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/type-utils": "8.51.0", + "@typescript-eslint/utils": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5394,7 +5687,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.50.1", + "@typescript-eslint/parser": "^8.51.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -5410,16 +5703,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", - "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", + "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4" }, "engines": { @@ -5435,14 +5728,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", - "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", + "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.50.1", - "@typescript-eslint/types": "^8.50.1", + "@typescript-eslint/tsconfig-utils": "^8.51.0", + "@typescript-eslint/types": "^8.51.0", "debug": "^4.3.4" }, "engines": { @@ -5457,14 +5750,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", - "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", + "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1" + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5475,9 +5768,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", - "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", + "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", "dev": true, "license": "MIT", "engines": { @@ -5492,17 +5785,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", - "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", + "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0", "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5517,9 +5810,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", - "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", + "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", "dev": true, "license": "MIT", "engines": { @@ -5531,21 +5824,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", - "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", + "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.50.1", - "@typescript-eslint/tsconfig-utils": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/project-service": "8.51.0", + "@typescript-eslint/tsconfig-utils": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5572,16 +5865,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", - "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", + "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1" + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5596,13 +5889,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", - "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", + "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/types": "8.51.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5648,14 +5941,289 @@ "react-router-dom": ">=6" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "node_modules/@vercel/build-utils": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.2.4.tgz", + "integrity": "sha512-12m+8Z+wsxJUoWZ+JQqRk8v1O0ioJhGYWz+yStW8abuzfNz75QW2rRcbn0hSHuF8c7b3D2papmMdh94kSSYQEw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/error-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/nft": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.1.1.tgz", + "integrity": "sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/nft/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@vercel/nft/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/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/@vercel/nft/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vercel/nft/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vercel/node": { + "version": "5.5.16", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.5.16.tgz", + "integrity": "sha512-OoW99cfID3u45wbfOsy/Aibw55s0pzl4b4Wy77Weh690JhECFaiKeHL1GW6w8WGrObhKYDtsvYyoRJeKCm8kqA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "16.18.11", + "@vercel/build-utils": "13.2.4", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "1.1.1", + "@vercel/static-config": "3.1.2", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.14.47", + "etag": "1.8.1", + "mime-types": "2.1.35", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "ts-node": "10.9.1", + "typescript": "4.9.5", + "typescript5": "npm:typescript@5.9.3", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "16.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", + "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "node_modules/@vercel/node/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@vercel/node/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.1.2.tgz", + "integrity": "sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", @@ -6028,6 +6596,16 @@ "node": ">=18.0.0" } }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -6040,6 +6618,16 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -6050,6 +6638,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -6137,6 +6738,13 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6364,6 +6972,23 @@ "node": ">= 0.4" } }, + "node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true, + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6504,6 +7129,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -6704,9 +7339,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "funding": [ { "type": "opencollective", @@ -6765,9 +7400,9 @@ "license": "MIT" }, "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { @@ -6790,6 +7425,16 @@ "url": "https://paulmillr.com/funding/" } }, + "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/chromatic": { "version": "11.29.0", "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.29.0.tgz", @@ -6830,6 +7475,13 @@ "node": ">=8" } }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true, + "license": "MIT" + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -6839,6 +7491,13 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "dev": true, + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6918,6 +7577,16 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -6964,6 +7633,13 @@ } } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7319,6 +7995,16 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -7443,31 +8129,85 @@ "dev": true, "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "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==", + "node_modules/edge-runtime": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", + "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/format": "2.2.1", + "@edge-runtime/ponyfill": "2.4.2", + "@edge-runtime/vm": "3.2.0", + "async-listen": "3.0.1", + "mri": "1.2.0", + "picocolors": "1.0.0", + "pretty-ms": "7.0.1", + "signal-exit": "4.0.2", + "time-span": "4.0.0" + }, + "bin": { + "edge-runtime": "dist/cli/index.js" + }, + "engines": { + "node": ">=16" + } }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "node_modules/edge-runtime/node_modules/async-listen": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", + "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 14" } }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", + "node_modules/edge-runtime/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/edge-runtime/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "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/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "license": "MIT", @@ -7695,6 +8435,346 @@ "@esbuild/win32-x64": "0.27.2" } }, + "node_modules/esbuild-android-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", + "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", + "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", + "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", + "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", + "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", + "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", + "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", + "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", + "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", + "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", + "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", + "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", + "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", + "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", + "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", + "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", + "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", + "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", + "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", + "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -7960,9 +9040,9 @@ } }, "node_modules/eslint-plugin-storybook": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.1.10.tgz", - "integrity": "sha512-ITr6Aq3buR/DuDATkq1BafUVJLybyo676fY+tj9Zjd1Ak+UXBAMQcQ++tiBVVHm1RqADwM3b1o6bnWHK2fPPKw==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.1.11.tgz", + "integrity": "sha512-mbq2r2kK5+AcLl0XDJ3to91JOgzCbHOqj+J3n+FRw6drk+M1boRqMShSoMMm0HdzXPLmlr7iur+qJ5ZuhH6ayQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7970,7 +9050,7 @@ }, "peerDependencies": { "eslint": ">=8", - "storybook": "^10.1.10" + "storybook": "^10.1.11" } }, "node_modules/eslint-scope": { @@ -8086,9 +9166,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8137,6 +9217,16 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8164,6 +9254,36 @@ "dev": true, "license": "MIT" }, + "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==", + "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.8" + }, + "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", @@ -8178,6 +9298,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -8214,6 +9344,13 @@ "node": ">=16.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT" + }, "node_modules/filesize": { "version": "10.1.6", "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", @@ -9558,6 +10695,17 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, + "node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10079,6 +11227,13 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10114,6 +11269,16 @@ "url": "https://github.com/sponsors/streamich" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -10207,12 +11372,48 @@ "node": ">=8" } }, + "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/minizlib/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/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mlly": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", @@ -10226,6 +11427,16 @@ "ufo": "^1.6.1" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -10310,12 +11521,40 @@ } } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10605,6 +11844,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/patch-package": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", @@ -10705,6 +11954,13 @@ "util": "^0.10.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10761,6 +12017,21 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp-updated": { + "name": "path-to-regexp", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "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", @@ -11138,6 +12409,22 @@ "license": "MIT", "peer": true }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11174,9 +12461,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11189,6 +12476,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dev": true, + "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/radix-ui": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", @@ -11360,9 +12668,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.69.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.69.0.tgz", - "integrity": "sha512-yt6ZGME9f4F6WHwevrvpAjh42HMvocuSnSIHUGycBqXIJdhqGSPQzTpGF+1NLREk/58IdPxEMfPcFCjlMhclGw==", + "version": "7.70.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.70.0.tgz", + "integrity": "sha512-COOMajS4FI3Wuwrs3GPpi/Jeef/5W1DRR84Yl5/ShlT3dKVFUfoGiEZ/QE6Uw8P4T2/CLJdcTVYKvWBMQTEpvw==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -11610,6 +12918,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -11639,6 +12957,17 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.54.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", @@ -11691,7 +13020,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/run-applescript": { "version": "7.1.0", @@ -11706,6 +13036,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "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/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -12066,9 +13420,9 @@ } }, "node_modules/storybook": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.10.tgz", - "integrity": "sha512-oK0t0jEogiKKfv5Z1ao4Of99+xWw1TMUGuGRYDQS4kp2yyBsJQEgu7NI7OLYsCDI6gzt5p3RPtl1lqdeVLUi8A==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.11.tgz", + "integrity": "sha512-pKP5jXJYM4OjvNklGuHKO53wOCAwfx79KvZyOWHoi9zXUH5WVMFUe/ZfWyxXG/GTcj0maRgHGUjq/0I43r0dDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12504,6 +13858,43 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "dev": true, + "license": "BlueOak-1.0.0", + "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/tar/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/tar/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/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -12544,6 +13935,22 @@ "tslib": "^2" } }, + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -12674,9 +14081,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -12703,6 +14110,68 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -13005,16 +14474,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", - "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.51.0.tgz", + "integrity": "sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.50.1", - "@typescript-eslint/parser": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1" + "@typescript-eslint/eslint-plugin": "8.51.0", + "@typescript-eslint/parser": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13028,6 +14497,21 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/typescript5": { + "name": "typescript", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/ua-parser-js": { "version": "1.0.41", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", @@ -13080,6 +14564,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -13296,6 +14793,13 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -14047,9 +15551,9 @@ } }, "node_modules/web-vitals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.0.1.tgz", - "integrity": "sha512-BsULPWaCKAAtNntUz0aJq1cu1wyuWmDzf4N6vYNMbYA6zzQAf2pzCYbyClf+Ui2MI54bt225AwugXIfL1W+Syg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz", + "integrity": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==", "license": "Apache-2.0" }, "node_modules/webidl-conversions": { @@ -14366,6 +15870,16 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -14474,8 +15988,6 @@ }, "packages/jds/node_modules/@storybook/addon-docs": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.0.tgz", - "integrity": "sha512-CVW2pc9iAfz1A6/L9S0z8XqKUON+u92xaOTC1x6d3WS8cyOT94nD7tfohT8aWydwvvmtwRHZJzl0aWnKUNgSJw==", "dev": true, "license": "MIT", "dependencies": { @@ -14497,8 +16009,6 @@ }, "packages/jds/node_modules/@storybook/addon-docs/node_modules/@storybook/csf-plugin": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.0.tgz", - "integrity": "sha512-oApFTBUlHusihoejKmlunprNA2BDpEBmBBx+PcCMzTpUbEiZNI95ZeGrlBuuEepF5dIpAIPAQQD09FibmkQlBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14532,8 +16042,6 @@ }, "packages/jds/node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.0.tgz", - "integrity": "sha512-Zb86jWk3ch33lkCmsgqqqsv5q0ePk1wg2wAurM0BMQUAKTLPebdBvwC8esBsti8fp2ZGv0eNbJDGg3qzWYr/Uw==", "dev": true, "license": "MIT", "funding": { @@ -14548,8 +16056,6 @@ }, "packages/jds/node_modules/@storybook/react-vite": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.1.0.tgz", - "integrity": "sha512-gFLTU92QQ69saFzQGeIRysQ1G2o3DSWWuG07JRj03493H9USKhvzHo88utKZ2BQP/H93UgcEwy6Ms5psIS3AUA==", "dev": true, "license": "MIT", "dependencies": { @@ -14576,8 +16082,6 @@ }, "packages/jds/node_modules/@storybook/react-vite/node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz", - "integrity": "sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==", "dev": true, "license": "MIT", "dependencies": { @@ -14597,8 +16101,6 @@ }, "packages/jds/node_modules/@storybook/react-vite/node_modules/@storybook/builder-vite": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.0.tgz", - "integrity": "sha512-5vVg8kZozI4Lg2voHdimm34jlEf6MrP9QzXS795dVA/KIR9BCVUzVw+yQBT9jRDWnp6Q4XbzqfILih/TVeh7iA==", "dev": true, "license": "MIT", "dependencies": { @@ -14617,8 +16119,6 @@ }, "packages/jds/node_modules/@storybook/react-vite/node_modules/@storybook/builder-vite/node_modules/@storybook/csf-plugin": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.0.tgz", - "integrity": "sha512-oApFTBUlHusihoejKmlunprNA2BDpEBmBBx+PcCMzTpUbEiZNI95ZeGrlBuuEepF5dIpAIPAQQD09FibmkQlBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14652,8 +16152,6 @@ }, "packages/jds/node_modules/@storybook/react-vite/node_modules/@storybook/react": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.1.0.tgz", - "integrity": "sha512-6Uc3SmUhUlAcNjl8PevnLplZC7HtcE2tz6NEPJWYt3KAb7D11bDZB7BD7jGOU9edE+vRXsTHUUPmaxJpWQ+5nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14679,8 +16177,6 @@ }, "packages/jds/node_modules/@storybook/react-vite/node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.0.tgz", - "integrity": "sha512-Zb86jWk3ch33lkCmsgqqqsv5q0ePk1wg2wAurM0BMQUAKTLPebdBvwC8esBsti8fp2ZGv0eNbJDGg3qzWYr/Uw==", "dev": true, "license": "MIT", "funding": { @@ -14695,8 +16191,6 @@ }, "packages/jds/node_modules/eslint-plugin-storybook": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.1.0.tgz", - "integrity": "sha512-5s/Hi9bKl6xSChPOlHwLrQDW+Nj6OXnl9nnQmbKtEQoCdEuSDbAEDc8zZ9NLAyD2rljE2N6Jhe9iP9+2lm43tQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14709,8 +16203,6 @@ }, "packages/jds/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -14730,8 +16222,6 @@ }, "packages/jds/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": { @@ -14740,8 +16230,6 @@ }, "packages/jds/node_modules/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -14753,8 +16241,6 @@ }, "packages/jds/node_modules/storybook": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.0.tgz", - "integrity": "sha512-RCTybwtyQaKRoU1Z8rWGv5h6ZN3+HelSM0WMMWKBsKgXZkpQ00vro1kd/tWILawxNiU2YS9Zo+4On5hx2Rm+8w==", "dev": true, "license": "MIT", "dependencies": { @@ -14788,8 +16274,6 @@ }, "packages/jds/node_modules/unplugin": { "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, "license": "MIT", "dependencies": { @@ -14804,8 +16288,6 @@ }, "packages/jds/node_modules/webpack-virtual-modules": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" } diff --git a/package.json b/package.json index 5771d9374..950273c02 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "type-check": "turbo type-check" }, "devDependencies": { + "@vercel/node": "^5.5.16", "prettier": "^3.4.2", "turbo": "^2.5.5", "typescript": "~5.6.2" diff --git a/packages/jds/src/components/Button/BlockButton/blockButton.styles.ts b/packages/jds/src/components/Button/BlockButton/blockButton.styles.ts index ee9087a79..2ea7d1992 100644 --- a/packages/jds/src/components/Button/BlockButton/blockButton.styles.ts +++ b/packages/jds/src/components/Button/BlockButton/blockButton.styles.ts @@ -701,6 +701,7 @@ export const StyledBlockButton = styled("button", { cursor: $disabled ? "not-allowed" : "pointer", userSelect: "none", fontFamily: "inherit", + whiteSpace: "nowrap", ...modeStyles, }; }); diff --git a/packages/jds/src/components/Button/LabelButton/labelButton.styles.ts b/packages/jds/src/components/Button/LabelButton/labelButton.styles.ts index e7a371de1..6b5a55191 100644 --- a/packages/jds/src/components/Button/LabelButton/labelButton.styles.ts +++ b/packages/jds/src/components/Button/LabelButton/labelButton.styles.ts @@ -529,6 +529,7 @@ export const StyledLabelButton = styled("button", { cursor: $disabled ? "not-allowed" : "pointer", userSelect: "none", fontFamily: "inherit", + whiteSpace: "nowrap", ...modeStyles, }; }); diff --git a/packages/jds/src/components/Card/Card.types.ts b/packages/jds/src/components/Card/Card.types.ts index 7d9a7bc4d..c7a1f2810 100644 --- a/packages/jds/src/components/Card/Card.types.ts +++ b/packages/jds/src/components/Card/Card.types.ts @@ -55,11 +55,6 @@ export interface CardMetaItemProps extends ComponentPropsWithoutRef<"span"> { children: ReactNode; } -export interface CardMetaNudgeItemProps extends ComponentPropsWithoutRef<"span"> { - label?: string; - children: ReactNode; -} - interface BasePresetOwnProps { layout?: CardLayout; isDisabled?: boolean; diff --git a/packages/jds/src/components/Card/compound/compound.styles.ts b/packages/jds/src/components/Card/compound/compound.styles.ts index 040713583..efb05b282 100644 --- a/packages/jds/src/components/Card/compound/compound.styles.ts +++ b/packages/jds/src/components/Card/compound/compound.styles.ts @@ -30,8 +30,6 @@ const isPlateCard = (variant: CardVariant): boolean => variant === "plate"; const isVerticalLayout = (layout: CardLayout): boolean => layout === "vertical"; -const isHorizontalLayout = (layout: CardLayout): boolean => layout === "horizontal"; - const getLayoutStyles = (layout: CardLayout): CSSObject => ({ flexDirection: isVerticalLayout(layout) ? "column" : "row", }); @@ -96,7 +94,12 @@ const getGap = ( cardStyle?: CardStyle, ): string | number => { if (isPlateCard(variant)) return 0; - if (isVerticalLayout(layout)) return 0; + + if (isVerticalLayout(layout)) { + return cardStyle === "empty" + ? theme.scheme.semantic.spacing[16] + : theme.scheme.semantic.spacing[20]; + } return cardStyle === "empty" ? theme.scheme.semantic.spacing[24] @@ -334,28 +337,6 @@ export const StyledCardMetaItem = styled("span", { whiteSpace: "nowrap", })); -export const StyledCardMetaNudgeItem = styled.span(({ theme }) => ({ - display: "flex", - padding: 0, - alignItems: "center", - gap: theme.scheme.semantic.spacing[4], - marginLeft: "auto", - flexShrink: 0, - opacity: 0, - color: "var(--card-caption-color)", - transition: `opacity ${theme.environment.semantic.duration[150]} ${theme.environment.semantic.motion.fluent}, transform ${theme.environment.semantic.duration[150]} ${theme.environment.semantic.motion.fluent}`, - - '[data-interactive="true"]:hover &': { - opacity: 1, - transform: "translateX(2px)", - }, -})); - -export const StyledCardMetaNudgeItemLabel = styled.span(({ theme }) => ({ - ...theme.textStyle["semantic-textStyle-label-sm-normal"], - color: "var(--card-caption-color)", -})); - export const StyledCardTitle = styled("h3", { shouldForwardProp: prop => isPropValid(prop) && !prop.startsWith("$"), })(({ theme }) => ({ @@ -475,6 +456,7 @@ export const StyledHorizontalPostContentWrap = styled("div", { })(({ theme }) => ({ display: "flex", flexDirection: "column", + flex: "1 0 0", gap: theme.scheme.semantic.spacing[8], })); @@ -484,4 +466,5 @@ export const StyledHorizontalCardPostLayout = styled("div", { display: "flex", gap: theme.scheme.semantic.spacing[24], alignItems: "flex-start", + alignSelf: "stretch", })); diff --git a/packages/jds/src/components/Card/compound/index.ts b/packages/jds/src/components/Card/compound/index.ts index a60ce72e9..a08400fc8 100644 --- a/packages/jds/src/components/Card/compound/index.ts +++ b/packages/jds/src/components/Card/compound/index.ts @@ -7,5 +7,4 @@ export { CardLabel } from "./CardLabel"; export { CardBody } from "./CardBody"; export { CardMeta } from "./CardMeta"; export { CardMetaItem } from "./CardMetaItem"; -export { CardMetaNudgeItem } from "./CardMetaNudgeItem"; export { CardOverlay } from "./CardOverlay"; diff --git a/packages/jds/src/components/Card/index.ts b/packages/jds/src/components/Card/index.ts index 3c4446c3d..630f88b90 100644 --- a/packages/jds/src/components/Card/index.ts +++ b/packages/jds/src/components/Card/index.ts @@ -8,7 +8,6 @@ import { CardBody, CardMeta, CardMetaItem, - CardMetaNudgeItem, CardOverlay, } from "./compound"; import { PlateWithTitle, PlateWithLabel, PlateCompact, Post } from "./presets"; @@ -23,7 +22,6 @@ export const Card = { Body: CardBody, Meta: CardMeta, MetaItem: CardMetaItem, - MetaNudgeItem: CardMetaNudgeItem, Overlay: CardOverlay, Preset: { @@ -46,7 +44,6 @@ export type { CardBodyProps, CardMetaProps, CardMetaItemProps, - CardMetaNudgeItemProps, } from "./Card.types"; export type { diff --git a/packages/jds/src/components/Card/presets/Post.tsx b/packages/jds/src/components/Card/presets/Post.tsx index 46fca70e7..10d75d39c 100644 --- a/packages/jds/src/components/Card/presets/Post.tsx +++ b/packages/jds/src/components/Card/presets/Post.tsx @@ -1,7 +1,6 @@ import { forwardRef, type ReactNode } from "react"; import { pxToRem } from "utils"; -import { Icon } from "../../Icon"; import type { PostPresetProps } from "../Card.types"; import { CardRoot, @@ -11,7 +10,6 @@ import { CardBody, CardMeta, CardMetaItem, - CardMetaNudgeItem, } from "../compound"; import { StyledCardOverlay, @@ -35,16 +33,13 @@ const PostContent = ({ layout, image, title, body, author, date }: PostContentPr if (layout === "vertical") { return ( <> + {image && } - {image && } {title} {body} {author} {date} - - - @@ -58,6 +53,10 @@ const PostContent = ({ layout, image, title, body, author, date }: PostContentPr {title} {body} + + {author} + {date} + {image && ( )} - - {author} - {date} - - - - ); diff --git a/packages/jds/src/components/Input/shared/field.styles.ts b/packages/jds/src/components/Input/shared/field.styles.ts index 4e7d684c4..480d7916c 100644 --- a/packages/jds/src/components/Input/shared/field.styles.ts +++ b/packages/jds/src/components/Input/shared/field.styles.ts @@ -145,5 +145,8 @@ export const StyledInputRow = styled("div", { alignItems: "center", alignSelf: "stretch", width: "100%", + "& > button": { + flexShrink: 0, + }, }; });